https://zhuanlan.zhihu.com/p/37705980

人脸检测与人脸识别

人脸检测是对人脸进行识别和处理的第一步,主要用于检测并定位图片中的人脸,返回高精度的人脸框坐标及人脸特征点坐标。人脸识别会进一步提取每个人脸中所蕴涵的身份特征,并将其与已知的人脸进行对比,从而识别每个人脸的身份。目前人脸检测/识别的应用场景逐渐从室内演变到室外,从单一限定场景发展到广场、车站、地铁口等场景,人脸检测/识别面临的要求也越来越高,比如:人脸尺度多变、数量冗大、姿势多样包括俯拍人脸、戴帽子口罩等的遮挡、表情夸张、化妆伪装、光照条件恶劣、分辨率低甚至连肉眼都较难区分等。随着深度学习的发展,基于深度学习技术的人脸检测/识别方法取得了巨大的成功,本文主要介绍人脸检测的深度学习模型MTCNN和人脸识别的深度学习模型FaceNet。

2016年Kaipeng Zhang, Zhanpeng Zhang, Zhifeng Li, Yu Qiao提出了人脸检测MTCNN(Multi-task Cascaded Convolutional Networks)模型。该模式是一种Multi-task的人脸检测框架,使用3个CNN级联算法结构,将人脸检测和人脸特征点检测同时进行,检测效果如下图所示:


Google工程师Florian Schroff,Dmitry Kalenichenko,James Philbin提出了人脸识别FaceNet模型,该模型没有用传统的softmax的方式去进行分类学习,而是抽取其中某一层作为特征,学习一个从图像到欧式空间的编码方法,然后基于这个编码再做人脸识别、人脸验证和人脸聚类等。人脸识别效果如下图所示,其中横线上表示的数字是人脸间的距离,当人脸距离小于1.06可看作是同一个人。


MTCNN模型

MTCNN是多任务级联CNN的人脸检测深度学习模型,该模型中综合考虑了人脸边框回归和面部关键点检测。MTCNN的网络整体架构如下图所示:


首先照片会按照不同的缩放比例,缩放成不同大小的图片,形成图片的特征金字塔。PNet主要获得了人脸区域的候选窗口和边界框的回归向量。并用该边界框做回归,对候选窗口进行校准,然后通过非极大值抑制(NMS)来合并高度重叠的候选框。RNet将经过PNet的候选框在RNet网络中训练,然后利用边界框的回归值微调候选窗体,再利用NMS去除重叠窗体。ONet功能与RNet作用类似,只是在去除重叠候选窗口的同时,同时显示五个人脸关键点定位。

MTCNN人脸检测的训练数据可以从http://mmlab.ie.cuhk.edu.hk/projects/WIDERFace/地址下载。该数据集有32,203张图片,共有93,703张脸被标记,如下图所示:


标记文件的格式如下所示:

#文件名

File name

#标记框的数量

Number of bounding box

#其中x1,y1为标记框左上角的坐标,w,h为标记框的宽度,blur, expression, illumination, invalid, occlusion, pose为标记框的属性,比如是否模糊,光照情况,是否遮挡,是否有效,姿势等。

x1, y1, w, h, blur, expression, illumination, invalid, occlusion, pose

人脸关键点检测的训练数据可从mmlab.ie.cuhk.edu.hk/ar地址下载。该数据集包含5,590张 LFW数据集的图片和7,876张从网站下载的图片。如下所示:


标记文件的格式为:

#第一个数据为文件名,第二和第三个数据为标记框左上角坐标,第四和第五个数据为标记框长宽,第六和第七个数据为左眼标记点,第八和第九个数据为右眼标记点,第十和第十一个数据为左嘴标记点,最后两个坐标为右嘴标记点。

lfw_5590\Abbas_Kiarostami_0001.jpg 75 165 87 177 106.750000 108.250000 143.750000 108.750000 131.250000 127.250000 106.250000 155.250000 142.750000 155.250000

PNet的网络结构是一个全卷积的神经网络结构,如下图所:


该训练网络的输入是一个12*12大小的图片,所以训练前需要生成PNet网络的训练数据。训练数据可以通过和Guarantee True Box的IOU的计算生成一系列的bounding box。可以通过滑动窗口或者随机采样的方法获取训练数据,训练数据分为三种正样本,负样本,中间样本。其中正阳本是生成的滑动窗口和Guarantee True Box的IOU大于0.65,负样本是IOU小于0.3,中间样本是IOU大于0.4小于0.65。

然后把bounding box resize成12*12大小的图片,转换成12*12*3的结构,生成PNet网络的训练数据。训练数据通过10个3*3*3的卷积核,2*2的Max Pooling(stride=2)操作,生成10个5*5的特征图。接着通过16个3*3*10的卷积核,生成16个3*3的特征图。接着通过32个3*3*16的卷积核,生成32个1*1的特征图。最后针对32个1*1的特征图,可以通过2个1*1*32的卷积核,生成2个1*1的特征图用于分类;4个1*1*32的卷积核,生成4个1*1的特征图用于回归框判断;10个1*1*32的卷积核,生成10个1*1的特征图用于人脸轮廓点的判断。

RNet的模型结构如下所示:


模型输入为24*24大小的图片,通过28个3*3*3的卷积核和3*3(stride=2)的max pooling后生成28个11*11的特征图;通过48个3*3*28的卷积核和3*3(stride=2)的max pooling后生成48个4*4的特征图;通过64个2*2*48的卷积核后,生成64个3*3的特征图;把3*3*64的特征图转换为128大小的全连接层;对回归框分类问题转换为大小为2的全连接层;对bounding box的位置回归问题,转换为大小为4的全连接层;对人脸轮廓关键点转换为大小为10的全连接层。

ONet是MTCNN中的最后一个网络,用于做网络的最后输出。ONet的训练数据生成类似于RNet,检测数据为图片经过PNet和RNet网络后,检测出来的bounding boxes,包括正样本,负样本和中间样本。ONet的模型结构如下所示:


模型输入是一个48*48*3大小的图片,通过32个3*3*3的卷积核和3*3(stride=2)的max pooling后转换为32个23*23的特征图;通过64个3*3*32的卷积核和3*3(stride=2)的max pooling后转换为64个10*10的特征图;通过64个3*3*64的卷积核和3*3(stride=2)的max pooling后转换为64个4*4的特征图;通过128个2*2*64的卷积核转换为128个3*3的特征图;通过全链接操作转换为256大小的全链接层;最好生成大小为2的回归框分类特征;大小为4的回归框位置的回归特征;大小为10的人脸轮廓位置回归特征。

MTCNN模型推理

MTCNN的Inference流程如下图所示:


由原始图片和PNet生成预测的bounding boxes。输入原始图片和PNet生成的bounding box,通过RNet,生成校正后的bounding box。输入元素图片和RNet生成的bounding box,通过ONet,生成校正后的bounding box和人脸面部轮廓关键点。执行过程如下所示:

1. 首先读入要检测的图片:image = cv2.imread(imagepath)

2. 加载训练好的模型参数,构建检测对象:detector = MtcnnDetector

3. 执行推理操作:all_boxes,landmarks = detector.detect_face(image)

4. 绘制目标框:cv2.rectangle(image, box,(0,0,255))

FaceNet模型

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

FaceNet的训练数据可以从cbsr.ia.ac.cn/english/C下载,该训练数据包括10575个人,共453453张图片。验证数据集可以从vis-www.cs.umass.edu/lf地方下载,该数据集包含13,000张图片。训练数据的组织结构如下所示,其中目录名是人名,目录下的文件是对应人的照片。

Aaron_Eckhart

Aaron_Eckhart_0001.jpg

Aaron_Guiel

Aaron_Guiel_0001.jpg

Aaron_Patterson

Aaron_Patterson_0001.jpg

Aaron_Peirsol

Aaron_Peirsol_0001.jpg

Aaron_Peirsol_0002.jpg

Aaron_Peirsol_0003.jpg

Aaron_Peirsol_0004.jpg

...

接着对该训练数据中每个图片进行预处理,通过MTCNN模型把人脸检测出来,生成FaceNet的训练数据,如下图所示:


形成相应的数据结构如下所示:

Aaron_Eckhart

Aaron_Eckhart_0001_face.jpg

Aaron_Guiel

Aaron_Guiel_0001_face.jpg

……

FaceNet的网络结构如下图所示:


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

下图为FaceNet中采用的Inception架构的深度卷积神经网络:


模型结构的末端使用triplet loss来直接分类。triplet loss 的启发是传统loss函数趋向于将有一类特征的人脸图像映射到同一个空间。而triplet loss尝试将一个个体的人脸图像和其它人脸图像分开。三元组其实就是三个样例,如(anchor, pos, neg),利用距离关系来判断。即在尽可能多的三元组中,使得anchor和pos正例的距离,小于anchor和neg负例的距离,如下图所示:


用数学公式可以表示为:


模型在每个Mini Batch的训练时,为了计算triplet Loss值,需要选定合理的triplet三元组。如果采用暴力的方法从所有样本中找出离他最近的反例和离它最远的正例,然后进行优化,查找时间太长,并且还会由于错误标签图像导致训练收敛困难。可采用在线生成triplet的方式,在每个mini-batch中,生成triplet的时候,找出所有的anchor-pos对,然后对每个anchor-pos对找出其hard neg样本。主要流程如下所示:

1. 在mini-batch开始的时候,从训练数据集中抽样人脸照片。比如每一个batch抽样多少人,每个人抽样多少张图片,这样会得到要抽样的人脸照片。

2. 计算这些抽样图片在网络模型中得到的embedding,这样通过计算图片的embedding之间的欧式距离得到三元组了。

3. 根据得到的三元组,计算triplet-loss,进行模型优化,更新embedding。

FaceNet模型推理

FaceNet模型推理流程如下所示:


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

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

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

总结

本文首先介绍了人脸检测和人脸识别,人脸检测用于定位图片中的人脸,人脸识别用于识别人脸的身份。然后讲解了MTCNN模型的主要思想,并对MTCNN的关键技术进行分析,主要包括训练数据,网络架构,PNet,RNet,ONet及模型推理。接着讲解了FaceNet模型的主要思想及关键技术包括训练数据,网络结构,损失方程及Triplet的选择。用户可应用MTCNN及FaceNet模型架构到工业领域中相关人脸检测及识别场景。

参考文献

[1] MTCNN: a Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks.

[2] github.com/AITTSMD/MTCN

[3] FaceNet: A Unified Embedding for Face Recognition and Clustering

[4] github.com/davidsandber

(转)如何应用MTCNN和FaceNet模型实现人脸检测及识别相关推荐

  1. mtcnn人脸检测python_基于mtcnn和facenet的实时人脸检测与识别系统开发

    简介:本文主要介绍了实时人脸检测与识别系统的详细方法.该系统基于python/opencv2/tensorflow环境,实现了从摄像头读取视频,检测人脸,识别人脸的功能.本系统代码地址:real ti ...

  2. 基于MTCNN和FaceNet的实时人脸检测识别系统

    文章目录 模型介绍 MTCNN FaceNet 基于MTCNN和FaceNet的实时人脸检测识别系统 在LFW数据集上测试 参考文献 GitHub项目地址:https://github.com/Har ...

  3. MTCNN——基于级联模型的人脸关键点检测网络

    目录 1 致谢 2 前言 3 MTCNN--基于级联模型的人脸关键点检测网络 3.1 P-Net 3.1.1 训练数据是12x12,那么检测时也是要把所有的图像都放缩到12x12吗? 3.1.2 图像 ...

  4. facenet识别准确率_GitHub - zjj-2015/tf_facenet: facenet人脸检测与识别系统

    tf_facenet facenet人脸检测与识别项目 说明 近期研究的课题是孪生网络,看到了FaceNet采用了孪生网络,研究的同时顺带把人脸识别FaceNet实现下, 做了个简单的人脸识别项目:包 ...

  5. 基于facenet的实时人脸检测

    参考自https://github.com/shanren7/real_time_face_recognition 本人的项目代码https://github.com/zouzhen/real_tim ...

  6. MTCNN算法与代码理解—人脸检测和人脸对齐联合学习

    MTCNN算法与代码理解-人脸检测和人脸对齐联合学习 写在前面 主页:https://kpzhang93.github.io/MTCNN_face_detection_alignment/index. ...

  7. OpenCvSharp人脸检测(二) DNN加载Caffe模型做人脸检测

    更多视觉图像处理相关内容,可关注[OpenCV与AI深度学习]公众号获取! 本文作者Color Space,文章未经作者允许禁止转载! 本文将介绍OpenCvSharp人脸检测(二) DNN加载Caf ...

  8. 【FPGA教程案例91】机器视觉2——通过FPGA实现基于肤色模型的人脸检测,使用MATLAB辅助测试

    FPGA教程目录 MATLAB教程目录 本课程成果预览(将FPGA处理结果导入到matlab显示效果) 目录 1.软件版本 2.基于肤色模型的人脸检测原理

  9. C# OpenCV人脸检测(三) DNN加载FaceDetectorYN模型做人脸检测

    点击下方卡片,关注"OpenCV与AI深度学习"公众号 视觉/图像重磅干货,第一时间送达 本文作者Color Space,文章未经作者允许禁止转载! 本文将介绍C# OpenCV人 ...

最新文章

  1. 协方差矩阵有什么意义?
  2. mysql用户权限管理的问题
  3. TScreen 类 - 获取字体列表
  4. springmvc十九:springmvc表单标签
  5. docker,containerd,runc,docker-shim之间的关系
  6. 【机器学习】特征预处理
  7. 无法嵌入互操作类型 请改用适用的接口_可微编程-自上而下的产品形态 4 Python互操作性...
  8. Redis——史上最强【集群】入门实践教程
  9. DBA邀请函丨数据库大咖讲坛来深圳啦!线下沙龙+线上直播,共享技术盛会!
  10. 2018数据技术嘉年华-金融峰会·重庆站即将起航!
  11. 活动目录建立IIS站点
  12. 如何在 Mac 上关闭睡眠模式?
  13. 免费临时邮箱大全,专注个人隐私保护
  14. DOS命令查看局域网所有IP
  15. 500G JAVA视频网盘分享 JEECG开源社区
  16. IOS 最新邓白氏编码申请
  17. Nessus之——Nessus的整理
  18. “干爹”这事是怎么在北美洗白白的
  19. 【C++】什么是对象?什么是类?
  20. 使用 dcm4che 操作 Dicom 文件

热门文章

  1. 软件机器人实现一键报税,即使没有开发接口,纳税申报也照样方便、快捷
  2. 极品特效HTML5动画推荐,不看的程序员后悔一辈子
  3. 关于win10笔记本右键无响应的问题解决
  4. 【福大/计院】转专业
  5. 3dmax最全选择方式讲解
  6. easyPOI和导入复杂excel的各种坑
  7. VRF虚拟路由转发实例说明
  8. 做自媒体视频剪辑为什么赚不到钱?
  9. 错误 C4996 inet_addr: Use inet_pton() or InetPton() instead or defin
  10. Python-玩转数据-动态地图