PV動画の顔方向検出について

 PV動画で顔方向検出のプログラムを作る機会がありました。調べてみると様々な回答があり面白いと感じましたが、今回のモデルではPV画像への転用ということで自分の考えを取り入れてプログラムを作成しました。結果は完璧とは程遠いものになってしまいましたが、本記事で考えたことや見えてきた問題点を共有したいと思います。

顔方向検出とは

 顔方向検出とは、画面上の顔の向きを推定する技術です。方法としては、顔の様々なパーツの座標(特徴点)を推定してから、その特徴点を用いて顔の向きを計算していきます。
 今回のモデルでは目・鼻・口から68個の特徴点を推定します(下図)。このモデル(68point_dlib_with_pose.caffemodel)は無料でダウンロードでき、 python の dlib と opencv で簡単に利用することができます。

f:id:gri-blog:20210430101311j:plain
顔の特徴点

出典 : https://www.pyimagesearch.com/2017/04/03/facial-landmarks-dlib-opencv-python/

 ここから顔の向きを推定する方法として、オイラー角を利用する手法が挙げられています。これは、画像のピクセルに加えて奥行の座標を推定することでロールピッチヨーを計算します。

 しかし、今回はライブ画像への転用ということで複数人を同時に検出する必要があり、奥行の推定が難しいと考えました。そこで、以下の条件で顔の向きが正面であるかを判別しました。

  1. 顔の両端の点(上の画像の 1, 17 番)の中間点を求める
  2. 鼻頭点(上の画像の 31 番)の x 座標をとる
  3. 中間点と鼻頭点の x 座標が近ければ、「表面を向いている」とする

 顔の上下については条件を定めていませんが、とりあえずこれでライブ動画の顔方向検出を行ってみたいと思います。アルゴリズムは次の通りです。

  1. 画像から顔を検出する
  2. 検出された顔から 68point_dlib_with_pose.caffemodel を利用して特徴点を推定する
  3. 特徴点から顔の向きが正面かどうかを判別する
  4. 1~3を 1 フレームごとに行う

PV動画でのテスト

 動画は LDH JAPAN さんのものを使用しました。ダンスがかっこいいです!!

www.youtube.com

 全てのフレームで行うと長いので一部分を抜粋して表示します。顔が検出されると黒枠、加えて表面を向いていれば赤枠を付けています。

f:id:gri-blog:20210506002542g:plain
PV画像での顔方向検出テスト

 アップの部分は上手くいっていると思いますが、少し引いた視点では微妙といった結果になりました。次で詳しく考察しています。

問題点・改善案

 テストを行って見つかった問題点を挙げていきます。上のgif 画像以外のところも含みます。

  • 表面を検出できていない部分がある
  • 視点が遠いと顔が検出されない
  • マスクな帽子などの衣装によって顔が検出されない
  • 照明の色によって顔が検出されない

 表面を検出できていない部分に関しては、条件を調整することによって改善できそうです。顔の検出については dlib が検出できる範囲に画像をリサイズし、照明は HSV 変換をして明度、彩度を調整するなどが挙げられます。衣装については現状思いつかないです…

 実際にはライブ動画への転用をイメージしていますので、特に低解像度の顔認識をどうするかを考える必要があります。もっと適切なモデルやアルゴリズムがありそうだと思ったので引き続き追っていきたいとおもいます。

GRI ではこのような AI 開発も行っております。今後ともよろしくお願いいたします。

分析官 安井優平