| from ultralytics import YOLO | |
| from CPR_Module.Common.logging_config import cpr_logger | |
| class PoseEstimator: | |
| """Human pose estimation using YOLO""" | |
| def __init__(self, min_confidence, model_path="CPR_Module/Common/yolo11n-pose.pt"): | |
| self.model = YOLO(model_path).to("cuda") | |
| if next(self.model.model.parameters()).is_cuda: | |
| cpr_logger.info("YOLO model loaded on CUDA (GPU).") | |
| else: | |
| cpr_logger.warning("YOLO model is not on CUDA. Check your setup.") | |
| 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, iou=0.2) | |
| 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 |