연구중에 HMR2.0을 통해서 추정된 포즈를 기반으로 SMPL 캐릭터를 그릴 필요가 있었음
1차 고난
HMR2.0을 사용하기로 한 리포가 텐서플로를 씀. 근데 텐서플로는 런타임중에 텐서를 뜯어보는게 쉽지 않네?
breakpoint()를 걸면 여러번 호출되고, print 찍어봐도 텐서 이름이랑 쉐잎만 나오지 텐서가 안나옴.
방법을 찾다가 데모 구간에선 안전하게 확인 가능하길래 인퍼런스 살짝 뜯어 고쳐서 rot_mats 이랑 global joint positions 추출함
도커로 이미지 구워놨는데 필요하신 분 댓글 달아주시면 허브에 올려서 전달드릴게요
https://github.com/russoale/hmr2.0
GitHub - russoale/hmr2.0: End-to-end Recovery of Human Shape and Pose with tensorflow 2.0
End-to-end Recovery of Human Shape and Pose with tensorflow 2.0 - russoale/hmr2.0
github.com
2차 고난
이렇게 뽑은 rot_mats는 24x3x3이였는데 내 짧은 배경지식으로 인해 이 행렬이 BVH 라이브러리에서 다루듯이 pelvis에서 dfs로 가져가는줄 알았다. 나중에 모델 pkl 파일을 뜯어보고 나니까 알 수 있던건 나는 노드를 dfs 형태로 관리하고 있었지만, smpl 에선 bfs 형태로 관리하고 있더라.
이걸 해결하기 위해 매핑 리스트를 만들어서 dfs 인덱스를 넣으면 매칭되는 bfs 인덱스를 조회 가능한 리스트를 만들었다. 이걸 numpy array에 집어넣으면 그냥 하나의 인덱스로 해결 할 수 있었을텐데 아직은 안했다


그래서 만들어둔 인덱스 매칭 리스트. 왜 이런 자료는 인터넷에 없을까
bfs_to_dfs = [0, 1, 5, 9, 2, 6, 10, 3, 7, 11, 4, 8, 12, 14, 19, 13, 15, 20, 16, 21, 17, 22, 18, 23]
dfs_to_bfs = [0, 1, 4, 7, 10, 2, 5, 8, 11, 3, 6, 9, 12, 15, 13, 16, 18, 20, 22, 14, 17, 19, 21, 23]
필요하신 분들은 가져다 쓰세용
3차 고난
가장 큰 고난이였는데 애초에 이 로테이션 매트릭스를 적용해도 내가 이미지에서 보는 결과가 안나왔다.
왜 팔이 뒤로 가냐고...

회전행렬이다보니까 offset이 없으면 이걸 따로 그려서 확인하기도 어려워서 이게 맞는 데이터인지 아닌지 확신도 없었다 (1차 고난의 트라우마때문에 이 텐서 값이 최종 값인지에 대한 확신이 없었다. 텐서플로를 모르는 자의 최후)
그래서 조인트의 글로벌 포인트를 플로팅해보니까 그 포즈가 나오더라.


1. 포지션이랑 로테이션이 같은 구간에서 추출해낸거고, 2. 글로벌 포지션을 계산하는데 사용되고, 3. 계산 이후 호출구간이 없는 것을 확인해서 해당 로테이션이 옳은 회전 행렬임을 확신했다. 다만 여기까지 너무 많은 시간을 소모해서 집에 다녀옴
아침에 와서 이 rotation 매트릭스를 계산하는 HMR쪽 공식을 보니 내가 구현한 FK랑 다른게 없다는것을 확인했다. 그럼 여기서 오로지 다른 요소는 local_rest_transform이다.
내 local_rest_transform은 전부 적용하면 T pose가 그려지는데 transform matrix에서 rot_mat은 identity 가 아닌데, pkl에서 뽑아본 J 정보는 포지션밖에 없어서 identity로 설정되었겠구나 하고 추측했다
그래서 내가 만든 스켈레톤 라이브러리에서 글로벌 포지션들을 전부 추출한다음에 로컬 트랜스폼 매트릭스를 rotation matrix는 identity로, translation은 글로벌 포지션으로 넣어둔 다음에 글로벌 포지션을 기반으로 local transform들을 재계산 시켰다
이후 rot_mats 들을 걸어주니 문제 해결!
헷갈렸던 부분은 아래 이미지로 달아두었다

'개발 > 이슈 해결 모음' 카테고리의 다른 글
| [Computer Graphics / M1 MAC] M1 Mac 에서 freeglut 사용하기 (1) | 2022.09.16 |
|---|---|
| [Python / MediaPipe] M1 Macbook Mediapipe 설치 방법 (4) | 2022.09.01 |
| [AWS, Django] Django Rest Framework HTTPS 해결기 (0) | 2022.08.30 |
| [Django, AWS] no module named 'uwsgi' 에러 해결기 (0) | 2022.08.26 |
| [React] useEffect가 두 번 찍히는 오류 (0) | 2022.08.26 |