본문 바로가기

인공지능/Toy Projects

현실의 춤을 가상공간으로 매핑하기_관 (using 3D human pose estimation)

Introduction

저번 글을 마무리할 때 향후 적용해볼만한 내용에 대해 정리를 했었다.

이번 글에서는 그중에 시도했던 내용 + 추가로 진행된 사항에 대해 정리하겠다.

 

Method & Result

우선 저번글 마무리에 작성한 내용은 다음과 같다.

우선 먼저 해볼 것은 VMD converter의 내용을 수정하는 것이다.
motion capture의 경우 입력 format으로 FBX, BVH가 있는 것으로 확인했는데, FBX는 3d pose coordinate에서 변환하는 방법을 찾지 못한상태이고, BVH의 경우 github을 뒤지다가 3d pose에서 변환하는 코드를 찾아서 맞게 수정해볼 생각이다.
BVH 데이터를 만들면 rokoko 애드온을 이용해 bone들끼리 retargeting을 진행할 것이다.

내용은 1) VMD converter의 코드를 수정해서 bone의 위치를 맞추겠다, 2) 3d pose를 VMD로 변환하지 않고 모션캡쳐 format인 BVH로 변환 후, rokoko 애드온을 이용해 retargeting을 진행한다, 로 정리할 수 있겠다.

VMD converter 코드 수정

3d pose에서 VMD로 변환하는 과정에서 필수로 작성되어야하는 부분중에 bone name이 있다.

저번 글에서 추측한 내용으로는 bone name이 매칭이 되지 않아서 이상하게 매핑이 된것이 아닌가 하는 의심이 가장 컸기 때문에 해당부분을 먼저 고쳐보기로 했다.

고치기 전에 어떤 부분이 잘못된 것인지 알아야 하기때문에 매핑이 잘 된 vmd파일을 가져와 bone name을 비교했다.

우선 매핑이 잘 적용된 vmd파일의 bone name은 다음과 같다.

首 頭 両目 右目 右目戻 左目 左目戻 メガネ 舌1 舌2 舌3 右肩P 右肩 右肩C 右腕 右腕捩 右腕捩1 右腕捩2 右腕捩3 右ひじ 右手捩 右手首 右ダミー 右親指0 右親指1 右親指2 右小指1 右小指2 右小指3 右薬指1 右薬指2 右薬指3 右中指1 右中指2 右中指3 右人指1 右人指2 右人指3 右手捩1 右手捩2 右手捩3 右袖 左肩P 左肩 左肩C 左腕 左腕捩 左腕捩1 左腕捩2 左腕捩3 左ひじ 左手捩 左手首 左ダミー 左親指0 左親指1 左親指2 左小指1 左小指2 左小指3 左薬指1 左薬指2 左薬指3 左中指1 左中指2 左中指3 左人指1 左人指2 左人指3 左手捩1 左手捩2 左手捩3 左袖 ネクタイ0 ネクタイ1 ネクタイ2 ネクタイ3 ネクタイ4 ネクタイ4_ ネクタイIK 下半身 腰キャンセル右 右足 右ひざ 右足首 右足首+ 右つま先 右つま先IK 右つま先IK先 右足IK親 右足IK 右足IK+ 腰キャンセル左 左足 左ひざ 左足首 左足首+ 左つま先 左つま先IK 左つま先IK先 左足IK親 左足IK 左足IK+ 右足D 右ひざD 右ひざFCancel 右足FCancel 下半身FCancel センターFCancel 右足IKD 右足首D 右足先EX 左足D 左ひざD 左ひざFCancel 左足FCancel 下半身FCancel センターFCancel 左足IKD 左足首D 左足先EX 新規ボーン1 スカート_0_0 スカート_0_1 スカート_0_2 スカート_0_3 スカート_0_4 スカート_0_5 スカート_0_6 スカート_0_7 スカート_1_0 スカート_1_1 スカート_1_2 スカート_1_3 スカート_1_4 スカート_1_5 スカート_1_6 スカート_1_7 スカート_2_0 スカート_2_1 スカート_2_2 スカート_2_3 スカート_2_4 スカート_2_5 スカート_2_6 スカート_2_7 スカート_3_0 スカート_3_1 スカート_3_2 スカート_3_3 スカート_3_4 スカート_3_5 スカート_3_6 スカート_3_7 ベルト1 ベルト 右ひじ補助 右ひじ補助1 左ひじ補助 左ひじ補助1 +右ひじ補助 右手先 右親指先 右小指先 右薬指先 右中指先 右人指先 +左ひじ補助 左手先 左親指先 左小指先 左薬指先 左中指先 左人指先 アホ毛1 アホ毛2 右もみあげ1 右もみあげ2 左もみあげ1 左もみあげ2 前髪1 前髪1_2 前髪2 前髪2_2 前髪3 前髪3_2

그리고 vmd converter를 이용해 변환된 vmd파일의 bone name은 다음과 같다.

頭 左腕 左ひじ 右腕 右ひじ 左足 左ひざ 右足 右ひざ 下半身 上半身

일단 일본어로 구성되어있어서 무슨말인지 잘 모르지만, 한국인이 봐도 갯수부터가 일단 매우 많이 차이나는 것을 확인할 수 있었다.

우선 변한된 vmd에 있는 bone name이 잘 작동되는 vmd의 bone name과 맞지 않는 부분이 있는지 부터 확인했는데, 모든 부분은 다 잘 있었다..

가장 유심하게 보고있었던 부분은 목 or 머리 부분인데, 저번 글에서 아바타가 반으로 접혔던 이유가 목 or 머리의 bone이 없어서 그럴것으로 단순히 생각했지만, 확인해보니 머리는 잘 있었다.

그래서 이름을 일단 목으로 한번 바꿔보기로 했다.

근데 이제 python 코드상에서는 일본어를 그대로 입력하지 않고, 인코딩하여 사용하는데, vmd converter에서 사용한 인코딩은 shift-JIS로 일본어를 표현할때 사용하는 인코딩이다.

그래서 b'\x93\xaa'로 인코딩 되어 있는 머리를 b'\x8e\xf1'로 인코딩 된 목으로 변환해서 vmd를 다시 추출해봤다.

shift-JIS 인코딩은 다음 사이트를 이용했다.

 

Encoding converter

show all the characters in: Select... big5 euc-jp iso-2022-jp shift_jis euc-kr gb18030 (index only) gbk koi8-r koi8-u windows-1250 windows-1251 windows-1252 windows-1253 windows-1254 windows-1255 windows-1256 windows-1257 windows-1258 macintosh ibm866 wind

r12a.github.io

근데 결과는 변하지 않았다.

똑같이 고개를 숙이고 있었다.

결국 vmd는 관으로 보냈다.

 

3D pose to BVH

모션캡쳐 format인 BVH형식으로 변환해 아바타에 retargeting하는 방법을 사용했다.

영상에서 3d pose를 추출하고 bvh형식으로 변환하는 코드는 다음코드를 참조했다.

 

GitHub - HW140701/VideoTo3dPoseAndBvh: Convert video to the bvh motion file

Convert video to the bvh motion file. Contribute to HW140701/VideoTo3dPoseAndBvh development by creating an account on GitHub.

github.com

 

영상 위치를 args로 받지 않고 코드 중간에 하드코딩하여 사용하는 방식을 이용한다.

3d pose 자체는 잘 추출되는것 같다.

 

rewind 안무영상 (https://youtu.be/AIOuLlqgzAY)

문제는 bvh를 이용해 아바타와 매칭하면 뭔가 좌표가 이상해진다

 

이상한데 가있는다..

retargeting에서 bone by bone으로 이름을 하나씩 비교해가면서 맞춰보고 일주일동안 별짓 해봤는데도 뭐가 문제인지 솔직히 아직도 파악이 안된 상황이다.

retargeting에 사용한 라이브러리인 rokoko가 blender 최신버전(3.1.x)에서 지원이 되지 않는 문제가 있다.

그래서 메일보내보니 하위버전 2.8.x 를 사용하기를 추천한다.

근데 내가 사용하는 맥북은 m1 이라 3.1.x에서 지원이 되는데.. 무튼 2.8.x버전을 설치해서 적용한 결과가 위 영상이다.

 

 

mmd tools + rokoko

맨처음에 vmd에 사용했던 애드온인 mmd tools와 두번째 bvh에 사용했던 rokoko를 둘 다 이용해보는 방법을 선택해봤다.

한가지 문제가 있다면 mmd tools는 2.8.x버전에서는 작동이 되지 않고, rokoko는 2.8.x버전에서만 작동이 된다

그래서 시도한 방법은 3.1.x버전에서 mmd tools를 이용해 아바타를 불러오고 .blend파일로 저장해서 2.8.x버전에서 불러와서 bone name을 retargeting해서 돌려봤다.

bone name은 다음이름으로 retargeting했다. (bone 하나하나 눌러보면서 이름 비교했다.. 일본어 실력이 조금 늘은거 같기도)

retargeting한 결과이다.

 

bone은 retargeting이 잘 된 것 같긴한데.. mesh(살)가 따로 논다.

아마 .blend로 저장하면서 연결이 끊겼거나, mmd tools에서 제공하는 부분인데 2.8.x로 내려와서 그부분이 제공이 되지 않는 것일수도 있다.

mmd 아바타의 bone과 mesh만 잘 연결이 되면 거의 끝이 다가오는 것 같은데 아쉽다..

 

Conclusion & Discussion

rokoko관련 튜토리얼도 많고 좋다는 내용이 많아서 사용해보려했는데, silicon이 지원되지 않는 버전에서만 돌아가는 문제라던가, 위처럼 retargeting이 뭔가 잘 안되는거 같아서 그냥 rokoko말고 다른 애드온을 찾아서 적용해보는게 좋을 것 같다.

다음 해볼만한 것은 rokoko를 대신할만한 애드온을 찾는 것이 있겠다.

추가로 mmd tools를 좀 더 찾아봤는데, 해당 애드온에서 bvh를 지원하는 내용이 있는 것 같다.(정확하게는 bvh를 vmd형식으로 변환해주는 것)

아직 내용을 자세히 보지는 않았지만, bone name을 맞춰줘야 하는 것 같다.

다시 일본어를 사용하는 시간이 온 것 같다.

 

GitHub - powroupi/blender_mmd_tools: mmd_tools is a blender addon for importing Models and Motions of MikuMikuDance.

mmd_tools is a blender addon for importing Models and Motions of MikuMikuDance. - GitHub - powroupi/blender_mmd_tools: mmd_tools is a blender addon for importing Models and Motions of MikuMikuDance.

github.com

 

뭔가 열심히 많이 했는데, 진척이 없는 것 같아서 조금 아쉽다.