WPF C# Skeleton 시각화 프로그램 만들어보기

나용수·2021년 2월 16일
0

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에 올려볼 계획이다.

profile
컴퓨터에 관심 많은 산업공학과 학부생. 슬프게도 지금은 대한민국 육군에서 복무 중입니다.

4개의 댓글

comment-user-thumbnail
2021년 11월 1일

안녕하세요. nuitrack으로 c# wpf 개발을 시도하고있는 학생입니다. 위 내용을 참고하고싶은데 혹시 가능할까요?

1개의 답글