OpenCV だけで顔検出から顔照合まで完結している

追記(2022.04.11)
qiita [OpenCVの新しい顔検出を試してみる](
 https://qiita.com/UnaNancyOwen/items/f3db189760037ec680f3)
qiita [OpenCVに加わった深層学習ベースの顔検出・顔照合のデモ用のサンプル](
https://qiita.com/waragai/items/8162bb0cb50e54d5c92b)
で、OpenCV 4.5.4　以降で利用可能な深層学習ベースの顔検出と顔照合が紹介されています。

----
OpenCV だけで顔検出から顔照合まで完結している。
そういう状況になってきている。
深層学習を利用した従来よりも強力な顔検出・狭義の顔照合（＝正規化済みの顔を用いて、顔の類似性を判定する技術）があることには気づいていたが、顔のlandmark（目・鼻・口など）を求めて、顔を正規化する技術もOpenCVに含まれていたことに最近気づいた。


### https://github.com/opencv/opencv/tree/master/samples/dnn

tensorFlow ベースのコードで顔検出のDNNが使えるようになっている。
いつの間にか、sampleの構成が大幅に変わっている。

上記のGithub のREADME.md を読んでください。


https://github.com/opencv/opencv/tree/master/samples/dnn/face_detector

### [Face landmark detection in an image ](https://docs.opencv.org/3.4.3/d2/d42/tutorial_face_landmark_detection_in_an_image.html)

顔画像の正規化をするためには、顔のlandmark(目鼻口などの位置)が重要です。
そのためのライブラリが含まれるようになりました。

### [Face Recognition with OpenCV ](https://docs.opencv.org/3.4.3/da/d60/tutorial_face_main.html)

顔の画像が正規化されていれば、いよいよ狭い意味での顔照合を呼び出すことができます。


EigenFace(固有顔)などを使うアプローチでの顔照合です。

ただし、OpenCVに現時点で実装されているコードだけでは、商用ライブラリのうち高い水準にあるものとは次の範囲で違いが生じる可能性は高いと思われます。

- 隠れのある顔画像
    - 例：マスクをした顔・サングラスをした顔
- 正面を向いていない顔
    - 例：３０度ほど斜めを向いた顔
- よくない照明条件
    - 光が均一な当たり方をしていない顔画像


そういった部分での差があるとは予想されますが、OpenCVというライブラリの中で完結する範囲が増えてきたことはすばらしいことです。 



github [Face Recognition with OpenCV and Python](
https://github.com/informramiz/opencv-face-recognition-python)

[OpenCV-Face-Recognition-Python.ipynb](https://github.com/informramiz/opencv-face-recognition-python/blob/master/OpenCV-Face-Recognition-Python.ipynb)


[Real-time-face-recognition-in-python-using-opencv-](https://github.com/aquibjaved/Real-time-face-recognition-in-python-using-opencv-)


[Face Recognition using Haar-Cascade Classifier, OpenCV, and Python](https://github.com/nazmiasri95/Face-Recognition)


[Face Detection In Python Using OpenCV](https://github.com/informramiz/Face-Detection-OpenCV)


---

次のプロジェクトは、OpenCVにある顔検出から顔照合までの技術を通しで利用しようとするものです。

RaspberryPi と RaspberryPi Cameraを用いて、リアルタイムの顔照合を実現するものです。

[OpenCV-Face-Recognition](https://github.com/Mjrovai/OpenCV-Face-Recognition)

[Real-Time Face Recognition: An End-to-End Project](https://www.hackster.io/mjrobot/real-time-face-recognition-an-end-to-end-project-a10826)

---
[Facial recognition: OpenCV on the camera board](https://www.raspberrypi.org/blog/facial-recognition-opencv-on-the-camera-board/)


[Face recognition OpenCV Raspberry Pi](https://www.youtube.com/watch?v=Fggavxx-Kds)


---

[InsightFace: 2D and 3D Face Analysis Project](https://github.com/deepinsight/insightface)


## 追記：
### OpenCVのDNNの枠組みを使った年齢性別の推定ができるようになっています。
[Gender & Age Classification using OpenCV Deep Learning ( C++/Python )](https://www.learnopencv.com/age-gender-classification-using-opencv-deep-learning-c-python/)


### OpenCVの顔照合についての補足
深層学習の利用が拡大してきたなかで、顔照合のアルゴリズムとして、EigenFace(=固有顔)のように、線形モデルを前提としているのは、若干古臭い手法になりつつある。

深層学習の顔照合の実装について、オープン・ソースで、照合性能・照合処理速度・顔の属性推定などのさまざまな顔関連の実装とが関係している。
そのような中で、OpenCVに今の時点で含まれている顔照合を何で置き換えるべきかを考えるのがいいだろう。 

---
## 追記
### cv2.dnn.readNet()を使うアプローチ
[readNetFromTensorflow()](https://docs.opencv.org/master/d6/d0f/group__dnn.html#gad820b280978d06773234ba6841e77e8d)
[readNetFromModelOptimizer() ](https://docs.opencv.org/master/d6/d0f/group__dnn.html#ga4f3b552113d2bff48a54e168791c448e)
などを使うことにすれば、実行時のモジュールはOpenCVという範囲で、
https://github.com/opencv/open_model_zoo
にある各種モデルを利用できる。
それらを含めた時に利用可能な顔関係の機能は飛躍的に増える。

---
## 追記
以下の記事を参照すれば、そこにあって変化している顔と、顔写真とを区別できる。そういったことさえも、OpenCV上に構築できる。

Liveness Detection with OpenCV
https://www.pyimagesearch.com/2019/03/11/liveness-detection-with-opencv/