386.顔検出、顔認識(3)
初回:2024/10/16
OpenCV を使用した、顔検出と顔認識について何回かに分けて述べてみたいと思います。
P子「前回は、cv2.FaceDetectorYN を使用した新しい顔検出だったわね」※1
今回から、顔認識の話題に入りたいと思いますが、その前に顔データの取得の話から入りたいと思います。
P子「色々とネタを引っ張るわね」
せっかくなので、一通りの機能を実装してみたいと思います。
1.顔認識(face_recognition)
まずは、私が最初に試した顔認識のご紹介をしたいと思います。
≪参考資料1≫
https://blog.grasys.io/post/uema/face-recognition/
Pythonで手軽に顔認識をやってみる(face-recognition)
P子「紹介だけ?」
少し手順がややこしいので、紹介だけにしておきます。
cmake をインストールして、dlib をインストールして、face_recognition を入れます。一応、ラズパイの bookworm を対象にすると、apt で入れるか、pipiの場合は、仮想環境で入れる必要があります。ラズパイレベルなので、わざわざ仮想環境まで作りたくありませんので、必要なモジュールが apt でインストールできるかどうか確認して、pip しかなければ、--break-system-packages を付けてインストールすることとします。
1.『apt search キーワード』で対象モジュールが、apt にあるかどうか確認する
2.なければ、『sudo pip install モジュール --break-system-packages 』でインストールする
今回のモジュールは、apt になかったので、pip で入れることにします。
$ sudo pip install cmake --break-system-packages
$ sudo pip install dlib --break-system-packages
$ sudo pip install face-recognition --break-system-packages
インストール後のプログラムの手順としては、
1.認識したい顔の画像を読み込み、顔の特徴値を取得する。
2.WBEカメラから1フレーム読み込み、顔を検出しそれぞれの特徴値を取得する。
3.検出した顔の特徴値と認識したい顔の特徴値を比較する。
事になります。
2.顔認識(cv2.FaceRecognizerSF)
今回の本命です。
≪参考資料2≫
https://qiita.com/UnaNancyOwen/items/8c65a976b0da2a558f06
OpenCVの新しい顔認識を試してみる
新しい方式と言っても手順は同じです。
まずは比較対象となる顔写真を用意し特徴量を算出します。そしてカメラ画像から顔を検出して、同じように特徴量を算出します。そして順番に比較して、特徴量が一番近い値の顔写真を決定します。
特徴量の検出に関しては、ある程度の「threshold(スレッショルド)」で判定しないと、比較用写真の中から選んでしまうかもしれません。
プログラムを用意する前に、準備が必要です。
P子「モジュールのインストールが必要なの?」
cv2.FaceRecognizerSF に関しては、OpenCV のみで実行できるので他に必要なモジュールのインストールは不要です。そのあたりが、face_recognition モジュールを使用するより簡単です。
ただし、cv2.FaceDetectorYN の顔検出時に使用した、face_detection_yunet_2023mar.onnx ファイルと同じように、cv2.FaceRecognizerSF の顔認識時には、face_recognition_sface_2021dec.onnx ファイルが必要です。
取得先を示しておきます。
≪参考資料3≫
yuNet:opencv_zoo/yunet
https://github.com/opencv/opencv_zoo/tree/main/models/face_detection_yunet
face_detection_yunet_2023mar.onnx
https://github.com/opencv/opencv_zoo/tree/main/models/face_recognition_sface
face_recognition_sface_2021dec.onnx
3.まとめ
P子「まとめが早すぎない?」
今回は、サンプルソースの準備が間に合いませんでした。
顔識別の場合は、やることが多いので、手順が少し複雑になります。
1)顔画像のマスタを読み取り、特徴抽出を行う。
(先に特徴抽出したファイルを用意しておく)
(特徴点ファイルのタイムスタンプが画像より古い場合は特徴抽出しなおす)
2)顔検出する
3)顔認識して、特徴点に一番近い画像を顔と判断する。
4)特徴点が一致しない(似た画像がない)の場合、切り抜いた顔を顔画像のマスタに保存する
5)特徴抽出したファイルもセーブする
みたいな感じになります。
やはり、処理を分解して説明するのが良いのかもしれません。
P子「このテーマで引っ張れるものね」
ほな、さいなら
======= <<注釈>>=======
※1 P子「前回は、cv2.FaceDetectorYN を使用した新しい顔検出だったわね」
P子とは、私があこがれているツンデレPythonの仮想女性の心の声です。