はじめに
先日このようなツイートを見かけました。
3次元姿勢推定のサンプルコードをGitHubに公開しました! https://t.co/XNEMiWy60P
— デジタル・スタンダード公式 (@digistaofficial) February 13, 2020
指定した動画ファイル / Webカメラ の映像を3D姿勢推定し、Unityちゃんをリアルタイムに動かしています!
(ResNet34ベースモデルをBarracudaにてロード)
GitHubの★を宜しくお願いします! pic.twitter.com/DB7DG70Xas
この三次元姿勢推定を用いて、お手軽にモーションキャプチャをしてゲームなどのキャラクターのモーション(AnimationClip)を作れるのでは?と思ったのでやってみました。

必要なものは普通のカメラ一つだけなので、これほど導入が簡単で個人でも楽々利用できるのは革命的なのではないのかなと思ったり。
ただしGitHubのライセンスは必ず読んでから利用するようにしましょう。
では早速やっていきます。
環境
Macbook pro 2019 16-inch (GPUは強ければ強いほど良いです)
Unity 2019.2.17f1
UnityRecorder v2.1.0
ThreeDPoseUnityBarracudaをダウンロード
まずは先程Twitterで紹介されていた3次元姿勢推定のプロジェクトであるThreeDPoseUnityBarracudaをダウンロードします。
慣れているかたはcloneをしてもいいですが、今回は分かりやすくDownload ZipにてZipをダウンロードして解凍をしました。

またこのプロジェクトはBarracudaという機械学習のライブラリを用いていて、学習済みデータを必要とします。
その学習済みファイルである.onnxを以下のURLからダウンロードしておいてください。(更新される可能性があるので、GitHubにあるURLからダウンロードした方がより良いです)
http://digital-standard.com/threedpose/models/Resnet34_3inputs_448x448_20200212.onnx
プロジェクトを開く
ダウンロードしたプロジェクトを開き、先程ダウンロードしたonnxファイルをAssets / Scripts / Model /の中に配置してください。

Sceneフォルダに入っているSampleSceneを開きます。

BarracudaRunnerゲームオブジェクトのインスペクターにあるNN Modelという欄に、先程Assets / Scripts / Model /にいれたNN Model(onnx)を選択します。

ウェブカメラを使う
ここまでの準備ができたら、再生ボタンを押すと実際に3次元姿勢推定が始まるはずです。

このようにビデオで行いたい場合は、Video PlayerゲームオブジェクトのインスペクターにあるVideoPlayerコンポーネントのVideo Clipを変更することで動画を変更することができます。

ただし自分のモーションを録画した場合には、ウェブカメラを使うこともできます。
やり方は簡単で、MainTextureゲームオブジェクトにインスペクターにあるVideo CaptureコンポーネントのUse Web Camにチェックを入れることでできます。

UnityRecorderをインポートする
Unityちゃんの動きを録画するにあたって、3次元姿勢推定のプロジェクトの作成者はEasy Motion Recorderを推しています。
ただし似たような機能で、Unityの公式が出しているUnity RecorderでもGameObjectの動きをAnimationClipに記録できる機能があります。
公式という安心感からこちらでやっていきたいと思います。
インポートするにはAsset Storeではなく、Package Managerを用いて行ってください。

モーションを録画する
録画するにはまずWindow -> General -> Recorder -> Recorder Windowからウィンドウを開きます。

Add New RecordersをクリックしてAnimation Clipを選択します。
FrameRateのPlayBackをConstant -> Variableに変更することで、より滑らかなアニメーションが録画できるはずです。
次に対象のゲームオブジェクトを選択してください。

最後にRecorded Target(s)をEverytingにすることにより設定は完了になります。

あとは再生ボタンより3次元姿勢推定を行い、撮りたい時にSTART RECORDINGを押せばOKです。
終了したいときにSTOP RECORDINGを押せばAnimationClipが出力されます。

AnimationClipについて
AnimationClipのAnimationTypeにはGenericとHumanoidの2種類(一応Legacyもある)があります。
UnityRecorderで撮影した場合はAnimationTypeはGenericで出力されます。
しかしUnityちゃんなどの人型モデルではHumanoidの方が良い場合も多々あると思うので、変換したい場合は以下の記事を参考にしながら変換してみてください。
さいごに
3次元推定のときにカクカクになってしまう場合にどこがネックになっているかを調べてみたところ、GPUが足りないっぽかったです。
Barracudaは強化学習をするライブラリなのでおそらくそうだろうなと思いましたが、逆にCPUはかなり暇を持て余していたのでここをうまく計算のお手伝いができればもっとパフォーマンスが出そうだなっと思ったり。
加えてWebカメラでモーションキャプチャをするよりも、一度撮りたいモーションの動画を撮った後にそれを3次元姿勢推定した方が安定していて、パフォーマンス的にも良さそうでした。
是非うまく活用してみてください。
ではまた。