これはHead Pose Estimation using OpenCV and Dlibを参考にTensorFlow.jsのfacemeshにSolvePnPを用いた顔向き推定の実装の備忘録です。
前書き
調査前はVTuberが顔動かすのが当たり前の時代ですので大概のライブラリで顔向き推定は実装しているものかと思っていたのですが、どうやらそうではないようです。
それなりに高速に動くface-api.jsでは議論はあれども実装は進んでいない状況ですし、jeelizFaceFilterはlive demoを見る限り速度、精度共に微妙そうです。
調べた中ではML Kitの顔認識で実装しているようですが、今回はブラウザで試してみたいのでML KitはiOS/Android用ですので検証しないことにしました。
そこで高速で精度良いfacemeshに顔向き推定を実装をするのも面白そうだと思い試しました。
実装について
Head Pose Estimation using OpenCV and Dlibを元に実装しまして、Rotation Matrix to Euler Anglesの方法でEulerAnglesを求めました。
実装して解ったのですが、SolvePnPは結構な頻度で外れ値を出します。
そのため、フレームレートを稼ぐのに難があります。
また、facemeshは3D座標を持っていますのでもっと簡単な計算で算出できそうなことに後から気づきました。
これから試す人はオンラインデモを参考にあとで後悔しないようお気をつけください。
OpenCV.jsのビルド
solvaPnP、Rodriguesの関数が必要で、OpenCV.jsをビルドしたのですが、そのままだと9.7Mありましたのでcore only buildをしまして、solvaPnP、Rodriguesを追加したうえで、2.5Mまで縮小することができました。
製作物
Tensorflow.jsのfacemeshで顔姿勢推定を試しました。
— o2 (@mb_otsu) May 20, 2020
MacBook Proのブラウザ上でそれなりの速度と精度が出ているように見えます。 pic.twitter.com/xXpUmYtv30
オンラインデモ