深度学习之人脸识别模型--FaceNet
一、FaceNet模型
(1)、FaceNet源码仓库,本地代码存放在facenet-master文件夹下面
https://github.com/davidsandberg/facenet
(2)、FaceNet源码解读(网友解读版一),代码存放在understand_facenet文件夹下
https://blog.csdn.net/u013044310/article/details/79556099
https://github.com/boyliwensheng/understand_facenet(配套源码地址)
(3)、FaceNet源码解读(网友解读版二),代码存放在facenet-master文件夹下
https://blog.csdn.net/huangshaoyin/article/details/81034551
(4)、triplet-reid源码地址
https://github.com/VisualComputingInstitute/triplet-reid
(5)、FaceNet源码解读(网友解读版三),(2)是在借鉴此作者的博客,
- 本篇博客也提供了各种人脸数据集的介绍和
预模型
的下载https://blog.csdn.net/MrCharles/article/details/80360461
二、人脸匹配数据准备
运行环境
- tensorflow==1.7
- scipy
- scikit-learn
- opencv-python
- h5py
- matplotlib
- Pillow
- requests
- psutil
数据集
- LFW 下载地址:http://vis-www.cs.umass.edu/lfw/#views 谷歌网盘(需要梯子):https://drive.google.com/drive/u/0/folders/0B7EVK8r0v71pQ3NzdzRhVUhSams
- Celeba 下载地址:http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html
- VGGface2
- CASIA-WebFace
- CASIA-faceV5
- 更多人脸数据集请看:https://www.cnblogs.com/ansang/p/8137413.html
数据格式
文件夹名/文件夹名_文件名
同一个热的图片放在相同文件夹
Pre-trained models
模型下载链接:https://pan.baidu.com/s/1aiSq7wGpdHIe6MUKPnXgrA 密码:4dcn
20170512-110547(MS-Celeb-1M数据集训练的模型文件,微软人脸识别数据库,名人榜选择前100万名人,搜索引擎采集每个名人100张人脸图片。预训练模型准确率0.993+-0.004)
Inception ResNet v1 模型图

三、一些问题
1、解决出现ModuleNotFoundError: No module named 'facenet'
异常
- a.在cmd(需要管理员权限)命令行键入:set PYTHONPATH=…\facenet\src, 例如笔者的是:set PYTHONPATH=D:\Python\Work\face-system\face-net\facenet-master\src
- b.在 计算机–>属性–>高级系统设置–>环境变量 中,新建PYTHONPATH,键入 D:\Python\Work\face-system\face-net\facenet-master\src
- c.如果使用pycharm,请记得重启pycharm
2、重新裁剪LFM图片数据集的大小
程序中神经网络使用的是谷歌的“inception resnet v1”网络模型,这个模型的输入时160x160的图像,而我们下载的LFW数据集是250x250限像素的图像,所以需要进行图片的预处理。
- 原本数据集放在raw文件夹下面,新裁剪的图片放在ifw_160文件夹下面
data/lfw/raw :D:\Python\Work\face-system\face-net\facenet-master\data\ifw\raw
data/lfw/lfw_160:D:\Python\Work\face-system\face-net\facenet-master\data\ifw\ifw_160
1 | 运行脚本,记得将图片文件夹修改为自己的文件夹目录 |
- pycharm中运行记得修改成下面这样
3、评估预训练模型的准确率
1)、模型下载
facenet提供了两个预训练模型,分别是基于CASIA-WebFace和MS-Celeb-1M人脸库训练的,不过需要去谷歌网盘下载,这里给其中一个模型的百度网盘的链接:
https://pan.baidu.com/s/1LLPIitZhXVI_V3ifZ10XNg#list/path=%2F 密码: 12mh
模型放在data文件夹下,没有就创建
2)、运行脚本
1 | 运行脚本,同样的,目录改为自己的 |
- 安装网络上面的做法会出现错误,是应为data/pairs.txt读取不到,所以需要在运行脚本上面加上`–lfw_pairs=txt的地址
1 | 运行脚本,同样的,目录改为自己的 |
3)、TensorFlow版本导致报错
1 | 2020-04-17 00:27:11.307949: W tensorflow/core/graph/graph_constructor.cc:1272] Importing a graph with a lower producer version 24 into an existing graph with producer version 27. Shape inference will have run different parts of the graph with different producer versions. |
解决方案
1.把Tensorflow换为1.7版本的;
2.在
facenet.py
代码中找到create_input_pipeline
再添加一行语句with tf.name_scope("tempscope"):
就可以完美解决(貌似Tensorflow 1.10及以上版本才修复这个bug)。运行结果,可以看出,模型的精度高达99.7%
4、人脸对比程序运行
FaceNet可以对比两张人脸图片,可以得出他们的经过网络映射之后的欧式距离,相同的人脸的距离越小。
1 | 参数:第一个参数为预模型的地址,第二个和第三个参数为图片的地址 |
pycharm中运行记得修改成下面这样:
运行结果如下:
5、GPU内存溢出问题,已经解决
在
detect_face.py
中加入下面的配置,防止出现GPU内存不足报错,放在代码靠前的位置
1 | config = tf.ConfigProto(allow_soft_placement=True) |
四、相关函数
1、主要函数
- align/ :用于人脸检测与人脸对齐的神经网络
- facenet :用于人脸映射的神经网络
- util/plot_learning_curves.m:这是用来在训练softmax模型的时候用matlab显示训练过程的程序
2、facenet/contributed/相关函数:
1)、基于mtcnn与facenet的人脸聚类
代码:
facenet/contributed/cluster.py
(facenet/contributed/clustering.py
实现了相似的功能,只是没有mtcnn
进行检测这一步)
主要功能:
① 使用
mtcnn
进行人脸检测并对齐与裁剪② 对裁剪的人脸使用
facenet
进行embedding
③ 对
embedding
的特征向量使用欧式距离进行聚类
2)、基于mtcnn与facenet的人脸识别(输入单张图片判断这人是谁)
代码:
facenet/contributed/predict.py
主要功能:
① 使用
mtcnn
进行人脸检测并对齐与裁剪② 对裁剪的人脸使用
facenet
进行embedding
③ 执行
predict.py
进行人脸识别(需要训练好的svm模型)
3)、以numpy数组的形式输出人脸聚类和图像标签
代码:facenet/contributed/export_embeddings.py
主要功能:
① 需要对数据进行对齐与裁剪做为输入数据
② 输出
embeddings.npy
;labels.npy
;label_strings.npy