REALITYのスマホで手を動かそうとした話
こんにちは、REALITYのUnityチームのizmです。本記事はREALITY Advent Calendar 2022の2022/12/4分になります。
去年の合宿ではVR版REALITY(実験的な取り組みでユーザの方向けにリリースしたものではありません)に専用ハードを追加することで足や腰も含めた全身を動かすという試みをしました。
https://note.com/reality_eng/n/nd102f12e7f78
今年も懲りずにトラッキングネタで参加しました。
現在のREALITYのアプリはスマートフォン内のカメラを使って顔の動きや表情をアバターに反映していますが、顔だけではなく手の動きも反映するものを開発合宿で作ってみました。
※この実装内容は開発合宿で行なった試験実装であり、将来のREALITYへの反映を約束するものではありません。
できたもの
手持ちのAndroidスマートフォン(Galaxy S21)で動かしたものがこちら!
こういった感じで顔だけではなく手も動かすことができています。
実装の中身
ここからは技術者向けの話です。
カメラの画像から顔と手の特徴点を検出するライブラリとしては最近MediaPipeがよく使われています。
今回はMediaPipeの中にあるFace,Handの学習データを元にカスタムグラフを作成して使用しています。(Holosticの方が適している気もしつつ、目線の取得精度がどうもFace単体の方がよかった、みたいな選定意図です)
このあたりの親子関係としては
各種の学習データ(たとえば顔認識など)ファイルを用意する
それぞれ入力や出力などの処理の流れをグラフをyamlで書く
グラフから特徴点データを受け取ってアバターに反映する。
という流れになっています。
つまりMediaPipeを使うアプリケーション開発者の利用難易度的には
- 既存のサンプルグラフをそのまま使う(簡単)
- 処理を組み合わせたり不要な処理を省いたりしたカスタムグラフを作る(普通)
- 学習データ自体を自前で作り直す(難しい)
という感じになっております。ちなみに今回採用した作戦は普通コースです。
Unity でのMediapipe利用方法
UnityでMediaPipeを使うには
NativeのiOS,Androidで使って検出結果をUnityに流す(Unity as a Library系)
MediaPipe Unity Pluginを使う https://github.com/homuler/MediaPipeUnityPlugin (homlerさんの実装)
BlazePoseBarracuda https://github.com/creativeIKEP/BlazePoseBarracuda を使う(作者のIKEPさんは実はREALITYにいます!)
など、いくつかの手段がありましたが、今回は2個目のMediaPipe Unity Pluginを使いました。
このプラグインはMacやWindows上ではCPUに処理を行わせる(GPU実装ではない)のですが、M1 MacのEditorでは30FPS以上が出ているので安心です!
適用手段
本当はもっとかっこいい動画が撮れるくらい進捗していたらよかったのですが
手の甲の特徴点群から手のひらの平面を推定
手のRectから奥行きを推定
指を手がかりに手の向きを取得
くらいまでで実装が力尽きてしまい、指の開閉は素朴な実装になってしまいました。が、原理的には幾つかの方策を思いついているので密かに実装を進めていきたいなと思っています。
終わりに
処理負荷が大変なことになりそうな気はしていましたが、イマドキのハイエンドなスマートフォンであれば顔と手のトラッキングで30FPSが(手元端末での検証では)維持できました。
みなさんの個性を表現するためのアバターの表現力をより高める手段の一つとして検討していきたいと思いました。
明日12/5(月)は ラーメン大好きキャラかと思ったら最近は愛犬にデレデレのナオヤさんによる位置情報APIを使った実験です。楽しみですね!