Nuitrackを使ったサービスやりました(概要だけ)

# 誰も使っていないんじゃないか？というNuitrackを使ってサービス作りました

　デジタルサイネージジャパン2018のエムツーブースにて、nuitrackを使ったPoseEstimationサービスをリリースしました。
[参考ツイート](https://twitter.com/panoravr/status/1006749022399311873)

　Nuitrack開発時にググっていると、日本語の紹介記事はちょろちょろ見かけるものの、実際に『サービスにまで持って行った』という記事は見つかりませんでした。(※2018年2月時点)

　どうも誰もやってない可能性が高いnuitrackを、Intel RealSense D415と組み合わせて使うまでの試行錯誤を、記録として残します。

## サービス概要

　E-moteという2Dの多変形キャラクター描画エンジン(このジャンルの説明が難しいのですが、メッシュ変形するスプライトを大量に合成している)のタッチでコミュニケーションするアプリに、ツーショット写真を撮る機能を追加しました。

　写真撮影時はプレイヤーが離れている都合上、UI操作の為に液晶にタッチできないため、PoseEstimationを使ってトリガーにしています。

<img src="https://qiita-image-store.s3.amazonaws.com/0/21149/5faee0d2-c840-8253-a853-e23eba36fb14.jpeg" width=50%>


### ターゲット環境
　以下の開発環境で動作しています。RealSenseのFirmWareは出来るだけstableで直近の奴にupdateしておくのがいいかと思います。

* Windows 10 64bit
* Visual Studio Community 2017(Unity入れると一緒に入る奴)
* Unity 2017.1
* Intel RealSense D415(FW:05.09.09.02)

### Nuitrackの入手
　インストールとか説明すると長くなるので割愛します。ググったら導入の記事が見つかるので活用してください。
　なお、無料版だと5400frameで試用が終了します(30fps計算で3分)

![nuitrack_c11_sample_screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/21149/457255d8-6cdd-6160-b1dc-0af103f7ef52.png)


　この試用終了ですが、nuitrackのライセンスがきちんと認証されていない場合(レジストしたRealSenseと違うRealSenseを接続している等)、画面に試用版等は表示されずにいきなりtdv::nuitrack::LicenseNotAcquiredExceptionが飛びますので、きちんとcatch出来るようにしておきましょう。

　これを忘れていてハマりました。
　『開発機で安定してるのに本番機で落ちる！ナンデ？』
　という状況だったのですが、恐らくnuitrackのライセンスは「PC環境+RealSenseのシリアルナンバーの組み合わせ」で作成されています。

[nuitrack.com](https://nuitrack.com/#rec43669110)に以下の文章があるのですが、センサーを別のPCに移すとLicenseNotAcquiredExceptionが飛びましたので、PCとSensorは1:1の関係でライセンスされる、と考えるのがいいかと思います。

>**Is Nuitrack Pro license linked to the hardware or to the sensor?**
>The Nuitrack license is associated with a sensor serial number. Besides, the hardware that you use is also checked at Nuitrack runtime. The license is non-portable, but you can to reactivate the license if you use new hardware with the same sensor.


# 前提になるSkeltonについて簡単に説明

　PoseEstimationで取れるSkeltonがどのようなものか、を説明すると

## 取れるSkelton情報

　どのようなSkeltonが取れるかをNuitrackの公式画像から引用します。
　http://download.3divi.com/Nuitrack/doc/classnuitrack_1_1Skeleton.html
![skeleton_scheme.jpg](https://qiita-image-store.s3.amazonaws.com/0/21149/13f17bff-44ae-1fca-3e19-94a666868843.jpeg)

　Kinnectを触ったことのある人なら、だいたい同じであることに気がつくかと思います。親子関係をちょっといじれば既存コードの使いまわしが楽です。[Kinnect v2でnuitrackを動かすアセット](https://assetstore.unity.com/packages/3d/characters/kinect-v2-examples-with-ms-sdk-and-nuitrack-sdk-18708)も出ているので、そのまんまプロジェクトを使いまわせるかと思います。

　人体の形をしているとSkeltonが検出できますので、下のようなトルソーがあるとデバッグが捗ります（マジで）
<img src="https://qiita-image-store.s3.amazonaws.com/0/21149/8c0c448f-7475-72be-e0a8-4e25a3a88c99.png" width=50%>

# 無茶な使い方をしてみる

　本来なら撮影対象の中心の高さに水平に置く想定のnuitrackなんですが、どこまで無茶振りな使い方をできるか、を試してみました。
　下の図は高さ2000mmに設置して、45度ぐらいの俯瞰で撮影した結果です。一度認識させるとこの角度ぐらいまでなら追従しています。椅子に座っているので椅子も連続した扱いになっていますが、Skeltonはちゃんと人体の形に沿っています。
![pose_estimate_by_nuitrack_over_desk.png](https://qiita-image-store.s3.amazonaws.com/0/21149/7ae6916d-8821-4959-f737-bd1ed4d10b0f.png)

## 実用になるレベルの無茶振りライン

　Nuitrackは股関節付近から上が撮影されないとPoseEstimationが開始されないようなのですが、これをそのままサービスに導入すると、カメラの前から2m強離れる必要があり、サービスとしては非常に導入しにくいものになります。これはKinnectでも同様だと思います。
　これをサービスレベルに落とし込むために、モニターから1.5m前後で認識できるようにカメラをモニターの頭上に設置し、俯瞰にして対象物までの距離を稼いで対応しています。
　股関節が写っている必要があるのに、あえて俯瞰にする理由は、下側にカメラがあると女性が非常に嫌がることを想定しての運用です。盗撮目的では無いにしても、スカートの女性はローアングルのカメラに近づきたいとは思わないはずです。

　E-mote Communicatorでは、以下の組み合わせの取り付けジグを3Dプリンタで作成してテストしています。検証ターゲットの身長は1700mmです。
<img src="https://qiita-image-store.s3.amazonaws.com/0/21149/89bac44a-d3ec-343c-2ddf-e222a7a77d2a.jpeg" width=50%>

| 高さ(mm) | 角度 | 1.5mでの認識 |
|------|--------|-----|
| 2000 | 20度 | △ |
| 2000 | 30度 | △ |
| 2000 | 45度 | X |
| 2100 | 20度 | △ |
| 2100 | 30度 | O |
| 2100 | 45度 | X |

　表にほとんど○が無いのは、何らかの問題があるからです。
　具体的には、下半身のskeltonが取れない、認識そのものが不可能、という状態で、フルボディを取得するには、ほぼ角度をつけられないという検証結果を得ています。

次の投稿で、実際にUnityで使うところを説明します（気力と時間をください）