3D Human Pose Estimation을 하다보면 시각화가 필요해진다.
물론 3d-pose-baseline이라는 훌륭한 레포가 있고, 또 파이썬상에서 Axes3D로 시각화해도 되지만 여간 귀찮은 게 아니다.
특히 skeleton의 길이를 조정하면서 쓰고자 할 때에는 UI적으로 추가적인 구현을 해야 하니, 그걸 파이썬으로 할 바에는 WPF나 Unity3D로 하는 게 훨씬 빠르다.
프레임 단위 Update 함수가 존재하는 Unity3D에서 개발하는 게 나을 것 같다고 판단하여 맨 처음에는 Unity3D에서 .csv 파일을 불러오도록 개발해서 썼었다. 문제는 csv파일이 2차원 데이터이다보니 효율적인 데이터 구성이 힘들었다...
그러다가 찾은 것이 Numpy.NET이다! Numpy.NET은 numpy을 나름 어느정도는 파이썬 스타일로 C#에서 쓸 수 있도록 바인딩한 패키지이다.
아싸리 이걸 써먹어야지 하고 패키지 설치를 했는데, 구글링의 온갖 가이드라인을 따라해도 유니티에서 빌드할 때 레퍼런스 인식을 하지 못했다.
기나긴 삽질 끝에 화가 난 나머지 UI구성하기도 쉬운 WPF로 개발하기로 하였다.
WPF에서는 성공적으로 Numpy.NET을 레퍼런스할 수 있었고, 텐서 연산을 쉽게쉽게 하여 여러 캘리브레이션과 좌표계 변환 기능 등을 붙여준 뒤 캔버스에 drawing해주는 방식으로 개발했다.
CMU MoCap 데이터셋의 한 모션 |
아무래도 파일을 열거나 위 이미지의 슬라이드 UI구현 등은 WPF가 많이 편했다.
ITZY의 wannbe 안무 영상을 추론한 결과 시각화 |
길이 조절이 가능하다! |
보면 알겠지만, 추론시에 Temporal Correction Layer가 추가되지 않은 모델은 추론 결과 모션이 부드럽지 못할 때가 있다. 그럴 때를 대비해 Low-pass Filter를 추가해 부드럽게 보이도록 관련 파라미터를 조절할 수 있는 슬라이드도 있다.
skeleton의 길이는 조절할 것이라 별로 중요치
않았기에 현재 이 프로그램은 skeleton들의 방향 벡터들만을 입력으로 받는다.
여담이지만, 아무리 skeleton의 방향만 필요하다고 하더라도 모델을 direction만 추론하도록 학습하는 건 별로 좋지 않았다. cosine similarity를 이용하며 loss를 구성해 학습하였는데, skeleton direction은 composition과정에서 root joint로부터 점차 더해가는 과정이다보니 하나의 skeleton에서 오차가 나면 그 오차가 children skeletons로 전파된다. 결과적으로 완벽한 추론이 아니면 나쁜 추론 결과가 나온다. 따라서 direction만 완벽하게 학습하기보다는, joint position을 학습하여 decomposition을 하는 것이 안정적인 추론 결과를 얻을 수 있다.
위의 경험을 교훈 삼아 joint position을 입력으로 받도록 프로그램을 개선할 예정이다. 지금은 너무 rough하기에 좀 더 다듬어 overlap이나 컬러 테마를 시인성 있게 개발해서 github에 올려볼 계획이다.
안녕하세요. nuitrack으로 c# wpf 개발을 시도하고있는 학생입니다. 위 내용을 참고하고싶은데 혹시 가능할까요?