Spaces:
Running
on
Zero
Running
on
Zero
| # Multi-HMR | |
| # Copyright (c) 2024-present NAVER Corp. | |
| # CC BY-NC-SA 4.0 license | |
| import numpy as np | |
| import torch.nn.functional as F | |
| import torch | |
| import roma | |
| from smplx.joint_names import JOINT_NAMES | |
| def rot6d_to_rotmat(x): | |
| """ | |
| 6D rotation representation to 3x3 rotation matrix. | |
| Args: | |
| x: (B,6) Batch of 6-D rotation representations. | |
| Returns: | |
| torch.Tensor: Batch of corresponding rotation matrices with shape (B,3,3). | |
| """ | |
| x = x.reshape(-1,2,3).permute(0, 2, 1).contiguous() | |
| y = roma.special_gramschmidt(x) | |
| return y | |
| def get_smplx_joint_names(*args, **kwargs): | |
| return JOINT_NAMES[:127] | |
| COCO17_JOINTS_NAME = { | |
| 0: 'nose', 1: 'left_eye', 2: 'right_eye', | |
| 3: 'left_ear', 4: 'right_ear', 5:'left_shoulder', | |
| 6: 'right_shoulder', 7: 'left_elbow', 8: 'right_elbow', | |
| 9: 'left_wrist', 10: 'right_wrist', 11: 'left_hip', | |
| 12: 'right_hip', 13: 'left_knee', 14: 'right_knee', | |
| 15: 'left_ankle', 16: 'right_ankle' | |
| } | |
| OPENPOSE25_JOINTS_NAME = { | |
| 0: 'nose', 1: 'neck', 2: 'right_shoulder', 3: 'right_elbow', 4: 'right_wrist', | |
| 5: 'left_shoulder', 6: 'left_elbow', 7: 'left_wrist', 8: 'MidHip', 9: 'right_hip', 10: 'right_knee', 11: 'right_ankle', 12: 'left_hip', | |
| 13: 'left_knee', 14: 'left_ankle', 15: 'right_eye', 16: 'left_eye', 17: 'right_ear', 18: 'left_ear', 19: 'LBigToe', | |
| 20: 'LSmallToe', 21: 'left_heel', 22: 'RBigToe', 23: 'RSmallToe', 24: 'right_heel', | |
| } | |
| def joints_smplx_to_coco(): | |
| smplx_joints_name = get_smplx_joint_names() | |
| joints_idx = [] | |
| for k, v in COCO17_JOINTS_NAME.items(): | |
| joints_idx.append(smplx_joints_name.index(v)) | |
| return joints_idx | |
| def joints_openpose25_to_coco17(): | |
| idx_list = [0] * 17 | |
| is_found = False | |
| for coco_key, coco_value in COCO17_JOINTS_NAME.items(): | |
| is_found = False | |
| for openpose_key, openpose_value in OPENPOSE25_JOINTS_NAME.items(): | |
| if coco_value == openpose_value: | |
| idx_list[coco_key] = openpose_key | |
| is_found = True | |
| break | |
| assert is_found, f'{coco_key} is not found in openpose keypoints' | |
| return idx_list | |
| COCO_WHOLEBODY_KEYPOINTS = [ | |
| "nose", | |
| "left_eye", | |
| "right_eye", | |
| "left_ear", | |
| "right_ear", | |
| "left_shoulder", | |
| "right_shoulder", | |
| "left_elbow", | |
| "right_elbow", | |
| "left_wrist", | |
| "right_wrist", | |
| "left_hip", | |
| "right_hip", | |
| "left_knee", | |
| "right_knee", | |
| "left_ankle", | |
| "right_ankle", | |
| "left_bigtoe", | |
| "left_smalltoe", | |
| "left_heel", | |
| "right_bigtoe", | |
| "right_smalltoe", | |
| "right_heel", | |
| "right_contour_1", # original name: face_contour_1 | |
| "right_contour_2", # original name: face_contour_2 | |
| "right_contour_3", # original name: face_contour_3 | |
| "right_contour_4", # original name: face_contour_4 | |
| "right_contour_5", # original name: face_contour_5 | |
| "right_contour_6", # original name: face_contour_6 | |
| "right_contour_7", # original name: face_contour_7 | |
| "right_contour_8", # original name: face_contour_8 | |
| "contour_middle", # original name: face_contour_9 | |
| "left_contour_8", # original name: face_contour_10 | |
| "left_contour_7", # original name: face_contour_11 | |
| "left_contour_6", # original name: face_contour_12 | |
| "left_contour_5", # original name: face_contour_13 | |
| "left_contour_4", # original name: face_contour_14 | |
| "left_contour_3", # original name: face_contour_15 | |
| "left_contour_2", # original name: face_contour_16 | |
| "left_contour_1", # original name: face_contour_17 | |
| "right_eyebrow_1", | |
| "right_eyebrow_2", | |
| "right_eyebrow_3", | |
| "right_eyebrow_4", | |
| "right_eyebrow_5", | |
| "left_eyebrow_5", | |
| "left_eyebrow_4", | |
| "left_eyebrow_3", | |
| "left_eyebrow_2", | |
| "left_eyebrow_1", | |
| "nosebridge_1", | |
| "nosebridge_2", | |
| "nosebridge_3", | |
| "nosebridge_4", | |
| "right_nose_2", # original name: nose_1 | |
| "right_nose_1", # original name: nose_2 | |
| "nose_middle", # original name: nose_3 | |
| "left_nose_1", # original name: nose_4 | |
| "left_nose_2", # original name: nose_5 | |
| "right_eye_1", | |
| "right_eye_2", | |
| "right_eye_3", | |
| "right_eye_4", | |
| "right_eye_5", | |
| "right_eye_6", | |
| "left_eye_4", | |
| "left_eye_3", | |
| "left_eye_2", | |
| "left_eye_1", | |
| "left_eye_6", | |
| "left_eye_5", | |
| "right_mouth_1", # original name: mouth_1 | |
| "right_mouth_2", # original name: mouth_2 | |
| "right_mouth_3", # original name: mouth_3 | |
| "mouth_top", # original name: mouth_4 | |
| "left_mouth_3", # original name: mouth_5 | |
| "left_mouth_2", # original name: mouth_6 | |
| "left_mouth_1", # original name: mouth_7 | |
| "left_mouth_5", # original name: mouth_8 | |
| "left_mouth_4", # original name: mouth_9 | |
| "mouth_bottom", # original name: mouth_10 | |
| "right_mouth_4", # original name: mouth_11 | |
| "right_mouth_5", # original name: mouth_12 | |
| "right_lip_1", # original name: lip_1 | |
| "right_lip_2", # original name: lip_2 | |
| "lip_top", # original name: lip_3 | |
| "left_lip_2", # original name: lip_4 | |
| "left_lip_1", # original name: lip_5 | |
| "left_lip_3", # original name: lip_6 | |
| "lip_bottom", # original name: lip_7 | |
| "right_lip_3", # original name: lip_8 | |
| "left_hand_root", | |
| "left_thumb_1", | |
| "left_thumb_2", | |
| "left_thumb_3", | |
| "left_thumb", | |
| "left_index_1", | |
| "left_index_2", | |
| "left_index_3", | |
| "left_index", | |
| "left_middle_1", | |
| "left_middle_2", | |
| "left_middle_3", | |
| "left_middle", | |
| "left_ring_1", | |
| "left_ring_2", | |
| "left_ring_3", | |
| "left_ring", | |
| "left_pinky_1", | |
| "left_pinky_2", | |
| "left_pinky_3", | |
| "left_pinky", | |
| "right_hand_root", | |
| "right_thumb_1", | |
| "right_thumb_2", | |
| "right_thumb_3", | |
| "right_thumb", | |
| "right_index_1", | |
| "right_index_2", | |
| "right_index_3", | |
| "right_index", | |
| "right_middle_1", | |
| "right_middle_2", | |
| "right_middle_3", | |
| "right_middle", | |
| "right_ring_1", | |
| "right_ring_2", | |
| "right_ring_3", | |
| "right_ring", | |
| "right_pinky_1", | |
| "right_pinky_2", | |
| "right_pinky_3", | |
| "right_pinky", | |
| ] | |
| SMPLX_KEYPOINTS = [ | |
| "pelvis", | |
| "left_hip", | |
| "right_hip", | |
| "spine_1", | |
| "left_knee", | |
| "right_knee", | |
| "spine_2", | |
| "left_ankle", | |
| "right_ankle", | |
| "spine_3", | |
| "left_foot", | |
| "right_foot", | |
| "neck", | |
| "left_collar", | |
| "right_collar", | |
| "head", | |
| "left_shoulder", | |
| "right_shoulder", | |
| "left_elbow", | |
| "right_elbow", | |
| "left_wrist", | |
| "right_wrist", | |
| "jaw", | |
| "left_eyeball", | |
| "right_eyeball", | |
| "left_index_1", | |
| "left_index_2", | |
| "left_index_3", | |
| "left_middle_1", | |
| "left_middle_2", | |
| "left_middle_3", | |
| "left_pinky_1", | |
| "left_pinky_2", | |
| "left_pinky_3", | |
| "left_ring_1", | |
| "left_ring_2", | |
| "left_ring_3", | |
| "left_thumb_1", | |
| "left_thumb_2", | |
| "left_thumb_3", | |
| "right_index_1", | |
| "right_index_2", | |
| "right_index_3", | |
| "right_middle_1", | |
| "right_middle_2", | |
| "right_middle_3", | |
| "right_pinky_1", | |
| "right_pinky_2", | |
| "right_pinky_3", | |
| "right_ring_1", | |
| "right_ring_2", | |
| "right_ring_3", | |
| "right_thumb_1", | |
| "right_thumb_2", | |
| "right_thumb_3", | |
| "nose", | |
| "right_eye", | |
| "left_eye", | |
| "right_ear", | |
| "left_ear", | |
| "left_bigtoe", | |
| "left_smalltoe", | |
| "left_heel", | |
| "right_bigtoe", | |
| "right_smalltoe", | |
| "right_heel", | |
| "left_thumb", | |
| "left_index", | |
| "left_middle", | |
| "left_ring", | |
| "left_pinky", | |
| "right_thumb", | |
| "right_index", | |
| "right_middle", | |
| "right_ring", | |
| "right_pinky", | |
| "right_eyebrow_1", | |
| "right_eyebrow_2", | |
| "right_eyebrow_3", | |
| "right_eyebrow_4", | |
| "right_eyebrow_5", | |
| "left_eyebrow_5", | |
| "left_eyebrow_4", | |
| "left_eyebrow_3", | |
| "left_eyebrow_2", | |
| "left_eyebrow_1", | |
| "nosebridge_1", | |
| "nosebridge_2", | |
| "nosebridge_3", | |
| "nosebridge_4", | |
| "right_nose_2", # original name: nose_1 | |
| "right_nose_1", # original name: nose_2 | |
| "nose_middle", # original name: nose_3 | |
| "left_nose_1", # original name: nose_4 | |
| "left_nose_2", # original name: nose_5 | |
| "right_eye_1", | |
| "right_eye_2", | |
| "right_eye_3", | |
| "right_eye_4", | |
| "right_eye_5", | |
| "right_eye_6", | |
| "left_eye_4", | |
| "left_eye_3", | |
| "left_eye_2", | |
| "left_eye_1", | |
| "left_eye_6", | |
| "left_eye_5", | |
| "right_mouth_1", # original name: mouth_1 | |
| "right_mouth_2", # original name: mouth_2 | |
| "right_mouth_3", # original name: mouth_3 | |
| "mouth_top", # original name: mouth_4 | |
| "left_mouth_3", # original name: mouth_5 | |
| "left_mouth_2", # original name: mouth_6 | |
| "left_mouth_1", # original name: mouth_7 | |
| "left_mouth_5", # original name: mouth_8 | |
| "left_mouth_4", # original name: mouth_9 | |
| "mouth_bottom", # original name: mouth_10 | |
| "right_mouth_4", # original name: mouth_11 | |
| "right_mouth_5", # original name: mouth_12 | |
| "right_lip_1", # original name: lip_1 | |
| "right_lip_2", # original name: lip_2 | |
| "lip_top", # original name: lip_3 | |
| "left_lip_2", # original name: lip_4 | |
| "left_lip_1", # original name: lip_5 | |
| "left_lip_3", # original name: lip_6 | |
| "lip_bottom", # original name: lip_7 | |
| "right_lip_3", # original name: lip_8 | |
| "right_contour_1", # original name: face_contour_1 | |
| "right_contour_2", # original name: face_contour_2 | |
| "right_contour_3", # original name: face_contour_3 | |
| "right_contour_4", # original name: face_contour_4 | |
| "right_contour_5", # original name: face_contour_5 | |
| "right_contour_6", # original name: face_contour_6 | |
| "right_contour_7", # original name: face_contour_7 | |
| "right_contour_8", # original name: face_contour_8 | |
| "contour_middle", # original name: face_contour_9 | |
| "left_contour_8", # original name: face_contour_10 | |
| "left_contour_7", # original name: face_contour_11 | |
| "left_contour_6", # original name: face_contour_12 | |
| "left_contour_5", # original name: face_contour_13 | |
| "left_contour_4", # original name: face_contour_14 | |
| "left_contour_3", # original name: face_contour_15 | |
| "left_contour_2", # original name: face_contour_16 | |
| "left_contour_1", # original name: face_contour_17 | |
| ] | |
| LEFT_HAND_KEYPOINTS = [ | |
| "left_wrist", | |
| "left_index_1", | |
| "left_index_2", | |
| "left_index_3", | |
| "left_middle_1", | |
| "left_middle_2", | |
| "left_middle_3", | |
| "left_pinky_1", | |
| "left_pinky_2", | |
| "left_pinky_3", | |
| "left_ring_1", | |
| "left_ring_2", | |
| "left_ring_3", | |
| "left_thumb_1", | |
| "left_thumb_2", | |
| "left_thumb_3", | |
| ] | |
| RIGHT_HAND_KEYPOINTS = [ | |
| "right_wrist", | |
| "right_index_1", | |
| "right_index_2", | |
| "right_index_3", | |
| "right_middle_1", | |
| "right_middle_2", | |
| "right_middle_3", | |
| "right_pinky_1", | |
| "right_pinky_2", | |
| "right_pinky_3", | |
| "right_ring_1", | |
| "right_ring_2", | |
| "right_ring_3", | |
| "right_thumb_1", | |
| "right_thumb_2", | |
| "right_thumb_3", | |
| ] | |
| COCO_PLUS_KEYPOINTS = [ | |
| 'nose', | |
| 'left_eye', | |
| 'right_eye', | |
| 'left_ear', | |
| 'right_ear', | |
| 'left_shoulder', | |
| 'right_shoulder', | |
| 'left_elbow', | |
| 'right_elbow', | |
| 'left_wrist', | |
| 'right_wrist', | |
| 'left_hip', | |
| 'right_hip', | |
| 'left_knee', | |
| 'right_knee', | |
| 'left_ankle', | |
| 'right_ankle', | |
| "left_bigtoe", | |
| "left_smalltoe", | |
| "left_heel", | |
| "right_bigtoe", | |
| "right_smalltoe", | |
| "right_heel", | |
| ] | |
| KEYPOINTS_FACTORY = { | |
| "smplx": SMPLX_KEYPOINTS, | |
| "coco_wholebody": COCO_WHOLEBODY_KEYPOINTS, | |
| "left_hand": LEFT_HAND_KEYPOINTS, | |
| "right_hand": RIGHT_HAND_KEYPOINTS, | |
| "coco_plus": COCO_PLUS_KEYPOINTS, | |
| } | |
| MAPPING_CACHE = {} | |
| def get_mapping( | |
| src: str, | |
| dst: str, | |
| keypoints_factory: dict = KEYPOINTS_FACTORY, | |
| ): | |
| """Get mapping list from src to dst. | |
| Args: | |
| src (str): source data type from keypoints_factory. | |
| dst (str): destination data type from keypoints_factory. | |
| approximate (bool): control whether approximate mapping is allowed. | |
| keypoints_factory (dict, optional): A class to store the attributes. | |
| Defaults to keypoints_factory. | |
| Returns: | |
| list: | |
| [src_to_intersection_idx, dst_to_intersection_index, | |
| intersection_names] | |
| """ | |
| if src.lower() in MAPPING_CACHE.keys() and dst.lower() in MAPPING_CACHE[src.lower()].keys(): | |
| return MAPPING_CACHE[src.lower()][dst.lower()] | |
| src_names = keypoints_factory[src.lower()] | |
| dst_names = keypoints_factory[dst.lower()] | |
| dst_idxs, src_idxs, intersection = [], [], [] | |
| full_mapping_idx = [] | |
| unmapped_names, approximate_names = [], [] | |
| for dst_idx, dst_name in enumerate(dst_names): | |
| try: | |
| src_idx = src_names.index(dst_name) | |
| except ValueError: | |
| src_idx = -1 | |
| if src_idx >= 0: | |
| dst_idxs.append(dst_idx) | |
| src_idxs.append(src_idx) | |
| intersection.append(dst_name) | |
| full_mapping_idx.append(src_idx) | |
| # approximate mapping | |
| mapping_list = (dst_idxs, src_idxs, intersection, full_mapping_idx) | |
| if not src.lower() in MAPPING_CACHE.keys(): | |
| MAPPING_CACHE[src.lower()] = {} | |
| MAPPING_CACHE[src.lower()][dst.lower()] = mapping_list | |
| return mapping_list | |
| if __name__ == '__main__': | |
| print(joints_smplx_to_coco()) |