ThreeDPoseTracker Ver.0.2アップデート

# はじめに
![Top020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374813/286ae6d4-c6ae-e1d9-1881-937f6bc06662.png)

この記事はUSBカメラモーションキャプチャーThreeDPoseTrackerのバージョン0.2.0のアップデートについての記事です。ThreeDPoseTrackerってナニ？という方は先に

「USBカメラモーションキャプチャーThreeDPoseTrackerの説明」
https://qiita.com/yukihiko_a/items/43d09db5628334789fab

をご覧ください。

### ※ 最新版はBOOTHからダウンロードできます（無料）。

https://digital-standard.booth.pm/items/3698596

### ※iOS版もリリースしました。
詳しくはこちらのページをご覧ください。

https://digital-standard.com/tdpt_lp/

# Ver.0.2.0について
### ダウンロード先
下記URLからダウンロードしてください。

（2022/03/11　Ver.0.5.0をリリースしました。変更点及びダウンロードは下記を参照してください）
https://qiita.com/yukihiko_a/items/234af259aede99ac55ee

（2021/07/31　Ver.0.4をリリースしました。変更点及びダウンロードは下記を参照してください）
https://qiita.com/yukihiko_a/items/d5c9635e4f1d7f69451f

（2020/09/13　Ver.0.3をリリースしました。変更点及びダウンロードは下記を参照してください）
https://qiita.com/yukihiko_a/items/82b1e50de8d81e554721

ver.0.2.0ダウンロード
https://digital-standard.com/threedpose/ThreeDPoseTracker_Win_x64_v0_2_0.zip

### 更新内容
今回の主な更新内容です。今回はBVHのHumanoid Boneのみの保存が主たる目的のリリースです。

* BVH保存時に、Humanoid Boneのみの保存やその他のオプションの設定を可能にしました。詳細は後述の設定画面の章を参照ください。
* 上記の機能追加により設定画面を変更しました
* モーションの動きを補正するフィルターを追加しました
* High Quality Modelの精度向上（1％程度なので見た目ではわかりません）
* デフォルトのアバターをUnity-chanから蘭鈴りゅん (Lune)に変更しました。Unity-chanはもういません。
蘭鈴りゅん（らぬべる りゅん）のVRMファイルは下記URLからDLできます。

https://hub.vroid.com/characters/2743935442348366186/models/3045425008508757993

# 設定画面
設定項目が多くなったので機能ごとにタブで分けました。以下それぞれの機能の設定項目を説明します。

### Images
入力画像や背景画像の設定です。設定内容はv0.1.0から変わっていません。
![config_images.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374813/8bba7fbb-3517-0ed5-b27b-f8f28f78f37a.png)

* Show Source Image
画面全体に表示されているSource Deviceとして読み込んだ動画やUSBカメラの画像表示・非表示を設定します。

* Show Input Image
AIへの入力画像（左上の小窓）の表示・非表示を設定します。

* Skip on Drop
動画再生時、オンの際は処理落ちするフレームは飛ばして再生します。オフにして再生すると全フレームを再生するため処理が遅い場合はスローモーションのような再生になります。

* Movie File Repeat Playback Mode
動画再生時、オンの場合動画をリピート再生にします。

* Mirror when Using Camaera
USBカメラ使用時、オンの場合カメラからの入力がミラー状態になります。

* Source Cut Scale
Source Imageの画像の縦を1とした比率で入力画像を切り出します。例えば動画に映っている人が小さすぎる場合は1以上の値を指定すると拡大されます。また、爪先が画面の淵に近い場合やギリギリという場合はこの値を0.9や0.8にすると少し安定します。
![cutScale.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374813/7fbdde99-1963-212e-1bb2-53ae47625d1b.png)

* Source Cut Center position
Source Imageの中心を原点とし画像の縦を1とした比率で指定した位置から入力画像を切り出します。動画の右側に踊っている方がいる場合などにその位置が中心になるように調整します。下図はｘの移動量に0.3を指定した場合で、上図の拡大率での見え方の差になります。画像を映しているカメラが縦比で0.3だけ右に移動したと考えてください。マイナス値にすれば左に移動し、ｙ軸についても同様です。
![cutPos.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374813/8037b338-4770-c40c-993f-0039ef235d04.png)

* Background Image File
背景画像を切り替えます。画像が存在しないか、この項目が空になっているとデフォルトの画像を表示します。
![背景020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374813/9115320b-fb7f-c7a7-8e68-65758a59ffc8.png)

* Background Scale
背景画像の大きさを調整します。画像位置は変更できないため、位置調整は元の画像を変更して調整してください。

* Background Color
Source Image、Input Image、Background Imageを全て非表示にすると単色の背景になります。背景色はRGB（0～255）で指定できます。グリーンバックや背景に何も出したくない時に使用してください。
![greenback020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374813/8d521c12-ccfd-6769-b3b0-b0ab664019a2.png)


### Predict
主にモーションに関する設定です。
![config_predict.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374813/6a30d286-66eb-4dfc-2d06-ba96bcdce892.png)

* Low Pass Filter
飛びやブルブルを抑える為のフィルターです。Height Qualityモデルであれば0～0.2程度が妥当です。大きくするとなめらかになりますが、遅延と動きが放漫になってきます。細かい動きが不要であれば0.3くらいでもなんとかなります。数値を変更しても処理速度には影響しません。

* n-order LPF
上記Low Pass Filterを何階かけるかを設定します。大きくすると効果は強くなりますが、数字に比例して効果が上がる訳ではありません。対して重い処理でもないので初めから最大の9でも良いくらいです。

* Range Pass Filter
上記のLow Pass Filterはブルブルする高周波成分をカットする為のフィルターです。これは特定の周波数を通すためのフィルターです。そうは言っても人のゆっくりした動きは全て採用したいので事実上ローパスフィルターとして使用します。なので下の周波数は0Hzにしたい所ですが0は指定できないので0.01Hzとしています。上の周波数は、人の動きは0.2秒くらいの動きが取れれば十分と言われているので5Hz程度で十分です（1÷0.2＝5Hz）。が、デフォルト値はさらに安定を求めて3.5Hzとしています。キビキビした動きにしたい時は5Hzくらいにしておいてください。
　・Buffer:
　　データをサンプリングするバッファサイズです。変更する必要はないと思います。
　　大きくすると処理は重くなります。
　・Order N:
　　フィルタの次数。実はまだあんまり評価できてないので、触らないでください。
　　大きくすると処理は重くなります。
　・Hz (from to):
　　低周波の0.01は変更する必要はないです。高周波は2～5Hzくらいで調整してください。
　　数値を変更しても処理速度には影響しません。

* Forward threshold
AIからの出力は0～1のスコアで出力されます。1が自信ありで0が自信なしです。人が画像に映っている場合は通常0.5以上のスコアになります。人が映っていないときは0～0.2程度です。この設定は人が映っていないと判断する閾値で、スコアがこの閾値以下になるとモーションが止まります。Forwardはアバターが正面を向いている時（体の向きが正面に対して±45度の範囲）の閾値です。

* Backward threshold
Backwardは上記のForwardの範囲外の閾値です。顔が見えていないと全体のスコアが低下するため分けて管理しています。こちらの値は低めに設定してください。

* LockFoot
この機能はカメラにぎりぎりつま先が入らない場合や入っても安定しない場合などにつま先の動きを固定します。カメラや動画で足が範囲ギリギリの場合はロックした方がいいです（はみ出ると正確な判定は出来ません）。つま先は動かなくてもそれほど不自然にはなりません。デフォルトでオンでも良いくらいです。
チェックを入れた時点で足首をロックします。動かしながらロックするとおかしな位置でロックされます。通常は初期位置でロックしたいと思うので、チェック後アプリケーションを再起動してください。

* LockLegs
膝から下の動きをロックします。LockFootのついでに作ってみましたが使い道はあまりないと思います。

* ElbowAxisTop
肘の回転軸を切り替えます。例えばジャージのような肘の外側にラインがあるようなテクスチャや、内側が陰になっているようなテクスチャの場合、何も考えずに腕を曲げるとテクスチャの見え方がおかしくなります。このようなテクスチャの場合肘の回転軸を切り替える事で内側外側をそれっぽい動きになるようにしています。ですが、腕を真上に上げると肘がねじれたように動いてしまいます。これをオンにする事で通常の肘の動きに切り替わり肘が自然な感じに動きます。ですが、テクスチャの見え方はおかしな感じになります。下図を見てください。上段は肘の内側に影があるテクスチャです。オフ時には内側に影がありますが、オンの時は外側に見えます。ですが、下段のようにオフの場合は肘がねじれたように見えます。腕が肌色か単色の場合はオンにしてください。もっといい方法がありそうですが、現状はこんな感じです。
![ElbowAxisTop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374813/3272dcce-51e9-1190-13bc-80a8edd24421.png)

* Trained Model
姿勢推定のモデルを選択します。スペックが足りている場合はHigh Qualityを選択してください。この項目を変更する場合はアプリケーションんを再起動してください。スペックが足りない場合は後述のLow Qualityモデルを使用してください。

### Record
![config_record.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374813/45152593-f597-e6f7-c64c-c0e3fdc76a67.png)
BVHの保存は、UnityのAsset StoreにあるBVH Toolsをそのまま使っています。Unityでデータを読み込みたい場合はこのAssetを使用するのが良いと思います。Githubはこちらのようです。オプションの説明もGithubをご覧ください。
https://github.com/emilianavt/BVHTools

* Blender coordinate system
Blenderへの読込、VRM Live ViewerやVMDへの変換の際にはオフで大丈夫の様です。このオプションはBlenderの座標系と一致するように変更し、Blenderで読み込んで修正した後に、またUnityで読み込むというような場合にはオンにした方が良いそうです

* Enforce Humanoid Bones
オンの時にはHumanoidのボーンしか保存しません。VRM Live ViewerやVMDへの変換の際にはHumanoidのボーンのみなのでオンのままにしてください。髪の毛や服などのボーンも出力に含めたい時はオフにしてください。

* Capturing
オンにすると指定したFPS固定でデータが保存されます。本当に指定した通りに保存されるのかは確認していません。

* CatchUp
これをオンに設定すると、「フレームレートが低下した場合にキャプチャフラグを使ってキャプチャを高速化し、キャプチャしたアニメーションの持続時間を正確に保つことができます。このフラグを無効にすると、キャプチャされたフレームの後に、与えられたframeRateに従って、1つのフレームが必要とするように、少なくとも多くのミリ秒が経過することを保証します。」だそうです。

### Others
![config_others.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374813/d6fd2125-a0cd-3d97-44a6-6174168fb5e6.png)

* Use Unity Video Capture
Unity Video Captureを有効にします。これは今表示している画面（メニューや設定画面は除く）をUSBカメラの出力とし、Zoom等の他のアプリケーションからカメラの入力として扱えるようにします（仮想カメラ）。詳細はUnity CaptureでZoomに出力を参照ください。

* Use VMC Protocol
VMC Protocolを使用してアバターのボーン情報と仮想トラッカーを送信します。ここはサンプルコードのままです。ブレンドシェイプは送信しません。VMC Protocolの受信もできません。まだテスト実装ですが、EVMC4Uでデータが受信できるところまでは確認しています（実はそれ以上のことはまだ理解していません）。
![vmpc_logo_128x128.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374813/145c9efd-b4a5-e894-88cc-44f07dafc980.png)

* IP
VMC Protocolのサーバーが稼働しているPCのIPアドレスを指定します。通常は127.0.0.1のままで良いはずです。

* Port
VMC Protocolのサーバーのポート番号を指定します。通常が何番なのかはわかりませんが、たぶん39539な感じです。

* Rot
ThreeDPoseTrackerは180度回転した背中を向けた状態になっています。チェックを入れることで180度補正をかけます。

* Restore Settings
設定を初期状態に戻します。アバターの設定も初期化されます。そのままアプリケーションを終了してください。


# BVHファイルについて
このアプリでは座標系が180度回転している状態になっています。正面から見て背中を向けている状態です。都合上、この方が作りやすかったのですが、少しの利点があるだけなので、ちょっと失敗したかなという気もします。とりあえずは出力後に180度回してください。
### VMDへの変換
出力したBVHファイルのVMDへの変換についてですが、B-MoMi ver.0.2で変換できるところまでは確認しました。B-MoMiのダウンロードおよび詳細な使い方については下記を参照ください。
http://atupdate.web.fc2.com/

ボーンマップは下記のように設定してください。キモは左腕右腕の40と-40です。通常はプラスマイナスが逆なんですが、上にも書いた通りこのアプリの出力は背中向きになっているます。そのため、TポーズからAポーズへの補正の値を逆にしなければならないようです（たぶん）。scaleはマニュアルを参考に適時設定してください。
BVHのボーン情報はBVHファイルをテキストエディタで開くと最初のHIERARCHYの項目に載っています。必要があればそれを参考にボーンマップファイルを修正してください（B-MoMiの-makeMapオプションでもボーンの情報は取れますが完璧ではなかったです）。

```boneMap_TDPT_1.txt
#
# ボーンマップ
#
# @scaleはセンターボーンの移動量を拡大縮小します
# 1.0で元データのまま。
# @scale=0.3

センター=Hips
左足=LeftUpperLeg
左ひざ=LeftLowerLeg
左足首=LeftFoot
右足=RightUpperLeg
右ひざ=RightLowerLeg
右足首=RightFoot
上半身=Chest
左肩=LeftShoulder
左腕=LeftUpperArm,0,0,40
左ひじ=LeftLowerArm
左手捩=LeftHand
右肩=RightShoulder
右腕=RightUpperArm,0,0,-40
右ひじ=RightLowerArm
右手捩=LeftHand
首=Neck
頭=Head
```

BVHファイルは、Blender coordinate systemをオフ、Enforce Humanoid Bonesはオンにして作成してください。保存したBVHファイルがmotion.bvh、ボーンマップファイルがboneMap_TDPT_1.txtとすると、コマンドプロンプトで下記のように実行すれば指定したBVHファイルと同名のVMDファイルが作成されます（パスは適当に直してください）。

```
C:\b-momi_02\b-momi>b-momi.bat -bvh motion.bvh -map boneMap_TDPT_1.txt
B-MoMi 0.2
BVH motion converter for MikuMikuDance

出力先:motion0723.vmd
BVHモデル身長=1.284616
ミク身長=15.5686
========
変換開始
========
@scale=12.11926365544256
========
変換完了 (motion.vmd)
========
```

あとはMikuMikuDance側で足のIKをオフにしてモーションを読み込んでください。環境によって処理速度が遅い場合は、モーションを読み込むと早回しの様になります。モーションの倍率などで調整してください（MMDあまり使った事ないので使い方が良くわかりません）。
試してみたのはここまでです。
![MMD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374813/1eef8f19-d1bf-aac0-3f04-780f84aa805a.png)


# 最後に
アプリのリリースについての記事をQiitaに書くのもなんか違うのかなと思いつつ、Qiitaに書くのが楽なのでもうしばらくはQiitaを使わせてもらいたいと思います。
次は奥行きの移動と足付き（床の判定）を考えたいと思います。ちょっと仕組み的に難しいのでできるかどうかはわかりません。
以下は前回のコピーです。
ちなみにこのアプリのソースは下記のリポジトリにあります（準備中）。コードのライセンスはGithubに書いてあるライセンスに従ってください。姿勢推定でのお仕事もしているので全て無料とはいかないのです。機能追加して商用で使いたいという方はライセンスを購入いただくかお仕事の依頼を下さい。どうしても無料で機能追加して商用利用したいという方は、このアプリ版は無料で通すつもりなので、マージの依頼なりプルリクなりを頂ければ、そのうちアプリに追加してリリースするかも知れません（保証はしません）。

https://github.com/digital-standard/ThreeDPoseTracker
### Licence
このThreeDPoseTrackerの実行ファイルについては営利・非営利問わずご自由にお使いください。この実行ファイルを使用した配信、モーションデータも同様にご自由に利用可能です。
GithubにあるソースコードについてはGithubにあるライセンスに従ってください。

### 免責事項
本ソフトウエアの使用に起因する、ソフトウエア、ハードウエア上の事故その他の損害、または使用できなかったことから生じる一切の損害に関して、製作者はいかなる責任も負わず、修正する義務を負いません。