QZFantasies's picture
add wheels
c614b0f
# 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())