import sys import cv2 import numpy as np from pydantic import BaseModel import ultralytics from ultralytics.yolo.engine.results import Results # Define keypoint class GetKeypoint(BaseModel): NOSE: int = 0 LEFT_EYE: int = 1 RIGHT_EYE: int = 2 LEFT_EAR: int = 3 RIGHT_EAR: int = 4 LEFT_SHOULDER: int = 5 RIGHT_SHOULDER: int = 6 LEFT_ELBOW: int = 7 RIGHT_ELBOW: int = 8 LEFT_WRIST: int = 9 RIGHT_WRIST: int = 10 LEFT_HIP: int = 11 RIGHT_HIP: int = 12 LEFT_KNEE: int = 13 RIGHT_KNEE: int = 14 LEFT_ANKLE: int = 15 RIGHT_ANKLE: int = 16 class DetectKeypoint: def __init__(self, yolov8_model='yolov8m-pose'): self.yolov8_model = yolov8_model self.get_keypoint = GetKeypoint() self.__load_model() def __load_model(self): if not self.yolov8_model.split('-')[-1] == 'pose': sys.exit('Model not yolov8 pose') self.model = ultralytics.YOLO(model=self.yolov8_model) # extract function keypoint def extract_keypoint(self, keypoint: np.ndarray) -> list: # nose nose_x, nose_y = keypoint[self.get_keypoint.NOSE] # eye left_eye_x, left_eye_y = keypoint[self.get_keypoint.LEFT_EYE] right_eye_x, right_eye_y = keypoint[self.get_keypoint.RIGHT_EYE] # ear left_ear_x, left_ear_y = keypoint[self.get_keypoint.LEFT_EAR] right_ear_x, right_ear_y = keypoint[self.get_keypoint.RIGHT_EAR] # shoulder left_shoulder_x, left_shoulder_y = keypoint[self.get_keypoint.LEFT_SHOULDER] right_shoulder_x, right_shoulder_y = keypoint[self.get_keypoint.RIGHT_SHOULDER] # elbow left_elbow_x, left_elbow_y = keypoint[self.get_keypoint.LEFT_ELBOW] right_elbow_x, right_elbow_y = keypoint[self.get_keypoint.RIGHT_ELBOW] # wrist left_wrist_x, left_wrist_y = keypoint[self.get_keypoint.LEFT_WRIST] right_wrist_x, right_wrist_y = keypoint[self.get_keypoint.RIGHT_WRIST] # hip left_hip_x, left_hip_y = keypoint[self.get_keypoint.LEFT_HIP] right_hip_x, right_hip_y = keypoint[self.get_keypoint.RIGHT_HIP] # knee left_knee_x, left_knee_y = keypoint[self.get_keypoint.LEFT_KNEE] right_knee_x, right_knee_y = keypoint[self.get_keypoint.RIGHT_KNEE] # ankle left_ankle_x, left_ankle_y = keypoint[self.get_keypoint.LEFT_ANKLE] right_ankle_x, right_ankle_y = keypoint[self.get_keypoint.RIGHT_ANKLE] return [ nose_x, nose_y, left_eye_x, left_eye_y, right_eye_x, right_eye_y, left_ear_x, left_ear_y, right_ear_x, right_ear_y, left_shoulder_x, left_shoulder_y, right_shoulder_x, right_shoulder_y, left_elbow_x, left_elbow_y, right_elbow_x, right_elbow_y, left_wrist_x, left_wrist_y, right_wrist_x, right_wrist_y, left_hip_x, left_hip_y, right_hip_x, right_hip_y, left_knee_x, left_knee_y, right_knee_x, right_knee_y, left_ankle_x, left_ankle_y,right_ankle_x, right_ankle_y ] def get_xy_keypoint(self, results: Results) -> list: result_keypoint = results.keypoints.xyn.cpu().numpy()[0] keypoint_data = self.extract_keypoint(result_keypoint) return keypoint_data def __call__(self, image: np.array) -> Results: results = self.model.predict(image, save=False)[0] return results