Super Kawaii Cute Cat Kaoani SMPL-X skeleton 뜯어보기 & SMPL-X to SMPL+H

연구/컴퓨터 그래픽스

SMPL-X skeleton 뜯어보기 & SMPL-X to SMPL+H

치킨고양이짱아 2024. 1. 29. 20:15
728x90
728x90

1) SMPL-X 살펴보기

SMPL-X의 JOINT는 총 55개이다.

blender에 import했을 때 나타나는 hierarchy 구조로 살펴보면 아래와 같고,

smpl-x 파일의 pose parameter 순서에 맞게 joint들을 나열해보면 아래와 같다. 아래의 list를 보면 알 수 있듯이 body joint는 22개, jaw에 해당하는 joint가 1개, eye에 해당하는 joint가 2개, hand에 해당하는 joint가 30개로 총 55개의 joint가 존재한다.

SMPLX_JOINT_LIST = 
              [ # body joint
               'pelvis', 'left_hip', 'right_hip', 'spine1', 'left_knee', 'right_knee', 'spine2', 'left_ankle', 'right_ankle', 'spine3', 'left_foot', 'right_foot', 'neck', 'left_collar', 'right_collar', 'head', 'left_shoulder', 'right_shoulder', 'left_elbow', 'right_elbow', 'left_wrist', 'right_wrist', 
                # jaw joint
               'jaw',
                # eye joint 
               'left_eye_smplhf', 'right_eye_smplhf', 
                # left hand joint
               'left_index1', 'left_index2', 'left_index3', 'left_middle1', 'left_middle2', 'left_middle3', 'left_pinky1', 'left_pinky2', 'left_pinky3', 'left_ring1', 'left_ring2', 'left_ring3', 'left_thumb1', 'left_thumb2', 'left_thumb3', 
                # right hand joint
               'right_index1', 'right_index2', 'right_index3', 'right_middle1', 'right_middle2', 'right_middle3', 'right_pinky1', 'right_pinky2', 'right_pinky3', 'right_ring1', 'right_ring2', 'right_ring3', 'right_thumb1', 'right_thumb2', 'right_thumb3']

 

2) SMPL-X to SMPL+H

SMPL-X와는 호환이 안되고 SMPL+H만 호환되는 코드를 사용할 일이 생겼다. 이를 위해 내가 가지고 있는 SMPL-X format 파일을 SMPL+H format으로 수정해야했다.

(SMPL-X는 손, 얼굴, 몸의 모션을 전부 표현하는 format이고, SMPL+H는 손과 몸의 모션만 표현하는 format이다.)

skeleton 구조가 어떻게 다른지 살펴보니, SMPL+H는 SMPL-X보다 joint가 3개가 작았다. 정확히는 SMPL-X의 joint에서 jaw joint, left_eye_smplhf, right_eye_smplhf가 빠졌고 나머지는 동일하다.

이 정보를 바탕으로 SMPL-X의 data를 SMPL+H로 변환하는 코드를 아래와 같이 작성해보았다. (파일을 로드하고, 파일을 저장하는 부분은 코드에서 넣지 않았다. SMPL-X 정보를 어떤식으로 수정하면 SMPL+H와 호환되는지만 살펴보면 될 것 같다.)

def smplx2smplh(smplx):
    smplh = {
            'trans': np.array(smplx['trans']),
            'poses': np.zeros((frame_num, 156)),
            'betas': np.zeros((16)), # 나의 경우 사용하지 않음
            'gender': "female",
            'mocap_framerate': 30
    }
    smplh['poses'][:, :3] = smplx['poses'][:, :3] # pelvis orientation
    smplh['poses'][:, 3:3+63] = smplx['poses'][:,3:3+63] # pelvis를 제외 joint orientation
    smplh['poses'][:, 66:66+90] = smplx['poses'][:, 75:75+90]

    return smplh

smplx 파일에서 face expression과 관련된 정보는 smplh에 넣어주지 않았고(smplh는 face expression을 사용하지 않으므로), smplx 파일의 poses 항목에서 jaw와 eyeball joint와 관련된 내용을 제외하였다. (smplx['poses'][66:75]에 해당되는 내용)

위와 같이 smpl파일을 수정하여 저장하고, smplh만 호환되는 코드에 파일을 로드하였을 때 정상적으로 잘 동작하는 것을 확인할 수 있었다.

728x90
728x90