| import numpy as np |
| from ultralytics import YOLO |
|
|
| from CPR_Module.Common.logging_config import cpr_logger |
|
|
| class PoseEstimator: |
| """Human pose estimation using YOLO""" |
| |
| def __init__(self, model_path="CPR_Module/Common/yolo11n-pose.pt", min_confidence=0.2): |
| self.model = YOLO(model_path) |
| self.min_confidence = min_confidence |
|
|
| def detect_poses(self, frame): |
| """Detect human poses in a frame""" |
| try: |
| results = self.model(frame, verbose=False, conf=self.min_confidence, show=False) |
| if not results or len(results[0].keypoints.xy) == 0: |
| return None |
| return results[0] |
| except Exception as e: |
| cpr_logger.error(f"Pose detection error: {e}") |
| return None |
|
|
| def get_keypoints(self, results, person_idx=0): |
| """Extract keypoints for a detected person""" |
| try: |
| if not results or len(results.keypoints.xy) <= person_idx: |
| return None |
| return results.keypoints.xy[person_idx].cpu().numpy() |
| except Exception as e: |
| cpr_logger.error(f"Keypoint extraction error: {e}") |
| return None |
|
|
| def draw_keypoints(self, frame, results): |
| """Draw detected keypoints on frame""" |
| try: |
| return results.plot() |
| except Exception as e: |
| cpr_logger.error(f"Keypoint drawing error: {e}") |
| return frame |