FaceNet
FaceNet copied to clipboard
Face recognition using Keras
FaceNet
这是 FaceNet 的Keras实现 FaceNet: A Unified Embedding for Face Recognition and Clustering.
依赖项
数据集
CelebFaces Attributes Dataset (CelebA) 是一个大型的人脸数据集,有10,177个身份和202,599张人脸图像。

按照 说明 下载 CelebFaces Attributes (CelebA) 数据集.
模型结构

工作流程
处理单个输入图像的工作流程如下:
- 人脸检测:使用 Dlib 中预先训练的模型检测面部。
- 人脸校准:使用 Dlib 的实时姿势估计与 OpenCV 的仿射变换来尝试使眼睛和下唇在每个图像上出现在相同位置。
- 卷积网络:使用深度神经网络把人脸图片映射为 128 维单位超球面上的一个点。
预训练模型
下载预训练模型,放在 models 目录下:
- Dlib 人脸校准模型 shape_predictor_5_face_landmarks.dat.bz2
- FaceNet 人脸识别模型 model.10-0.0156.hdf5
性能评估
使用 Labeled Faces in the Wild (LFW) 数据集做性能评估:
- 13233 人脸图片
- 5749 人物身份
- 1680 人有两张以上照片
准备数据
下载 LFW database 放在 data 目录下:
$ wget http://vis-www.cs.umass.edu/lfw/lfw-funneled.tgz
$ tar -xvf lfw-funneled.tgz
$ wget http://vis-www.cs.umass.edu/lfw/pairs.txt
$ wget http://vis-www.cs.umass.edu/lfw/people.txt
评估脚本
$ python lfw_eval.py
测得结果
准确度: 89.27 %.
如何使用
数据预处理
提取训练图像:
$ python pre-process.py
总共 202,599张人脸图像中,5600张无法被 dlib 标定。因此 202599 - 5600 = 196999 张被用于训练。
训练
$ python train.py
要想可视化训练过程,执行下面命令:
$ tensorboard --logdir path_to_current_dir/logs
DEMO
$ python demo.py
| 正(P) | 欧式距离 | 锚(A) | 欧式距离 | 反(N) |
|---|---|---|---|---|
![]() |
0.1716 | ![]() |
1.6495 | ![]() |
| 1.2839 | --- | 1.1502 | --- | 1.1636 |
![]() |
0.3566 | ![]() |
0.9795 | ![]() |
| 1.6029 | --- | 1.5733 | --- | 1.2582 |
![]() |
0.7500 | ![]() |
1.2708 | ![]() |
| 1.4815 | --- | 1.0065 | --- | 1.7432 |
![]() |
0.2974 | ![]() |
1.2198 | ![]() |
| 2.0759 | --- | 1.6838 | --- | 1.3330 |
![]() |
0.3072 | ![]() |
1.2609 | ![]() |
| 0.5769 | --- | 0.7416 | --- | 0.8989 |
![]() |
0.3422 | ![]() |
0.4381 | ![]() |
| 1.4096 | --- | 1.7690 | --- | 1.0634 |
![]() |
0.5896 | ![]() |
1.3287 | ![]() |
| 1.7525 | --- | 1.5093 | --- | 0.9600 |
![]() |
0.5894 | ![]() |
1.4106 | ![]() |
| 1.5781 | --- | 0.7706 | --- | 1.7681 |
![]() |
0.6818 | ![]() |
0.8294 | ![]() |
| 1.1007 | --- | 0.8181 | --- | 1.1559 |
![]() |
0.3873 | ![]() |
0.9675 | ![]() |
附录
样本数据
执行下面命令查看样本数据:
$ python data_generator.py
| 正(P) | 锚(A) | 反(N) |
|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
数据增强
执行下面命令查看数据增强效果:
$ python data_generator.py
| 之前 | 之后 | 之前 | 之后 | 之前 | 之后 |
|---|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |























































































































