[Unity]Mediapipe FaceMeshの顔の向きの推論について

Unity

雑な感想

OpenCVのSolvePnPを使って顔の2次元座標を入れれば角度は簡単に取れるが、そもそもMediapipeは3次元座標で推論するからベクトルで計算するので十分じゃね?という話
(OpenCVのライブラリ自体が結構ヘビー級なのでMediapipeと組み合わせるにしても自前で軽量なCoreビルドを作る必要があったり、そもそもMatクラスに変換するオーバーヘッドが無視できない)

どうアプローチしてゆくか

3次元空間にMediapipeの結果をプロットした図

まずMediapipeのリポジトリの画像から468点の頂点Indexは把握しておく。

特徴点Index
鼻先1
鼻先とY軸が近い顔のエッジ(左,右)361, 132

これで「顔面の左右のポイントの中間から鼻先までのベクトル」を顔の向きの近似値として、SolvePnPに頼らない方向の算出が行える。

まあ大体こんなもんでしょう。
精度が欲しければ比較する頂点の数を増やすとか、前のフレームを加味するなどのアプローチはあると思いますが割愛。

参考