はじめに
先日このようなツイートを見かけました。
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次元姿勢推定した方が安定していて、パフォーマンス的にも良さそうでした。
是非うまく活用してみてください。
ではまた。