许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  利用MTCNN和FaceNet实现人脸检测与人脸识别(完整流程)

利用MTCNN和FaceNet实现人脸检测与人脸识别(完整流程)

阅读数 3
点赞 0
article_banner

一、项目结构:

   打开FaceNet Github地址: https://github.com/davidsandberg/facenet,把我们需要的文件拷贝到自己独立的工程中,(1)align文件夹,(2)facenet.py文件:

align:这个文件夹是从facenet中拷贝的,https://github.com/davidsandberg/facenet/tree/master/src/align,主要是MTCNN人脸检测的相关文件

facenet.py:这个Python文件也是从facenet中拷贝的,https://github.com/davidsandberg/facenet/blob/master/src/facenet.py

   其他文件介绍

dataset:这个文件夹主要存放数据,如人脸数据库

utils:这个文件是工具 类  文件,用于文件读写,图像相关操作的函数方法等

models:存放facenet预训练模型,百度网盘下载地址链接: https://pan.baidu.com/s/1hAK9ylURkbeH52BtSSGWsw 提取码: jf1n

Pre-trained models:


Model nameLFW accuracyTraining datasetArchitecture
20180408-1029000.9905CASIA-WebFaceInception ResNet v1
20180402-1147590.9965VGGFace2Inception ResNet v1

NOTE: If you use any of the models  , please do not forget to give proper credit to those providing the training dataset as well.

二、实现流程

1.通过MTCNN人脸检测模型,从照片中提取人脸图像。

2.把人脸图像输入到FaceNet,计算Embedding的特征向量。

3.比较特征向量间的欧式距离,判断是否为同一人,例如当特征距离小于1的时候认为是同一个人,特征距离大于1的时候认为是不同人。


三、Multi-task CNN(MTCNN)人脸检测

   人脸检测方法很多,如Dilb,OpenCV,OpenFace人脸检测等等,这里使用MTCNN进行人脸检测,一方面是因为其检测精度确实不错,另一方面facenet工程中,已经提供了用于人脸检测的mtcnn接口。  MTCNN是多任务级联CNN的人脸检测 深度学习 模型,该模型中综合考虑了人脸边框回归和面部关键点检测。在facenet工程中的位置是align/detect_face.py ,它的参数模型也保存在align文件夹下,分别是det1.npy,det2.npy,det3.npy

参考资料:

https://blog.csdn.net/qq_28618765/article/details/78127967

https://blog.csdn.net/gubenpeiyuan/article/details/80475307

   MTCNN一个深度卷积多任务的框架,这个框架利用了检测和对准之间固有的关系来增强他们的性能。特别是,在预测人脸及脸部标记点的时候,通过3个CNN级联的方式对任务进行从粗到精的处理。

Stage 1:使用P-Net是一个全卷积网络,用来生成候选窗和边框回归向量(bounding box regression vectors)。使用Bounding box regression的方法来校正这些候选窗,使用非极大值抑制(NMS)合并重叠的候选框。全卷积网络和Faster R-CNN中的RPN一脉相承。

Stage 2:使用R-Net改善候选窗。将通过P-Net的候选窗输入R-Net中,拒绝掉大部分false的窗口,继续使用Bounding box regression和NMS合并。

Stage 3:最后使用O-Net输出最终的人脸框和特征点位置。和第二步类似,但是不同的是生成5个特征点位置。

   这里提供一个使用MTCNN进行人脸检测的方法:

   当然,实际应用中,建议还是封装成一个类吧,方面初始化和单独调用:

注意:mtcnn人脸检测获得bboxes并不一定是正方形的矩形框,参数fixed指定等宽或者等高的bboxes,其实现方法可以参考get_square_bboxes()方法。当然啦,你也可以不调用get_square_bboxes()方法,直接resize成指定大小,也是OK的。


四、faceNet人脸识别

   FaceNet Github地址: https://github.com/davidsandberg/facenet

   参考资料:https://blog.csdn.net/fire_light_/article/details/79592804

   Google工程师Florian Schroff,Dmitry Kalenichenko,James Philbin提出了人脸识别FaceNet模型,该模型没有用传统的softmax的方式去进行分类学习,而是抽取其中某一层作为特征,学习一个从图像到欧式空间的编码方法,然后基于这个编码再做人脸识别、人脸验证和人脸聚类等。

   FaceNet主要用于验证人脸是否为同一个人,通过人脸识别这个人是谁。FaceNet的主要思想是把人脸图像映射到一个多维空间,通过空间距离表示人脸的相似度。同个人脸图像的空间距离比较小,不同人脸图像的空间距离比较大。这样通过人脸图像的空间映射就可以实现人脸识别,FaceNet中采用基于深度神经网络的图像映射方法和基于triplets(三联子)的loss函数训练神经网络,网络直接输出为128维度的向量空间。

   FaceNet的网络结构如下图所示,其中Batch表示人脸的训练数据,接下来是深度卷积神经网络,然后采用L2归一化操作,得到人脸图像的特征表示,最后为三元组(Triplet Loss)的损失函数。

   下面是鄙人已经封装好的facenetEmbedding类,其中类函数get_embedding(self,images)方法用于提取facenet的人脸特征embadding,有了人脸embadding特征,就可以比较人脸相似性啦!



五、产生数据库

  既然是人脸识别,数据库肯定要有已知人脸的数据库,不然怎么知道被检测的人脸是哪位大神,所以先制作人脸数据库。

(1)制作人脸数据图库:

   把相关大神的人像收集放在dataset/images文件夹下:

特别说明:

这里只收集了4张胡歌和4张周杰伦的单人照片, 注意制作人脸数据图库时,所使用的照片必须是单人照片!!! 若需要新增图库,只需在dataset/images下,新建一个文件夹,如,新增“xietingfeng”(谢霆锋)的文件夹,然后把谢霆锋的单人照片放在里面即可,图片名称可以是任意 函数image_list,names_list=file_processing.gen_files_labels(images_dir,postfix='jpg')可以获取目录images_dir下所有文件,包括子目录下的所有文件路径(image_list),其中names_list就是子目录的文件名,一般子目录作为样本的标签。

(2)生成embedding数据库

   有了人脸数据图库,就可以使用create_dataset.py生成embedding数据库(人脸特征),后面待检测识别的人脸,只需要与这些embedding数据库(人脸特征)进行相似性比较,就可以识别人脸啦!!!!

opencv-python的imread()函数并不支持中文路径,这里在提供一个函数read_image_gbk()方便读取中文路径的图像。详细请看image_processing.py文件


六、人脸识别过程

(1)加载人脸数据库

    把上面制作的,已知的人脸数据库加载进来:

(2)进行人脸检测

(3)人脸识别(比较相似性)

   比较特征向量间的欧式距离

(4)人脸识别效果

   一切准备好了,开始run:

   说明:

为了方便测试, 这里以文件的路径作为人脸label,这样方便知道被检测人脸与哪一张图片最相似

./dataset/emb_face\huge\huge_1.jpg

   ./dataset/emb_face\huge\huge_2.jpg

   ./dataset/emb_face\huge\huge_3.jpg

   ./dataset/emb_face\huge\huge_4.jpg

   ./dataset/emb_face\zhoujielun\zhoujielun_1.jpg

   ./dataset/emb_face\zhoujielun\zhoujielun_2.jpg

   ./dataset/emb_face\zhoujielun\zhoujielun_3.jpg

   ./dataset/emb_face\zhoujielun\zhoujielun_4.jpg

对应的label是:

huge

   huge

   huge

   huge

   zhoujielun

   zhoujielun

   zhoujielun

   zhoujielun

七、模型测评

   为了对faceNed性能进行测评,这里提供一个测评文件:evaluation_test.py,该文件会绘制测试文件的ROC曲线,并给出最优阈值,以及FPR, TPR, AUC等参数。

这里的测试数据集是agedb_30,该数据集共有12000张,分为6000对照片,每对照片有一个label,即True和False,对应1和0,表示该对照片是否是同一个人;利用该数据集,就可以绘制模型的ROC曲线了

对应的ROC曲线如下:optimal_idx :1038,最佳阈值:best_threshold :1.1444087028503418

FaceNet的人脸识别效果并不算好,相比InsightFace模型,就差很多。目前使用InsightFace模型测试,在开数据集可以达到99.6%,在自建的数据集可以达到93%的准确率,比虹软的人脸识别率还高一点,关于InsightFace模型的项目,我还在整理,网友慢慢期待哈,不急!

八、参考资料:

【1】《如何应用MTCNN和FaceNet模型实现人脸检测及识别》http://www.uml.org.cn/ai/201806124.asp


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空