SMPLX 모델 사용한 연구들이 요새 UV domain도 많이 염두하기 때문에 각 vertex의 uv coordinate 정보도 다루기 시작한 것 같다. 근데 내가 직접 다뤄보니 생각보다 잡고생해야 될 숨은 오류들이 많은데, 미리 적어두려고 한다.
1. SMPLX_NEUTRAL.pkl / SMPLX_MALE.pkl /SMPLX_FEMALE.pkl 모델 안에 있는 "vt" 사용 금지
pkl 모델 자체를 열어보면 안에 vt라는 변수로 총 11313개 uv coordinate가 저장되어 있다.
먼저 왜 모델 vertex 개수인 10475랑 다르냐고 궁금할 수 있는데 3차원 모델을 2차원 uv map으로 쪼개는 과정에서 어쩔 수 없이 여러 번 mapping 해야 되는 경계 vertex들이 있기 때문이다.
예를 들면 지구본을 세계 지도로 펼칠 때 북극과 남극은 한 점임에도 여러 위치에 mapping 돼야하고, 세계지도 좌우 끝에 걸치는 부분은 2번씩 mapping 되는 모양과 같다. 따라서 어떤 vertex는 N개의 uv coordinate 값을 갖는다.
(11313개 uv가 각각 어떤 vertex에 대응되는지 그 index table은 아래 파일 참고)
smplx_uvs = model["vt"]
위 값으로 띄워보면 그림은 그럴 듯 정확하게 찍힌다. (왼쪽 GT와 오른쪽 smplx_uvs를 찍은 것)
근데 전체를 다 찍으니까 그럴듯 해보이는 것이지 문제는, index가 사실 꼬여있고 값도 미세하게 다르다는 것이다.
이를 증명해볼 수 있는 간단한 예제로 SMPLX vertex 중 FLAME (head)에 해당하는 vertex uv만 찍어보면 다음과 같다.
FLAME 5023개 vertex니까 왼쪽 상단 얼굴 영역에 몰려있고, 몸과 얼굴 연결 부분에만 조금 찍혀있어야 하는데 완전 망가지는 것으로 보아 model["vt"] 값은 index가 실제 SMPLX vertex와 뭔가 안 맞는다는 것을 알 수 있다.
따라서 index가 꼬여있는 값이니 pkl 파일 안에 있는 vt값을 사용하면 안된다. (추측컨대 trimesh, meshlab 등 3D tool에서 자체 처리로 자동으로 생성된 값이라 postprocessing된 index 같다.)
2. smplx_uv.obj 파일 안에 있는 값을 사용하자.
smplx_uv.obj 파일에 있는 11313개 uv 값을 사용해야 위와 같이 제대로 맵핑된다.
Note
위 uv_table.json 파일 외에 pkl 파일이나 smplx_uv.obj 파일은 공식 SMPLX repository에서 access 받아 다운받아야 하므로 여기에 올리진 않았다.
'Knowhow > Vision' 카테고리의 다른 글
BFM 모델 vertex index / uv unwrap coordinates (0) | 2024.11.19 |
---|---|
Open3D Normal map rendering, Normal 이미지 얻는 방법 (0) | 2024.11.05 |
Opencv camera index 찾기, device index 찾기 (0) | 2024.10.29 |
Facescape 모델 68 keypoint/landmark index (0) | 2024.08.28 |
obj 파일 v, vt, f 등 직접 저장하기, obj save (0) | 2024.08.28 |