Help us understand the problem. What is going on with this article?

TensorFlow.jsのfacemeshで顔向き推定を試してみた その2

これはTensorFlow.jsのfacemeshで3D座標から顔向き推定の実証実験。

前回はOpenCVのSolvePnPとRodriguesで回転行列(rotation matrix)を求めました。
今回はアプローチを変えてfacemeshの3D座標から直接回転行列を求めます。

元ネタはこちらコード

回転行列の求め方(コード紹介)

行列演算はTensorFlow.jsを利用しました。
TensorFlow.jsでは演算子をサポートしていないのでとても見辛いです。
TensorFlow.js API
使ったメモリはdisposeやTidyで解放が必要です

参考までに

  • div .. 割り算
  • sub .. 引き算
  • mul .. 掛け算

コードでは、顔の適当な3D座標(元コードでは全ての座標、今回は適当に選択した座標:輪郭のみ)と輪郭の端の4点と目の位置の引数からスケールを取得し、中心を求めています。

let fecePoints = tf.tensor(faces);
let eye1 = tf.tensor1d(rightEye);
let eye2 = tf.tensor1d(leftEye);

let scales = fecePoints.div(tf.norm(eye1.sub(eye2))).mul(0.06);
let centered = scales.sub(scales.mean(axis=0));

let c00 = centered.slice(0,1).as1D();
let c09 = centered.slice(9,1).as1D();
let c18 = centered.slice(18,1).as1D();
let c27 = centered.slice(27,1).as1D();

3x3のrotation matrixを求めます。

let rotate0 = c18.sub(c00).div(tf.norm(c18.sub(c00)));
let rotate1 = c09.sub(c27).div(tf.norm(c09.sub(c27)));
let rotate = tf.concat([rotate0, rotate1]).arraySync();

let m00 = rotate[0];
let m01 = rotate[1];
let m02 = rotate[2];

let m10 = rotate[3];
let m11 = rotate[4];
let m12 = rotate[5];

// cross product
let m20 = m01*m12 - m02*m11;
let m21 = m02*m10 - m00*m12;
let m22 = m00*m11 - m01*m10;

rotation matrixが解れば、Rotation Matrix to Euler Anglesで変換します。

製作物

オンラインデモ

https://infocom-tpo.github.io/facevrm/v0.2/

おわりに

facemeshの三次元座標で顔の向きを推定しました。
AIで三次元座標が解ることで、簡単に顔の向きが推定出来るようになり、よく使われるSolvePnPの手法が必須ではなくなりました。
これまで当然として使われていた処理が使われなくなるのは感慨深いものがあります。
今後も、定期的に自身の情報をアップデートしていければと思います。

mbotsu
転職歴: 調理師 -> WEBエンジニア -> ゲームエンジニア -> R&D 現在はAI/IoT/xRと浅く広く活動
https://twitter.com/mb_otsu
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした