見出し画像

Now in REALITY Tech #57 REALITYのフェイストラッキングにMediaPipeを導入しました!

こんにちは。UnityチームのIKEPです。
ユーザの方々にはお馴染みかと思いますが、REALITYアプリではフェイストラッキングにより、自分とアバターの表情を同じように動かすことができ、REALITYアプリの重要な機能の1つとなっています。
そのフェイストラッキング処理ですが、実は今週のREALITYアプリのアップデートで、一部の端末で大きく変わりました。
今回の記事はリリースされたばかりの新しいフェイストラッキングについて、実装担当をさせていただいた僕からお届けします!

そもそも今までのREALITYのフェイストラッキングはどうなってたの?

↑の表のように、REALITYアプリにはREALITYアバターを動かすためのフェイストラッキング手法がいくつか存在します。
REALITYアプリではスマートフォンの機種に応じて、複数のフェイストラッキング手法の中から最適な手法が選択され利用されています。

今回これらのうち、Facemojiを利用した手法を別の手法に置き換える必要があっため、代替となるフェイストラッキング手法を開発することになりました。
新しいフェイストラッキング手法を開発する上で、様々なフェイストラッキングライブラリを検討した結果、今回MediaPipeを導入することになりました!

MediaPipeとは?

MediaPipeは、Googleが開発した映像から様々な情報を推定することができる機械学習ソリューションです。
MediaPipeには様々な用途のソリューションが存在しますが、その1つとしてMediaPipe Face Mesh が存在します。
これは、入力された画像から顔の各ランドマーク(特徴点)を推定することができるものです。

今回、REALITYアプリにMediaPipe Face Meshを組み込むことで新しいフェイストラッキングを実現しました!

このように顔の各ランドマークが推定可能です(MediaPipe公式の画像より)

どうやってMediaPipeを組み込むか

REALITYのアバターを動かす部分はUnityによって開発されています。
そのため、Unity上でMediaPipeが推定した顔のランドマーク情報を取得する必要があり、そのためには、

  • MeidaPipeをiOS, Android側に導入&推定処理を行い、推定結果のみをUnityへ渡す(Unity as a Library方式)

    • REALITYアプリはiOS, Android, Unityの合体により作られているため、それぞれのエンジニアがいれば可能

  • MediaPipe Unity Pluginを利用する

    • ネイティブプラグインの部分が実装されているため、UnityエンジニアのみでMediaPipeによる推定開始から推定結果の取得まで可能

  • HolisticBarracudaを利用する

    • 僕(IKEP)がプライベートで開発したものであるため、利用は容易

    • UnityのComputeShaderとBarracudaを利用しているため、Unityに完全に内包された構成

が考えられます。
今回は、REALITYへの組み込みにあたって技術要件と工数の点からMediaPipe Unity Pluginを利用することにしました!

MediaPipe Unity Pluginはドキュメントが非常に丁寧に用意されているため、これらに従うことでライブラリの準備、推定の実装が可能です!
大まかには

  1. 事前準備

    1. Pluginをビルドして、Unity Packageを作る

    2. MediaPipeの推論グラフを定義する(MediaPipe Visualizerを使うと便利!)

  2. アプリでの処理実行

    1. 推論グラフを読み込んでMediaPipeを初期化する

    2. カメラ映像を入力し、推定結果を取得する

という流れになります。

推定したランドマーク情報からアバターを動かす

あとは、推定結果をもとにREALITYアバターを動かしていきます。
この辺りの実装は「これ!」、といった正解がなく手探りで実装していくしかないため非常に難しい開発ですが、同じくUnityチームのスーパーエンジニアのizmさんによってREALITYアバターが可愛く動くようになりました!!
izmさんの以前のブログ記事はこちら↓

(この記事は実は、REALITYアプリへのMediaPipe導入の開発中だった時にizmさんの遊び心で手も動かしてみたいという検証だったのです。本記事の「フラグ」のようになってしまいましたね…w)

例えば「目が瞬きする」を実装する場合は

  • 目がぱっちりしてる人とそうでない人

  • メガネを掛けている人とそうでない人

  • スマホと顔が近い人とそうでない人

など、REALITYのユーザにはそれぞれ個人差があります。

こういった個人差を吸収するために、例えば制御工学で言うところのAuto Gain Controllのような仕組みを入れて、大体のユーザが正しく瞬きを検知できるようにしています。

実装中は社内の様々な人に試してもらいながら、感性評価をしつつパラメータチューニングをしていきました。
iOSのARKit(あるいは他のライブラリ)は、こういった「目の開き具合」のパラメータが直接取得できるので便利ですが、MediaPipeはそういった機能が存在しないので変換ロジックをウンウン考えながら実装することになります。

(一部の知見はこのスライドでizmさんが発表済みのようです)(izmさんはLuppetというアプリでも同様の表情制御を実装したことがあるそう…。すごい…)


REALITYで最も精度が高いフェイストラッキング手法とされているiOS ARKitと、今回のMediaPipeを使った手法の比較がこちら!!

Android端末とiOS端末を横に並べて同時にフェイストラッキングを行った比較動画
左: MediaPipe、右: ARKit

全く異なるフェイストラッキング手法でありながらも、アバターの表情や動きがほぼ同じように動いているのがお分かりでしょうか?

おわりに

下記の表のように、今週のREALITYアプリのアップデートでMediaPipeを利用したフェイストラッキング手法が一部端末で利用可能になります!
もし対応端末でしたら、新しいフェイストラッキングをぜひ試してみてください!

今回REALITYアプリにMediaPipeを導入することができ、かつ、MediaPipeは手や体の姿勢の推定を行うソリューションも備えています。
そのため、アバターの手や体もトラッキングによって動かすこともできるのではないかという期待が膨らみます!!
個人的には、将来的にもっとみなさんの個性をアバターで表現できるように、検討していけたら良いなと思いました。