TensorFlowで日向坂46の顔識別をしてみた -顔画像検出編-
前提として
画像から人物識別を行うにあたって画像から顔を検出する必要があります.意外にこれが曲者でモノによって精度とかだいぶ変わってくるので顔検出の選定は重要だと思います.
何種類か見て回ったり試したりしました.
・Haar-like特徴量
ブログなどをいろいろ見て回った結果誤検出が多いなど結構微妙っぽいので断念.
・dlibを利用した顔検出
顔のポイント68ヶ所を取得できるモデルを利用して検出する方法を試しました.(下のブログを参考にさせていただきました.)
Python(OpenCV) 顔が上を向くように写真から切り出す方法 – console dot log
精度は悪くなかったのですが画像を回転させないと検出できない場面が多く非常に時間がかかってしまい泣く泣く別の方法を探すことにしました.
・Tensorflow Face Detector
TensorFlow物体検出APIを用いてWIDERFACE データセットを学習したモバイルネットSSDベースの顔検出モデルらしいです.最終的にこの手法を利用することにしました.
https://github.com/yeephycho/tensorflow-face-detection
inference_video_face.py を参考にしてコードを書いています.
モデルなどはそのまま利用しています.もとのTensorflow Face Detectorでは人物の顔を長方形のBounding Boxで切り取っています.しかし,TensorFlowで学習する際に利用する画像は縦横のサイズを合わせる必要があるため長辺に合わせて短辺の長さを伸ばしてBounding Boxを正方形にしています.
本来はなくてもいいんですが,検出された顔の数でフォルダを分けるようにしています.後に学習用データを収集する時に少しでも楽にしようという考えでこのようにしています.(1人だけ写っている→おそらく自撮りの確率が高いので本人の顔画像が収集しやすい,2人写っている→ツーショットの画像なら本人の顔画像が収集しやすい)
分類した結果を載せておきます.
これがもとのフォルダ
1人検出
2人検出
3人以上検出
検出人数ゼロ
たまに顔ではないものを誤検出してしまったり,顔が検出できていないものもありますが概ね想定どおりに動いてくれて結構いい感じに検出できてるんではないでしょうか.
次は検出した顔画像をベースに学習用データを作っていきます.
次の記事