Spaces:
Runtime error
Runtime error
| import numpy as np | |
| from sklearn import metrics | |
| class AngleMAE: | |
| """Class for evaluation metrics AngleMAE which computes mean absolute | |
| error between set of joints angle of reference and test video keypoints | |
| Parameters: | |
| ref_keypoits : A numpy array [n, 1, 17, 3] containing keypoints | |
| representing poses in reference video | |
| test_keypoits : A numpy array [n, 1, 17, 3] containing keypoints | |
| representing poses in test video | |
| """ | |
| def __init__(self): | |
| self.joints_array = np.array( | |
| [[11, 5, 7], | |
| [12, 6, 8], | |
| [6, 8, 10], | |
| [5, 7, 9], | |
| [11, 12, 14], | |
| [12, 11, 13], | |
| [12, 14, 16], | |
| [11, 13, 15], | |
| [5, 11, 13]] | |
| ) | |
| self.joints_dict = { | |
| 'left_shoulder_joint': ['left_hip', 'left_shoulder', 'left_elbow'], | |
| 'right_shoulder_joint': ['right_hip', 'right_shoulder', | |
| 'right_elbow'], | |
| 'right_elbow_joint': ['right_shoulder', 'right_elbow', | |
| 'right_wrist'], | |
| 'left_elbow_joint': ['left_shoulder', 'left_elbow', 'left_wrist'], | |
| 'right_hip_joint': ['left_hip', 'right_hip', 'right_knee'], | |
| 'left_hip_joint': ['right_hip', 'left_hip', 'left_knee'], | |
| 'right_knee_joint': ['right_hip', 'right_knee', 'right_ankle'], | |
| 'left_knee_joint': ['left_hip', 'left_knee', 'left_ankle'], | |
| 'waist_joint': ['left_shoulder', 'left_hip', 'left_knee'] | |
| } | |
| self.angle_mae_joints_weightage_array = ([1, 1, 1, 1, 1, 1, 1, 1, 1]) | |
| def mean_absolute_error(self, ref_keypoints, test_keypoints) -> object: | |
| """ | |
| Calcultes MAE of given joints via index between reference and test | |
| frames | |
| Args: | |
| ref_keypoints: ndarray of shape (17,2) containing reference frame | |
| x, y coordinates | |
| test_keypoints: ndarray of shape (17,2) containing test frame x, | |
| y coordinates | |
| Returns: | |
| MAE: A float value representing angle based MAE | |
| """ | |
| ref_angle = self.calculate_angle_atan2(ref_keypoints) | |
| test_angle = self.calculate_angle_atan2(test_keypoints) | |
| diff = np.abs(ref_angle - test_angle) | |
| mae = np.sum(diff * self.angle_mae_joints_weightage_array) / sum( | |
| self.angle_mae_joints_weightage_array | |
| ) | |
| return mae | |
| def calculate_angle_atan2(self, kpts): | |
| """ | |
| Calcultes angle of given joint | |
| Args: | |
| kpts: ndarray of shape (17,2) containing x, y coordinates | |
| Returns: | |
| angle: A float value representing angle in degrees | |
| """ | |
| a = np.zeros((9, 2)) | |
| b = np.zeros((9, 2)) | |
| c = np.zeros((9, 2)) | |
| for i, j in enumerate(self.joints_array): | |
| a[i] = kpts[j[0]] | |
| b[i] = kpts[j[1]] | |
| c[i] = kpts[j[2]] | |
| vector_b_a = b - a | |
| vector_b_c = b - c | |
| angle_0 = np.arctan2( | |
| vector_b_a[:, 1], | |
| vector_b_a[:, 0] | |
| ) | |
| angle_2 = np.arctan2( | |
| vector_b_c[:, 1], | |
| vector_b_c[:, 0] | |
| ) | |
| determinant = vector_b_a[:, 0] * vector_b_c[:, 1] - vector_b_a[:, | |
| 1] * vector_b_c[:, | |
| 0] | |
| angle_diff = (angle_0 - angle_2) | |
| angle = np.degrees(angle_diff) | |
| joints_angle_array = angle * (determinant < 0) + (360 + angle) * ( | |
| determinant > 0) | |
| return joints_angle_array % 360 | |
| class MAE: | |
| def __init__(self): | |
| pass | |
| def mean_absolute_error(ref_keypoints, test_keypoints): | |
| """ | |
| Calcultes MAE of given keypoints between reference and test frames | |
| Args: | |
| ref_keypoints: ndarray of shape (17,2) containing reference frame | |
| x, y coordinates | |
| test_keypoints: ndarray of shape (17,2) containing test frame x, | |
| y coordinates | |
| Returns: | |
| MAE: A float value representing MAE | |
| """ | |
| return metrics.mean_absolute_error( | |
| ref_keypoints.flatten(), | |
| test_keypoints.flatten(), | |
| ) | |