USBカメラモーションキャプチャーThreeDPoseTrackerの説明 

# ThreeDPoseTrackerとは
まずは下記の動画をご覧ください。画像をクリックすると別タブでYoutubeが開きます。
[![USBカメラだけでできる モーションキャプチャを作ってみた - Motion capture with USB Cam only - 【NT京都2020】](http://img.youtube.com/vi/r5jFaPtEW_k/0.jpg)](https://www.youtube.com/watch?v=r5jFaPtEW_k)
ThreeDPoseTracker v0.1.0 Introduction movie

他にもこの辺を見て頂くとわかりやすいかもしれません。
USBカメラだけでできる モーションキャプチャを作ってみた - Motion capture with USB Cam only - 【NT京都2020】
https://youtu.be/L0ieoaOD6Po

ThreeDPoseTrackerは、USBカメラや踊ってみた等の動画だけでモーションキャプチャーができるWindows10用アプリケーションです。ノートPCであれば内蔵のカメラを使えば追加の機材は必要ありません。ですが、ちょっと（かなり）強めのグラフィック環境が必要です。具体的にはGTX1050以上は欲しいです。これ以下でも動かないことはないと思いますが動作が遅くなります。
アプリケーションについてもう少し詳しく説明すると、機械学習で画像から3次元の人体の関節座標を出力するように学習した姿勢推定のモデル（バックボーンはResNet-34）を使用して、動画やカメラの画像から関節座標を推定し、その値を元にアバターを動かしています。
もともとは気の向くままいろんな機能をためていたのですが、あまりに取り留めのない状態になってしっていたので作りかけのコードは一旦止めて、今回は使えそうな機能だけを抜粋してv0.1.0としてまとめました。

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

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

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

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

## 動作環境
Windows10 Pro Ver.1909
Corei7-7700HQ
メモリ　16G
グラフィックカード　GTX 1070
以上で動作確認しています。
CPU、GPUはもう少し弱くても大丈夫と思います。GTX1060とか1050、もう少し下でも少し遅くなりますが動作はすると思います。上記の環境で20Fpsくらい。RTX2070Superで30Fps程度で動きました。グラフィックカードが無いPC用に推定精度を犠牲にして軽さを求めたLow Quaityモデルも用意していますが、かなり精度が犠牲になっています。あくまで雰囲気が感じられる程度です。それでも最近のCPUが必要です。試されたい方は後述のLow Qualityモデルを試すを参照ください。

## インストール

さっそくインストールしてみましょう。下記のURLからzipファイルをダウンロードしてください。

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

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

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

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

Ver.0.1.0ダウンロード
https://digital-standard.com/threedpose/ThreeDPoseTracker_Win_x64_v0_1_0.zip


ダウンロードして解凍すると「ThreeDPoseTracker_Win_x64_v0_1_0」というフォルダが作られます。
Setupファイル等はない為、このフォルダをデスクトップでもどこでも好きな所においてください。
このフォルダ内の「ThreeDPoseTracker.exe」が実行ファイルです。実行するとWindowsの保護のダイアログが表示されます。
画面上の「詳細情報」をクリック後「実行」ボタン押下で実行します。
![WinDlog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374813/d5e8152a-b1d9-2d71-8d8b-41536b3e532e.png)

## 画面の説明

起動すると下記のような画面が表示されます。
![scrn1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374813/6c5bd7b5-64b0-b63a-4697-56b35fddcfab.png)

まずは何も考えずに動かしてみましょう。下記のURLからサンプルの動画をダウンロードしてください。
https://github.com/digital-standard/ThreeDPoseUnityBarracuda/blob/master/Assets/Video/onegai_darling.mp4

ダウンロードが終わったら画面上部の「Load Movie」をクリック、ファイルの読み込みダイアログが開くので先ほどダウンロードしたonegai_darling.mp4を選択してください。
![scrn2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374813/5973de19-3baf-f68b-a566-802fafa4c679.png)


しばらくすると、お願いダーリンを踊ってみたの動画が再生されます（この動画は、*あこさんの「【あこちん】お願いダーリン【踊ってみた】https://www.youtube.com/watch?v=tmsK8985dyk 」の動画をご本人の承諾を得て使用させて頂いております。２次利用はお控えください）。
そして、この動画とともにUnity-chanが踊りだせは無事に起動は成功です。ここまででエラーが出る、Unity-chanが動かないなどがあれば、PCのスペックが足りないか、スペックは足りているはずであれば、Githubにあるソースからの起動を試していただく必要があります。

# 機能の説明
ここからはThreeDPoseTrackerの機能の説明を行います。
画面の上部に下図のメニューが表示されています。
![メニュー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374813/bc35172a-cb26-a8c3-e009-980be9d3ffd7.png)
### ①入力デバイス(Source Device)
ここでは入力のデバイスを設定します。入力として使用できるのは、mp4の動画ファイルとUSBカメラになります。アプリ起動時にUSBカメラが接続されていると、このプルダウンメニューの２つ目以降にカメラの名前が追加されます。アプリ起動後にカメラを接続しても反映されませんのでご注意ください。詳細は、動画ファイルでの推定とUSBカメラを使うの章を参照してください。
### ②アプリの設定（Configration）
ThreeDPoseTrackerアプリケーション全体の設定を行うダイアログを表示します。設定内容は後述のConfigration画面を参照ください。
### ③アバターの設定（Avatar）
ThreeDPoseTrackerでは、Vroid Studioなどで作成したVRMファイルを追加できます。どのアバターを使用するかはプルダウンメニューで選択できます。また、それぞのアバターの表示サイズや表示位置、スケルトンの表示非表示等を設定できます。詳細はAvatar画面を参照ください。
### ④モーションの保存（Record BVH）
BVHフォーマットのモーションデータを記録、保存します。FPSは動作中のFPS値を表示しているので、モーション作成の参考にしてください。
### ⑤閉じる（Close Menu）
メニューを閉じます。一度閉じたメニューは、ESCキーかスペースキーを押下する事で差表示されます。
メニューが非表示時に、マウスを左クリックすると下図のようにカメラの位置が変わります（４回目で元通り）。マウスホイールでズーム、右クリックでアバターが入れ替わります。ちょっとしたお遊び機能を追加しました。将来的になくなると思います。
![CamMove.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374813/9011ebae-e5ea-e472-1b07-13e27343dd46.png)

### 動画ファイルでの推定
![Movie.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374813/efaa4a65-9db6-878d-7312-1f2c4f173367.png)
動画ファイルから推定を行うには、Source Deviceが「Movie File」の状態で「Load Movie」ボタンをクリックしてください。ファイル選択ダイアログが開いたらmp4の動画ファイルを選択します。選択後、動画が読み込まれ、自動で動画が再生されます。動画が始まってから推定が始まるまで少しタイムラグがあります（スペックが足りないとかなり時間がかかる事もあるようです）。動画の先頭から開始したい場合は、あらかじめ動画の先頭に余白時間を設けるか、動画をリピート再生にして２回目から使用する等工夫が必要です。
また、動画再生委には、「Load Movie」ボタンの横に、「Pause」ボタン、フレーム数/全フレーム数、「skip」ボタンが表示されます。「Pause」ボタンを押すことで動画が一時停止します。もう一度押すと再開します。ただしこの時もアバターが動きだすまでラグがあります。一時停止中に、フレーム数を入力し「skip」ボタンを押すことで指定したフレーム移動することができます。「Pause」ボタンを押すとそのフレームから再生を行いますが、相変わらずラグがあります。
### USBカメラを使う
![StartCam.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374813/95a72d3a-bf76-a6d2-19f4-cb0e8e9d1abc.png)
アプリケーション起動時にUSBカメラがPCに接続されていば、それらのカメラがSource Deviceのプルダウンリストに追加されます。使いたいカメラを選択し、「Start Cam」のボタンをクリックするとカメラからの入力に切り替わります。他のカメラや動画に切り替えたい時は、そのまま選択しなおせば変更できます。ですが、あまりやりすぎると調子が悪くなります。
私はゲーミングノートPCをメインで使用していますが、内蔵カメラの写りはいまいちです。数千円でもいいので外付けUSBカメラの方がが良いでしょう。実際、私がメインで使用しているカメラは3000円しませんでした（残念ながら今はコロナ需要で値上がりしてます）。

# うまく推定するには
残念ながらどんな画像からでもバッチリ姿勢推定が行えるという物ではありません。ですが、ある程度条件がそろえばサンプルの動画のようにそれなりに推定ができ、モーションキャプチャとしても使用に耐えうる物になります。ここではそれらの条件を示したいと思います。

### ①一人用
対象は一人しか推定できません。また中心に近いほど感度が良くなります。以下は蛇足ですが、下図のように二人写っている場合では主に画像の左側の人物の方の姿勢を推定します。これは中心に近いためだと考えられます（が常にそうなる訳でもありません）。
さらにこの画像の場合右足の推定に問題がでます。左側の人物をメインにしますが、右側の人物の右足の方が中心に近いです。その為、右足の位置は右の人物の足を採用してしまいます。これは現在使用している機械学習（AI）のモデルが人体の構造（つながり）を学習しているのではなく、あくまで画像のパターンで腕っぽいもの、足っぽいのもをパターンで選択しているだけなので、より中心側の足が採用されてしまいます。ただ、動画やカメラの場合動いているとブレていたりハッキリ写ってなかったり写りによりかなり左右されます。いずれにせよ一人で写っていればこのような問題は発生しません。
![two.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374813/fce816a6-268e-324d-e079-c6039a658f00.png)

### ②全身を写す
とにかく全身が写るようにしてください。アプリ起動時に左上に白く表示されている小窓があります（下図）。実行すると背景に表示されている動画の一部が切り出され、この小窓に表示します。ここに表示されている画像がAIへの入力データになります。この画像に全身が収まっていないと正しく推定できません。サンプルの動画くらいの大きさから、もう少し大きくても大丈夫ですがこれ以上近づくと手を上にあげるとはみ出します。両手を上にあげて爪先から指先までがはみ出るくらいだとちょっと大きすぎです。問題ない事も多いですが、結果が暴れるようでしたら、少し下がるか入力画像の大きさを設定画面（後述）でSource Cut Scaleを0.9や0.8に調整すると結果が良くなることもあります。遠くは離れても画像の縦の5割くらいの大きさまでは判定できます。それ以上離れるとほぼ推定できなくなります（そもそも学習データにないので学習していません）。普通のカメラの場合だと２ｍ以上は離れる必要があります。
![input.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374813/c268a60c-2c6b-64e8-c1c4-7b0b6a0fc347.png)

### ③背景をシンプルに
これは理解して頂けると思いますが、背景はシンプルな方がいいです。少々散らかっていても大丈夫なのですが、特に人物の後ろに何もない方が精度はよくなります。例えば下図の場合、人物の右腕が見えません。そしてこの画像の場合肩から棒状のものが伸びています。右腕が見えていない為、積極的に右腕を探してこの棒を右腕と判断してしまう事があります（後述ですが、HeightQualityのモデルではこの画像では問題ないですがLowQualityのモデルでは腕と判定する事があります）。上の章で体のつながりは見ていないと書きましたが、少しは気にしているようです。また足元や足の間などに物が置いてあったりしても誤認識が多くなります。
![腕.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374813/3bd9ac67-972f-2e7e-3451-aa7488f2899e.png)

### ④服装もシンプルに
これも理解して頂けると思いますが、とにかくシンプルな方が良いです。シンプルにパンイチが手軽でいいように感じていますが、なかなかそうもいかない方もいるでしょう。背景色と異なる色のズボンとTシャツで体形がはっきりわかる服装が良いです。ジーパンも結構いい感じです。
ロングスカートは特にダメです。ほぼ足の位置がわかりません。それと短めのスカートも以外と厳しいです。前を向いているだけであればショートのスカートは問題ありませんが、足を開いて横を向かれると判定があやしくなります。下図はヒトがみれば左右の足の判定は可能だと思いますが機械には結構難しいです。さらに足を広げるとかなりあやしくなります（ヒトが見てもわからない場合もあります）。これに黒いタイツなんかを履かれるとさらに前後の関係が捉えにくくなり難しい事になります。横向きスカート黒タイツはなかなか鬼門です。これが結構多いんです。左右の足を誤認識すると瞬間的に切り替わるので、動きがかなりバタついて見栄えがかなり悪くなってしまいます。
前を向いているか後ろを向いているのかは、顔が見えるかどうかにかなり依存しています（顔だけで判断している訳ではなさそうです）。髪の長い方が踊っていると頻繁に顔が隠れます。この時に後ろ向きと判断されるとそのフレームだけ左右が入れ替わる事になるのでアバターが大きく暴れる事になります。また帽子も後頭部に明るめや派手な帽子をかぶっていると後ろを向いていても前向きと判断されてしまう事もあります。
![下半身.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374813/7893d07c-9fbe-6ca6-6276-88489c51e9bd.png)

### ⑤動画について
動きの速いアクションや踊ってみた等の動画は意外にブレて手足が写りません（下図）。ある程度は見えなくても推定するように学習していますが限度はあります。スポーツ等の動画は腕の動きがほぼ何も見えない事もあります。このような場合は予めスローで録画するなどの工夫が必要になってきます。また、ハイキックやスポーツ中の動きなどの特異なポーズの認識はかなり精度が悪くなります（これも学習データに無いため。少しは入っているのですが）。
それと動画はカラーの方が良い結果になります。白黒しかない場合は仕方ないですが（仕事では白黒用に再学習したモデルがあり、やはり白黒用に学習した方が精度が良いです）。
![はやい.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374813/2d491f1f-80c9-b7e7-01ab-9fd6ee508f8f.png)

### ⑥その他
座っている姿勢、とくに三角座りや正座、寝ていたりする姿勢は正確に推定できません。あと逆立ちも苦手です。また上に書きましたが顔が見えなくなるくらいにお辞儀の状態になると前後不定になり暴れます（むしろ後ろ向きだと判断する事の方が多いかも）。

# Configuration画面
ここではアプリケーション全体の設定を行うConfiguration画面について説明します。
![Config.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374813/86157fd5-22f2-cc94-ab06-d30f7a445172.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以上の値を指定すると拡大されます。
![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)

* Low Pass Filter
飛びやブルブルを抑える為のフィルターです。Height Qualityモデルであれば0～0.2程度が妥当です。大きくするとなめらかになりますが、遅延と動きが放漫になってきます。

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

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

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

* Show Background
アプリケーション背景画像の表示非表示を設定します。デフォルトの画像は外国のお城の画像です。

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

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

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

* 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度補正をかけます。

* OK、Cancel、Apply
ダイアログは半透明になっており、「Apply」ボタンでで画面は閉じずに状態が反映されるので、確認ながら設定できます。「OK」、「Apply」ボタンで設定が保存されます。

### Low Qualityモデルを試す
PCのスペックが足りない場合は、Low Qualityのモデルを使用してください。Configuration画面のTrained Modelのプルダウンメニューで「Low Quality and Faster」を選択し、アプリケーションを再起動してください。
![LowQuality.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374813/4c9f4df0-16b2-7994-2200-3418a3ea62ba.png)
Low Qualityモデルは残念ながら姿勢推定の精度はものすごく悪いですが高速に動作します。グラフィックカードのないPCでもそれなりに動作します。ですがある程度新しいCPUじゃないと動かないかも知れません（i5-7500のグラフィックカード無しで12fps程度でした。i3やこれ以下だと動かすのは難しいかも知れません）。あくまでどんな感じかなと雰囲気がわかる程度と考えてください。実際、後ろ向きや背景にいろいろあるとまともに認識しません。
逆にハイスペックなPCでLow Qualityモデルを実行すると早すぎになります。かなり動きも暴れてしまうのでLow Pass Filterのあたい0.5以上の極端な値にしてください。ただ、あまり動かす意味はないと思います。まだ、このアプリで使用しているモデルは精度を上げる余地はまだ残っています。特にこのLow Qualityモデルは精度をもっと上げたいと考えております。

### Unity CaptureでZoomに出力
Unity Video Captureを有効にすると、Zoom等のカメラを使用したアプリケーションに画面のイメージを出力する事ができます。ただし、お使いのPCにUnity Captureのドライバをインストールする必要があります。下記のGithubのリポジトリからDownloadZipでzipファイルをダウンロードしてください。解凍後、InstallCustomName.batを管理者権限で実行してください。カメラの名前も変更できます。このアプリではこのバッチファイルのデフォルト名のUnity Video Captureの名を使用しています。
Zoom側ではカメラをUnity Video Captureに設定する事でThreeDPoseTrackerの画面が表示されます。ただZoomの配信は画質をかなり落として配信するため、細かなディテールはつぶれてしまいます。Zoomで画面共有を行うと画質はきれいに出力されますが15fps程度での配信になります。
それと残念な事にUnity Captureが有効になっている時にThreeDPoseTrackerのウインドウが背面にまわると、次にウインドウがアクティブになった際に画面が白くなって固まります。動作は続けて動いているので配信は問題ありませんが、設定等は変更する事ができなくなります。ウインドウ閉じて無理やり終了してください。原因は今の所不明です。初めからOBSとかを使った方が話が早いかも知れません。
https://github.com/schellingb/UnityCapture
![zoom.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374813/20a467d5-9dc9-ae7e-4e8e-3c0b5d10cd64.png)

# Avatar
ThreeDPoseTrackerでは複数のアバターを切り替えて動作させることができます。Avatarのプルダウンメニューからアバターを選択する事で変更できます。初期状態ではサンプルとしてunity-chanとyukihiko-chan（私のリアルアバター）の二体が入っています。どちらも公序良俗に反するような利用はお控えください。
### Avatarの追加
ThreeDPoseTrackerではVRM形式のアバターを追加できます。主にVRoid Studioで作成したVRMファイルを前提にしています。まずはサンプルのTait.vrmファイルを下記からダウンロードしてください。
https://github.com/digital-standard/ThreeDPoseTracker/tree/master/Avatars

ダウンロードが終わったら、「Add Avatar」のボタンをクリックしてください。下図のダイアログが表示されます。「File」ボタンをクリックし、先ほどダウンロードしたTait.vrmファイルを選択してください。他の項目はそのままで大丈夫です（この画面の項目については次節のAvatar Settingの画面と同様ですので、そちらを参照ください）。「Add」ボタンをクリックするとダイアログが閉じ、しばらく待っているとVRMファイルが読み込まれアバターが切り替わります（ちょっと時間がかかります）。新しく読み込まれたアバターはプルダウンメニューの最終行に追加されています。以降追加される順に増えていきますが、あまり追加すると起動に時間がかかります。
![AddAvatar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374813/5d0315c2-0e3d-45e4-a831-7653e93c085a.png)

### Avatarの設定
ここではアバターに対して設定できる項目を説明します。
![AvatarSetting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374813/fd33fb02-7287-ff61-8b1f-a001727c7796.png)

* VRM File
VRMファイルがあるファイルパスを指定します。「File」ボタンで選択ダイアログが開きます。起動時にファイルが見つからないと読み込まれません。アプリ起動中に変更した場合は、アプリを起動しなおした先に反映されます。

* Avatar Name
Avatarのプルダウンメニューに表示する名称を設定します。

* Default Position
アバターの表示位置を設定します。例えば動画の踊り手とアバターを並べたい時はXを0.8程度で指定すると、アバターと踊り手と並んだ感じになります。

* Depth Scale
前後の移動の比率を設定します。ThreeDPoseTrackerでは、人物がカメラからどれくらいの位置にいるかはわかりません。奥行きの原点は常に腰の位置であり相対値です（縦横は画像の座標です）。そのため前後の移動は身長から割り出した比率で離れたか、近づいたかを判断しています。幸い３次元の距離が出せるので体を曲げていたりしても大体の身長が割り出せます。踊ったり、ジャンプしたりすると人の体はだいぶ伸びるんですが、その辺はまあざっくりと。。。前後の動きは単純な比では出ないのですが、現状は単純比です。ここではその比率を変更できます。この値を大きくすると少しの変化で大きく前後します。

* Scale
アバターの表示サイズです。大きくすればアバターが大きくなります。

* Face orientation
アバターの顔の向きを補正します。ほとんどの場合ｙを微調整するだけで済むはずです。マイナス値を入れれば上に向くはずですが、あまり期待通りに動いていません。設定はアプリの再起動で反映されます。

* Skeleton
姿勢推定AIの結果を緑の線（Skeleton）で表示します（厳密にはAIの結果だけではないです）。表示非表示を切り替えます。
![skelton.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374813/7743b8f9-3623-87b7-b423-d2dd7317b96c.png)

* Default Position
Skeletonの表示位置を設定します。

* Scale
Skeletonの大きさを設定します。

* Remove
読み込んだアバターをメニューから削除します。unity-chanとyukihiko-chanは削除できません（unity-chanは次のリリースくらいから同梱しなくなるかもしれません）。

* OK,Cancel,Apply
ダイアログは半透明になっており、「Apply」ボタンでで画面は閉じずに状態が反映されるので、確認ながら設定できます。「OK」、「Apply」ボタンで設定が保存されます。


# モーションの保存
メニューの「Record BVH」ボタンをクリックすることでモーションをBVHフォーマットで保存する事ができます。が、まだテスト実装です。「Record BVH」ボタンをクリックするとRecordingに表示が変わり記録を開始しします。もう一度クリックで終了し保存ダイアログが開きます。モーションファイルはBlenderなどでモーションデータとして読み込むことができます（たぶん）。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">たまにThreeDPoseでモーションを保存したいと問合せが来るので試してみました（聞かれても全く知らない）。BVH Toolsを使ってBlenderに持って行ってみたけど何とかなるかな。コードちょっと直さなあかんな。 <a href="https://t.co/9yW3uccRBZ">pic.twitter.com/9yW3uccRBZ</a></p>&mdash; Yukihiko Aoyagi (@yukihiko_a) <a href="https://twitter.com/yukihiko_a/status/1271455947546718209?ref_src=twsrc%5Etfw">June 12, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 最後に
もともと趣味で作っていたので役に立たない機能をたくさん追加して遊んでいましたが、一旦それらのコードは無くしてそれなりに使えるアプリにまとめてみました。まだバグだらけだし、アプリの方向性も決まっていないので、ｖ0.1.0としてのプレリリースです。もう少しアプリとしてまとまれば会社の方から正式版をリリースするかも知れません。
ちなみにこのアプリのソースは下記のリポジトリにあります（準備中）。コードのライセンスはGithubに書いてあるライセンスに従ってください。姿勢推定でのお仕事もしているので全て無料とはいかないのです。機能追加して商用で使いたいという方はライセンスを購入いただくか（現在ライセンス販売は停止しております(2021/01～)）お仕事の依頼を下さい。どうしても無料で機能追加して商用利用したいという方は、このアプリ版は無料で通すつもりなので、マージの依頼なりプルリクなりを頂ければ、そのうちアプリに追加してリリースするかも知れません（保証はしません）。

https://github.com/digital-standard/ThreeDPoseTracker

### 今後やるかもしれない事
* 前後の動きが適当過ぎるので、もう少しちゃんと計算した動きにする
* 肘関節の曲げ方をよくしたい。これは無理なのかも
* 手首の回転もまだおかしいかな。なおす
* 足が左右入れ替わるのを何とかする。これはロジックで何とかできると思う
* モーションの保存をちゃんと作る
* VMC Protocolフルサポート。たぶんこれはやらないかも
* 被写体に合わせたカエラの追跡機能
* 推定の処理が重すぎる。改善できたらOpenVRへの出力とかもやりたい
* その他、余計な機能の追加（例えば背景にパワポ表示するとか）
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">姿勢推定・アバターを使って登壇システムを作ってみました。次のLTはこれでやる（予定は無いけれど）。<br><br>LT風のデモです。夜中に一人LTはツライ。<br>音声あり、Zoomの録画機能での動画です。 <a href="https://t.co/heNLqfdOyS">pic.twitter.com/heNLqfdOyS</a></p>&mdash; Yukihiko Aoyagi (@yukihiko_a) <a href="https://twitter.com/yukihiko_a/status/1266791734253506560?ref_src=twsrc%5Etfw">May 30, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


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

Unitychan
We follow the Unity-Chan License Terms.
https://unity-chan.com/contents/license_jp/
![Light_Frame.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374813/25e55e10-5770-4926-7837-6840ffffc419.png)

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