顔照合のオープンソースの実装について調査中

[dlibベースの顔照合プログラム face_recognition] (https://qiita.com/nonbiri15/items/f95b5fb01ae38980c9ce)
を先に書いた。

また、OpenCVの本家の配布元自体にも顔照合のプログラムが含まれていることも書いた。
[「OpenCV 3.3.0 Face Recognition with OpenCV」への補足記事](https://qiita.com/nonbiri15/items/66c643575cbe7224ffcc)

しかし、顔照合について、オープンソースの実装が多数存在する。
顔照合のついての特徴量の計算までの実装の場合もある。
以下のように深層学習を用いたものも存在する。



## https://github.com/bytefish/facerec

PyPI [facerec 1.0](https://pypi.org/project/facerec/) 

Implements face recognition algorithms for MATLAB/GNU Octave and Python.

 MATLAB/Octave Pythonによる顔照合のアルゴリズム

前処理 Preprocessing 
特徴抽出　Feature Extraction 
識別器　Classifier 
交差検定 Cross Validation 
についてそれぞれ知るべき手法を、手法の出典となった論文を記してくれている。


Preprocessing

Histogram Equalization
一般の画像は、輝度値の分布が偏っていることがあります。
輝度値の分布をどの輝度値でも一様に分布するように、変更する手法がヒストグラム均等化です。
[scikit-image のHistogram Equalization](http://scikit-image.org/docs/dev/auto_examples/color_exposure/plot_equalize.html)の説明が役立つでしょう。

Local Binary Patterns
は、3x3のブロックの明暗パターンによる特徴量です。
qiita [OpenCVを使って誰の顔なのかを推定する（Eigenface, Fisherface, LBPH）](https://qiita.com/hitomatagi/items/8f2f37646179aca68649)の記事がLBPを使った前処理をするとどのような画像になるのかを知ることができます。

[scikit-image のLocal Binary Pattern for texture classification](http://scikit-image.org/docs/dev/auto_examples/features_detection/plot_local_binary_pattern.html#sphx-glr-auto-examples-features-detection-plot-local-binary-pattern-py)もLBPがどのようなものなのかを知ることができる。

TanTriggsPreprocessing (Tan, X., and Triggs, B. "Enhanced local texture feature sets for face recognition under difficult lighting conditions.". IEEE Transactions on Image Processing 19 (2010), 1635–650.)


github で以下のスクリプトを顔照合の例題を実行できます。

[Results](https://github.com/bytefish/facerec#results)
にその実行結果があります。
このスクリプトでは、交差検定の結果を示すものになっています。


facerec/py/apps/scripts/simple_example.py

```
Since the AT&T Facedatabase is a fairly easy database we have got a 95.5% recognition rate with the Fisherfaces method (with a 10-fold cross validation):
```

AT＆T Facedデータベースはかなり簡単なデータベースなので、Fisherfacesメソッドで95.5％の認識率が得られます
(10-分割交差検証)。

このリポジトリの記述は、顔照合が学術的にどうなっているのかを学ぶのには参考になるでしょう。



----

## Face Recognition using Tensorflow (facenet)
- https://github.com/davidsandberg/facenet
PyPI [facenet 1.0.3 ](https://pypi.org/project/facenet/)

Inception ResNet v1 というネットワーク構造の深層学習を利用しています。

https://github.com/davidsandberg/facenet/blob/master/contributed/predict.py

paper [FaceNet: A Unified Embedding for Face Recognition and Clustering](https://arxiv.org/abs/1503.03832)

![Screenshot from 2018-07-25 01-48-36.png](https://qiita-image-store.s3.amazonaws.com/0/83761/fb4ca872-0bd1-25de-70e0-923c0988cc15.png)
上記論文の figure 1

顔向きや照明条件が顔照合しづらい状況を評価しています。


## Implement face recognition using PCA, LDA and LPP 
- https://github.com/wihoho/FaceRecognition

PCA（principal component analysis 主成分分析）: Eigen Faces
LDA（Linear Discriminant Analysis 線形判別分析）: Fisher Faces
LPP（Locality Preserving Projection 局所性保存射影）:Laplacian Faces

の手法の違いを説明しつつ、Java言語での実装を示しています。

PCAとLDAの違いについては、OpenCVの顔照合の本家のチュートリアルの中にも解説があります。

PCAで次の基底ベクトルを選ぶ際には、それまでの基底ベクトルと直交している中で、分散が一番大きい方向を選びます。

その際には、対象物の識別の容易さをまったく考慮にいれていません。
LDAでは、そのときに教師データを与えてやることで、識別しやすい軸が、後方のベクトルの中に埋もれてしまうことを防いでいるらしいです。

## Deep Face Recognition with Caffe Implementation
https://github.com/ydwen/caffe-face


## Gesture, Emotions, Posture and Face Recognition using OpenPose/DLIB
> Purpose of this work is to demonstrate few state of art computer vision applications using OpenPose/DLIB libraries.

https://github.com/srianant/computer_vision

以下のような潤沢なマシン環境で、いまいいとされている画像認識技術を組み合わせてみたコードのようです。

> Requirements:

    NVIDIA graphics card with at least 1.6 GB available (the nvidia-smi command checks the available GPU memory in Ubuntu).
    At least 2 GB of free RAM memory.
    Highly recommended: cuDNN and a CPU with at least 8 cores.


## dlibベースのまた別の顔照合
- https://github.com/vyomshm/face_recognition
 これは、先に紹介したforkしたものらしく、READM.md の記述に共通部分が多数見られます。
　
どこに、fork元の実装にまさる部分があるのか、調べてみよう。　　


## https://github.com/bytefish/libfacerec
Face Recognition Library for OpenCV. 

このgithub のサイトはOpenCV2.4 のときの顔照合のOpenCV本体のライブラリについてのものです。

OpenCV2.4 のときには[cv::FaceRecognizer] (https://docs.opencv.org/2.4/modules/contrib/doc/facerec/facerec_api.html)として存在していたライブラリです。
OpenCV3.X のときには、[cv::face](https://docs.opencv.org/master/d4/d48/namespacecv_1_1face.html)以下に移っていますので、このgithubは 2015年以降更新がとまっています。

このサイトを利用するよりはOpenCV3.3 の顔画像の扱いの部分を集中的に調べた方がよさそうです。




https://github.com/bytefish/facerecognition_guide/blob/master/facerec_python.pdf

github [SeetaFace Engine](https://github.com/seetaface/SeetaFaceEngine#seetaface-engine)
github [SeetaFace2 Engine](https://github.com/seetaface/SeetaFaceEngine2#seetaface2-engine)



----
付記

[局所性保存射影 (Locality Preserving Projection, LPP)とラプラス固有写像 (Laplacian Eigenmap)]
(https://nktmemo.wordpress.com/2015/07/08/%E5%B1%80%E6%89%80%E6%80%A7%E4%BF%9D%E5%AD%98%E5%B0%84%E5%BD%B1-locality-preserving-projection-lpp%E3%81%A8%E3%83%A9%E3%83%97%E3%83%A9%E3%82%B9%E5%9B%BA%E6%9C%89%E5%86%99%E5%83%8F-laplacian-eigenm/)


qiita [Facenetを使った類似顔画像検索のための特徴量抽出](https://qiita.com/zeze/items/09bdd7229713c0a6b090)


顔照合の性能の向上は、顔のlandmarkの位置合わせの精度に依存する。

[顔照合の商用のライブラリは今後どうなっていくのだろうか？](https://qiita.com/nonbiri15/items/353e79f8084916656d0f)