深度学习之人脸识别模型--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=…facenetsrc, 例如笔者的是:set PYTHONPATH=D:PythonWorkface-systemface-netfacenet-mastersrc
- b.在 计算机–>属性–>高级系统设置–>环境变量 中,新建PYTHONPATH,键入 D:PythonWorkface-systemface-netfacenet-mastersrc
- c.如果使用pycharm,请记得重启pycharm
2、重新裁剪LFM图片数据集的大小
程序中神经网络使用的是谷歌的“inception resnet v1”网络模型,这个模型的输入时160x160的图像,而我们下载的LFW数据集是250x250限像素的图像,所以需要进行图片的预处理。
- 原本数据集放在raw文件夹下面,新裁剪的图片放在ifw_160文件夹下面
data/lfw/raw :D:PythonWorkface-systemface-netfacenet-masterdataifwraw data/lfw/lfw_160:D:PythonWorkface-systemface-netfacenet-masterdataifwifw_160
shell
# 运行脚本,记得将图片文件夹修改为自己的文件夹目录
python srcalignalign_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)、运行脚本
shell
# 运行脚本,同样的,目录改为自己的
datalfwlfw_160:D:\Python\Work\face-system\face-net\facenet-master\data\ifw\ifw_160
srcmodels20180408-102900:D:\Python\Work\face-system\face-net\facenet-master\data\models\20180408-102900
Python srcvalidate_on_lfw.py datalfwlfw_160 srcmodels20180408-102900
- 安装网络上面的做法会出现错误,是应为data/pairs.txt读取不到,所以需要在运行脚本上面加上`–lfw_pairs=txt的地址
shell
运行脚本,同样的,目录改为自己的
datalfwlfw_160:D:\Python\Work\face-system\face-net\facenet-master\data\ifw\ifw_160
srcmodels20180408-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 srcvalidate_on_lfw.py datalfwlfw_160 srcmodels20180408-102900 --lfw_pairs=data/pairs.txt
3)、TensorFlow版本导致报错
shell
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可以对比两张人脸图片,可以得出他们的经过网络映射之后的欧式距离,相同的人脸的距离越小。
shell
# 参数:第一个参数为预模型的地址,第二个和第三个参数为图片的地址
python srccompare.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内存不足报错,放在代码靠前的位置
python
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.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
- python + selenium + PhantomJS 获取腾讯应用宝APP评论
- 简单实用的sql小技巧(第二篇)(r3笔记第86天)
- Java代码效率优化【面试+提高】
- 利用逻辑回归模型判断用户提问意图
- 关于reset sequence(r3笔记第85天)
- 【编程基础第十二讲】web开发编程基础--回调函数
- typeof的一些兼容性问题
- 类型转换的判定方式
- 【Java案例】打印杨辉三角
- html标签属性(attribute)和dom元素的属性(property)
- 关于long类型的转换(r3笔记第84天)
- jQuery的事件模型
- 关于索引的内部信息(r3笔记第83天)
- 【Java案例】打印五环
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 浙大版《C语言程序设计(第3版)》题目集 练习7-10 查找指定字符
- 浙大版《C语言程序设计(第3版)》题目集 练习7-11 字符串逆序
- 浙大版《C语言程序设计(第3版)》题目集 习题7-1 选择法排序
- 浙大版《C语言程序设计(第3版)》题目集 习题7-2 求一批整数中出现最多的个位数字
- 浙大版《C语言程序设计(第3版)》题目集 习题7-3 判断上三角矩阵
- 浙大版《C语言程序设计(第3版)》题目集 习题7-4 求矩阵各行元素之和
- 浙大版《C语言程序设计(第3版)》题目集 习题7-6 统计大写辅音字母
- 浙大版《C语言程序设计(第3版)》题目集 习题7-7 字符串替换
- 浙大版《C语言程序设计(第3版)》题目集 习题8-10 输出学生成绩
- 浙大版《C语言程序设计(第3版)》题目集 习题9-1 时间换算
- 浙大版《C语言程序设计(第3版)》题目集 习题9-3 平面向量加法
- 浙大版《C语言程序设计(第3版)》题目集 习题9-4 查找书籍
- 浙大版《C语言程序设计(第3版)》题目集 习题9-5 通讯录排序
- 浙大版《C语言程序设计(第3版)》题目集 习题7-5 找鞍点
- 浙大版《C语言程序设计(第3版)》题目集 练习5-1 求m到n之和