OpenCV (>= 4.5.4) で深層学習ベースの顔検出・顔照合ライブラリが含まれるようになった。
その利用の普及を応援するために、自作のサンプルプログラムを作ったので、それを紹介する。
既に作成されているサンプルスクリプトを参照して作りました。
OpenCV自体の中のサンプルスクリプト
Github のOpenCV のなかにもオリジナルのサンプルコードがある。
Qiita, Gist でのサンプル(UnaNancyOwen さんによる)
また、以下の場所にも顔検出から顔照合までのステップがわかるサンプルコードがある。
Qiita https://qiita.com/UnaNancyOwen/items/8c65a976b0da2a558f06
Gist https://gist.github.com/UnaNancyOwen/49df508ad8b6d9520024354df0e3e740
- generate_aligned_faces.py : 画像から顔を検出して切り出し、顔画像として保存する
- generate_feature_dictionary.py : 顔画像から特徴を抽出、特徴辞書として保存する
- face_recognizer.py : 入力画像から顔を検出し特徴を抽出、特徴辞書と比較して顔認識する
このサンプルスクリプトは、それぞれの機能がどのように実装されているのかを理解するのに適している。
今回作ったサンプル
detector.py
- カメラ入力に対して顔検出を行い、結果を画面表示するスクリプト
recognizer.py
-
カメラ入力に対して顔検出・顔照合とを行い、結果を画面表示するスクリプト
カメラ入力で画面出力なので、どの程度顔検出・顔照合ができるのかを確認しやすいと期待する。 -
顔照合用の画像と特徴量の抽出は、以下のスクリプトを使用している。
-
generate_aligned_faces.py 顔画像を正規化するとともに、特徴量をnpyファイルに変換するのを1つのスクリプトにまとめた。
-
aligned_faces の下にbaiden.npy があれば、その特徴量の人物はbaiden とみなすようにしてある。
最後に
- 今回のサンプルの作成にあたっては、UnaNancyOwen さんのサンプルを大いに参考にした。
- OpenCVの顔検出と言うとcv2.CascadeClassifierを使うものが有名だが、深層学習の時代においては、それを積極的に使うべき理由はない。
- また、EigenFaceを用いた顔照合よりも、深層学習ベースの顔照合の方が適用できる範囲が広いものになっている。
- 従来例:cv2.CascadeClassifierを使うサンプル