[Unity]Mediapipe FaceMeshの顔の向きの推論について
![[Unity]Mediapipe FaceMeshの顔の向きの推論について](/images/uploads/2024/07/d13f6bfe344430104d4662707c9f80ff.webp)
雑な感想
OpenCVのSolvePnPを使って顔の2次元座標を入れれば角度は簡単に取れるが、そもそもMediapipeは3次元座標で推論するからベクトルで計算するので十分じゃね?という話
(OpenCVのライブラリ自体が結構ヘビー級なのでMediapipeと組み合わせるにしても自前で軽量なCoreビルドを作る必要があったり、そもそもMatクラスに変換するオーバーヘッドが無視できない)
どうアプローチしてゆくか
![[Unity]Mediapipe FaceMeshの顔の向きの推論について](/images/uploads/2024/07/d13f6bfe344430104d4662707c9f80ff.webp)
3次元空間にMediapipeの結果をプロットした図
まずMediapipeのリポジトリの画像から468点の頂点Indexは把握しておく。
| 特徴点 | Index |
|---|---|
| 鼻先 | 1 |
| 鼻先とY軸が近い顔のエッジ(左,右) | 361, 132 |
![[Unity]Mediapipe FaceMeshの顔の向きの推論について](/images/uploads/2024/07/24bf443fc988b560f3d7d77f606e5527-1024x862.webp)
これで「顔面の左右のポイントの中間から鼻先までのベクトル」を顔の向きの近似値として、SolvePnPに頼らない方向の算出が行える。
![[Unity]Mediapipe FaceMeshの顔の向きの推論について](/images/uploads/2024/07/3bfefac8220d78aa2f110311caeb6d64.webp)
まあ大体こんなもんでしょう。
精度が欲しければ比較する頂点の数を増やすとか、前のフレームを加味するなどのアプローチはあると思いますが割愛。