Spaces:
Runtime error
Runtime error
| 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 | |