深層学習が用いられている顔の属性推定について調査中

以下は深層学習が用いられている顔の属性推定の実装です。

### Age/Gender detection in Tensorflow 
- Github Python TensorFlow https://github.com/dpressel/rude-carnie
    - 顔検出は、OpenCV, dlib, YOLO tiny　から選べる。
    - dlib を利用する場合には、dlibをインストールし、 shape_predictor_68_face_landmarks.datを入手します。
    - python guess.py --model_type inception --model_dir ./22801 --filename test.jpg --face_detection_type dlib --face_detection_model shape_predictor_68_face_landmarks.dat


```
$ python guess.py --model_type inception --model_dir ./22801 --filename test.jpg --face_detection_type dlib --face_detection_model shape_predictor_68_face_landmarks.dat
/usr/local/lib/python2.7/dist-packages/h5py/__init__.py:34: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
  from ._conv import register_converters as _register_converters
Using face detector (dlib) shape_predictor_68_face_landmarks.dat
test.jpg
1 faces detected
['./frontal-face-1.jpg']
2018-03-17 01:30:35.010974: I tensorflow/core/platform/cpu_feature_guard.cc:137] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA
2018-03-17 01:30:36.790278: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:892] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2018-03-17 01:30:36.804395: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1030] Found device 0 with properties: 
name: GeForce GTX 850M major: 5 minor: 0 memoryClockRate(GHz): 0.9015
pciBusID: 0000:01:00.0
totalMemory: 1.96GiB freeMemory: 1.62GiB
2018-03-17 01:30:36.804484: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1120] Creating TensorFlow device (/device:GPU:0) -> (device: 0, name: GeForce GTX 850M, pci bus id: 0000:01:00.0, compute capability: 5.0)
Executing on /cpu:0
selected (fine-tuning) inception model
./22801/checkpoint-14999
2018-03-17 01:30:43.214231: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1120] Creating TensorFlow device (/device:GPU:0) -> (device: 0, name: GeForce GTX 850M, pci bus id: 0000:01:00.0, compute capability: 5.0)
['./frontal-face-1.jpg']
Running file ./frontal-face-1.jpg
Running multi-cropped image
Guess @ 1 (25, 32), prob = 0.91
Guess @ 2 (38, 43), prob = 0.06

```

上の実施例のように年齢の範囲を推定する。



> Pre-trained Checkpoints
You can find a pre-trained age checkpoint for inception here:
https://drive.google.com/drive/folders/0B8N1oYmGLVGWbDZ4Y21GLWxtV1E
A pre-trained gender checkpoint for inception is available here:
https://drive.google.com/drive/folders/0B8N1oYmGLVGWemZQd3JMOEZvdGs

とあるので、train済みのデータを入手する。

train用のスクリプトも用意されている。
どのデータセットを用いて
どのようにtrainしているかを詳細に書いてあるので、おそらくたどることができるだろう。

    - 「git clone https://github.com/GilLevi/AgeGenderDeepLearning 」の記載あり。
    - 
## Keras implementation of a CNN network for age and gender estimation 
- Github Python3.5 Keras2.0 https://github.com/yu4u/age-gender-estimation
    - データのダウンンロード元
        - 例　https://data.vision.ee.ethz.ch/cvl/rrothe/imdb-wiki/static/imdb_crop.tar
    - これらの文献を参考にしている実装です。
    - 「[1] R. Rothe, R. Timofte, and L. V. Gool, "DEX: Deep EXpectation of apparent age from a single image," ICCV, 2015.
    - [2] R. Rothe, R. Timofte, and L. V. Gool, "Deep expectation of real and apparent age from a single image without facial landmarks," IJCV, 2016.
    - [3] H. Zhang, M. Cisse, Y. N. Dauphin, and D. Lopez-Paz, "mixup: Beyond Empirical Risk Minimization," in arXiv:1710.09412, 2017.
    - [4] Z. Zhong, L. Zheng, G. Kang, S. Li, and Y. Yang, "Random Erasing Data Augmentation," in arXiv:1708.04896, 2017.」

    
python demo.py
　　USBカメラ入力で顔の性別と年齢を推定します。

   AGE_LIST = ['(0, 2)','(4, 6)','(8, 12)','(15, 20)','(25, 32)','(38, 43)','(48, 53)','(60, 100)']
  は、区間に抜けがあるのはなぜだろうか？

train.py
   


## Gender and Age Classification using CNNs
- Github Python tensorflow https://github.com/naritapandhe/Gender-Age-Classification-CNN
    - 次の２つの論文を参考にした実装のようです。
「Gil Levi & Tal Hassner Alexander, Age and Gender Classification using Convolutional Neural Networks. 2015
 Ari Ekmekji. Convolutional Neural Networks for Age and Gender Classification, Stanford University. 2016」

## AgeGenderDeepLearning
- Github Python https://github.com/GilLevi/AgeGenderDeepLearning
    - Requirement Caffe
    - 必要なデータを入手するには、以下のissue を参考にします。
        - https://github.com/GilLevi/AgeGenderDeepLearning/issues/21
    - Jupyter notebook で例題を実行します。
    - `$ jupyter notebook &`
    - 「Gil Levi and Tal Hassner, Emotion Recognition in the Wild via Convolutional Neural Networks and Mapped Binary Patterns, Proc. ACM International Conference on Multimodal Interaction (ICMI), Seattle, Nov. 2015」
    - https://github.com/GilLevi/AgeGenderDeepLearning/blob/master/AgeGenderDemo.ipynb
    - https://github.com/GilLevi/AgeGenderDeepLearning/blob/master/EmotiW_Demo.ipynb
    - [Age and Gender Classification using Convolutional Neural Networks](http://www.openu.ac.il/home/hassner/projects/cnn_agegender/)

以下のように
https://github.com/GilLevi/AgeGenderDeepLearning/blob/master/README.md
に書かれていますから、そちらを見るべきのようです。
```
Also see TensorFlow implementation of our work by Rude Carnie: https://github.com/dpressel/rude-carnie
```


## AgeAndGenderEstimation
- Github C++ (Xcode) https://github.com/LouieYang/AgeAndGenderEstimation
    - 顔検出・性別・年齢がそれぞれ深層学習のモデルで構築されていてcaffemodelで提供されています。
    - [「CVPR 2015 Papers: Age and Gender Classification using Convolutional Neural Networks」](http://www.openu.ac.il/home/hassner/projects/cnn_agegender/CNN_AgeGenderEstimation.pdf)を参考にした実装のようです。
    - Xcodeを前提としたコードになっているようです。Mac使いではないため、私はまだ使えていません。

## Convolutional Neural Networks based Deep Learning Model 
- Github Python tensorflow https://github.com/danielyou0230/apparent-age-gender-classification
    - Requirement: tensorflow

分類は次の８種類です。
> 0: Male Child, 4: Female Child
1: Male Young, 5: Female Young
2: Male Adult, 6: Female Adult
3: Male Elder, 7: Female Elder

## Age & Gender guesser for Windows 10
- Github https://github.com/austinkinross/age-gender-guesser
    - C# でのage-genderの実装です。
    
## Real-time face detection and emotion/gender classification using fer2013/imdb datasets with a keras CNN model and openCV. 
- Github https://github.com/oarriaga/face_classification
> Face classification and detection from the B-IT-BOTS robotics team.
Rquirement: keras

Python3 による実装です。
 statistics [Pythonの標準ライブラリstatisticsで出来ること](https://qiita.com/morinokami/items/6674f9a240a75d67dbfc)


- [DAGER: Deep Age, Gender and Emotion Recognition Using Convolutional Neural Network](https://arxiv.org/abs/1702.04280)
    - https://arxiv.org/pdf/1702.04280.pdf
    - これはSighthound CloudのAPIとして実装されているアルゴリズムの論文らしいです。
- [Sighthound Cloud　Detection API & Recognition API](https://www.sighthound.com/products/cloud)

- [Local Deep Neural Networks for Age and Gender Classification](https://arxiv.org/abs/1703.08497)
    - https://arxiv.org/pdf/1703.08497.pdf


- Qiita [Kerasでウェブカメラから顔領域を検出し、年齢・性別を推定する](https://qiita.com/yu4u/items/8cc71c645afe8cbb1f42)
    - このqiitaの記事の作者はそのコードをgithub上に公開しています。
    - https://github.com/yu4u/age-gender-estimation
    >Dependencies

    Python3.5+
    Keras2.0+
    scipy, numpy, Pandas, tqdm, tables, h5py
    dlib (for demo)
    OpenCV3


- database [IMDB-WIKI – 500k+ face images with age and gender labels](https://data.vision.ee.ethz.ch/cvl/rrothe/imdb-wiki/)
- database
http://www.openu.ac.il/home/hassner/Adience/data.html

### [Kerasでウェブカメラから顔領域を検出し、年齢・性別を推定する](https://qiita.com/yu4u/items/8cc71c645afe8cbb1f42)



## Heterogeneous Learningによる顔器官点と性別・年齢・顔器官点の推定
pdf  [「Heterogeneous Learning と 重み付き誤差関数の導入による顔画像解析」](http://www.vision.cs.chubu.ac.jp/MPRG/F_group/F164_katoy2015.pdf)
[Deep Convolutional Neural Networkを用いた顔画像の理解](http://mprg.jp/research/cnn_facial_recognition_j)

[Heterogeneous Face Attribute Estimation:A Deep Multi-Task Learning Approach](https://arxiv.org/pdf/1706.00906.pdf)

---

次の画像によれば、顔画像のデータ・セットでは年齢の偏りがあるとのことです。
１５歳以下の顔画像と年齢の組み合わせのデータを探す必要がありそうです。

![年齢の分布](https://data.vision.ee.ethz.ch/cvl/rrothe/imdb-wiki/static/img/dataset_dist.png)


次の論文では、深層学習のネットワークの異なる学習の結果を比較しています。
[Understanding and Comparing Deep Neural Networks for Age and Gender Classification](https://arxiv.org/abs/1708.07689)


[The Child Affective Facial Expression Set (CAFE)](https://www.childstudycenter-rutgers.com/research)
[Large Age-Gap (LAG) database](http://www.ivl.disco.unimib.it/activities/large-age-gap-face-verification/)
[FaceTracer: A Search Engine for Large Collections of Images with Faces](http://www.cs.columbia.edu/CAVE/projects/face_search/)
[The Japanese Female Facial Expression (JAFFE) Database ](http://www.kasrl.org/jaffe.html)
> The JAFFE database is available free of charge for use in non-commerical research. 

[CAS-PEAL Face Database](http://www.jdl.ac.cn/peal/)

https://susanqq.github.io/UTKFace/

EAVISE Open Source Face Detection Dataset
https://iiw.kuleuven.be/onderzoek/eavise/facedetectiondataset/home

以下のＵＲＬにはデータベースの一覧があります。
http://www.face-rec.org/databases/

https://www.ecse.rpi.edu/~cvrl/database/other_Face_Databases.htm

[CASIA WebFace Database](http://www.cbsr.ia.ac.cn/english/CASIA-WebFace-Database.html)

[Facial point annotations](https://ibug.doc.ic.ac.uk/resources/facial-point-annotations/)



----
これは、作った画像
https://syncedreview.com/2017/05/18/face-aging-with-conditional-generative-adversarial-networks/

https://github.com/ZZUTK/Face-Aging-CAAE


## 付記
　各種の実装では、使用しているライブラリのバージョンが異なる場合が多くなります。
　Dockerなどのソフトウェアを使いこなせるようにすれば、これらのライブラリをすべて動作させることが可能になるのでしょう。

## 警告 (2018.10追記）
顔の属性推定は、人種による影響を受けやすい。
そのため、ヨーロッパ系の人でうまくいく年齢・属性推定の学習結果が、東アジア系の人に対してうまくいくとは限らない。
とりわけ、オープンソースの分野で用いられている学習済みのデータは、ヨーロッパ系の人を多く含み、東アジア系の人の比率が少ないことに留意しよう。

最近は、中国からもオープンソースのソースコードが提供されているし、
顔関係のデータベースの公開がなされているのが増えてきている。


[Face classification and detection from the B-IT-BOTS robotics team.](https://github.com/oarriaga/face_classification)



参考URL
[年齢・性別判定APIを比較しました（その１）](https://qiita.com/usi-isu/items/dd2b59b7423cb933466a)
[年齢・性別判定APIを比較しました（その２）](https://qiita.com/usi-isu/items/1725bf81c8dc8230a9a6)

---
追記 2019.05.22

[ Intel® Distribution of OpenVINO™ toolkit : Pretrained Models](https://software.intel.com/en-us/openvino-toolkit/documentation/pretrained-models)
OpenVino で提供されている Pretrained Models に各種属性推定が入っている。

- Age & Gender Recognition
- emotion-recognition
などがある。

https://www.learnopencv.com/age-gender-classification-using-opencv-deep-learning-c-python/
にもOpenCVを使った性別・年齢の分類の深層学習がある。
---
追記　2020.10.14

https://pypi.org/project/py-agender/
https://github.com/aristofun/py-agender


---
顔の検出用のデータにくらべ、顔の属性推定のラベルが付けられた顔データはとても限られます。そのため、顔の属性推定は、半教師あり学習を活用するのが必要性が高そうです。