一、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

数据集

数据格式

  • 文件夹名/文件夹名_文件名

  • 同一个热的图片放在相同文件夹

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
2
# 运行脚本,记得将图片文件夹修改为自己的文件夹目录
python src\align\align_dataset_mtcnn.py data/lfw/raw data/lfw/lfw_160 --image_size 160 --margin 32
  • pycharm中运行记得修改成下面这样

3、评估预训练模型的准确率

1)、模型下载

facenet提供了两个预训练模型,分别是基于CASIA-WebFace和MS-Celeb-1M人脸库训练的,不过需要去谷歌网盘下载,这里给其中一个模型的百度网盘的链接:

https://pan.baidu.com/s/1LLPIitZhXVI_V3ifZ10XNg#list/path=%2F 密码: 12mh

模型放在data文件夹下,没有就创建

2)、运行脚本
1
2
3
4
5
# 运行脚本,同样的,目录改为自己的
data\lfw\lfw_160:D:\\Python\\Work\\face-system\\face-net\\facenet-master\\data\\ifw\\ifw_160
src\models\20180408-102900:D:\\Python\\Work\\face-system\\face-net\\facenet-master\\data\\models\\20180408-102900

Python src\validate_on_lfw.py data\lfw\lfw_160 src\models\20180408-102900
  • 安装网络上面的做法会出现错误,是应为data/pairs.txt读取不到,所以需要在运行脚本上面加上`–lfw_pairs=txt的地址
1
2
3
4
5
6
7
运行脚本,同样的,目录改为自己的

data\lfw\lfw_160:D:\\Python\\Work\\face-system\\face-net\\facenet-master\\data\\ifw\\ifw_160
src\models\20180408-102900:D:\\Python\\Work\\face-system\\face-net\\facenet-master\\data\\models\\20180408-102900
data/pairs.txt:D:\\Python\\Work\\face-system\\face-net\\facenet-master\\data\\pairs.txt

Python src\validate_on_lfw.py data\lfw\lfw_160 src\models\20180408-102900 --lfw_pairs=data/pairs.txt
3)、TensorFlow版本导致报错
1
2
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.
Traceback (most recent call last):
  • 解决方案

    1.把Tensorflow换为1.7版本的;

    2.在facenet.py代码中找到create_input_pipeline 再添加一行语句 with tf.name_scope("tempscope"): 就可以完美解决(貌似Tensorflow 1.10及以上版本才修复这个bug)。

  • 运行结果,可以看出,模型的精度高达99.7%

4、人脸对比程序运行

FaceNet可以对比两张人脸图片,可以得出他们的经过网络映射之后的欧式距离,相同的人脸的距离越小。

1
2
3
4
5
# 参数:第一个参数为预模型的地址,第二个和第三个参数为图片的地址
python src\compare.py
D:\\Python\\Work\\face-system\\face-net\\facenet-master\\data\\models\\20180408-102900
D:\\Python\\Work\\face-system\\face-net\\facenet-master\\data\\ifw\\ifw_160\\Aaron_Eckhart\\Aaron_Eckhart_0001.png
D:\\Python\\Work\\face-system\\face-net\\facenet-master\\data\\ifw\\ifw_160\\Aaron_Guiel\\Aaron_Guiel_0001.png
  • pycharm中运行记得修改成下面这样:

  • 运行结果如下:

5、GPU内存溢出问题,已经解决

detect_face.py中加入下面的配置,防止出现GPU内存不足报错,放在代码靠前的位置

1
2
3
config = tf.ConfigProto(allow_soft_placement=True)
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.5) #此处调整GPU的利用率
config.gpu_options.allow_growth = True

四、相关函数

1、主要函数

  • align/ :用于人脸检测与人脸对齐的神经网络
  • facenet :用于人脸映射的神经网络
  • util/plot_learning_curves.m:这是用来在训练softmax模型的时候用matlab显示训练过程的程序

2、facenet/contributed/相关函数:

1)、基于mtcnn与facenet的人脸聚类

代码:facenet/contributed/cluster.pyfacenet/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.npylabels.npylabel_strings.npy