人脸识别之人脸检测(十四)--MTCNN
来源:互联网 发布:宠物用品软件 编辑:程序博客网 时间:2024/06/05 08:57
转自:http://blog.csdn.net/tinyzhao/article/details/53236191
本文来自于中国科学院深圳先进技术研究院,目前发表在arXiv上,是2016年4月份的文章,算是比较新的文章。
论文地址:
https://kpzhang93.github.io/MTCNN_face_detection_alignment/
概述
相比于R-CNN系列通用检测方法,本文更加针对人脸检测这一专门的任务,速度和精度都有足够的提升。R-CNN,Fast R-CNN,FasterR-CNN这一系列的方法不是一篇博客能讲清楚的,有兴趣可以找相关论文阅读。类似于TCDCN,本文提出了一种Multi-task的人脸检测框架,将人脸检测和人脸特征点检测同时进行。论文使用3个CNN级联的方式,和Viola-Jones类似,实现了coarse-to-fine的算法结构。
框架
算法流程
当给定一张照片的时候,将其缩放到不同尺度形成图像金字塔,以达到尺度不变。
Stage 1:使用P-Net是一个全卷积网络,用来生成候选窗和边框回归向量(bounding box regression vectors)。使用Bounding box regression的方法来校正这些候选窗,使用非极大值抑制(NMS)合并重叠的候选框。全卷积网络和Faster R-CNN中的RPN一脉相承。
Stage 2:使用N-Net改善候选窗。将通过P-Net的候选窗输入R-Net中,拒绝掉大部分false的窗口,继续使用Bounding box regression和NMS合并。
Stage 3:最后使用O-Net输出最终的人脸框和特征点位置。和第二步类似,但是不同的是生成5个特征点位置。
CNN结构
本文使用三个CNN,结构如图:
训练
这个算法需要实现三个任务的学习:人脸非人脸的分类,bounding box regression和人脸特征点定位。
(1)人脸检测
这就是一个分类任务,使用交叉熵损失函数即可:
(2)Bounding box regression
这是一个回归问题,使用平方和损失函数:
(3)人脸特征点定位
这也是一个回归问题,目标是5个特征点与标定好的数据的平方和损失:
(4)多任务训练
不是每个sample都要使用这三种损失函数的,比如对于背景只需要计算
N是训练样本的数量。
(5)online hard sample mining
传统的难例处理方法是检测过一次以后,手动检测哪些困难的样本无法被分类,本文采用online hard sample mining的方法。具体就是在每个mini-batch中,取loss最大的70%进行反向传播,忽略那些简单的样本。
实验
本文主要使用三个数据集进行训练:FDDB,Wider Face,AFLW。
A、训练数据
本文将数据分成4种:
Negative:非人脸
Positive:人脸
Part faces:部分人脸
Landmark face:标记好特征点的人脸
分别用于训练三种不同的任务。Negative和Positive用于人脸分类,positive和part faces用于bounding box regression,landmark face用于特征点定位。
B、效果
本文的人脸检测和人脸特征点定位的效果都非常好。关键是这个算法速度很快,在2.6GHZ的CPU上达到16fps,在Nvidia Titan达到99fps。
总结
本文使用一种级联的结构进行人脸检测和特征点检测,该方法速度快效果好,可以考虑在移动设备上使用。这种方法也是一种由粗到细的方法,和Viola-Jones的级联AdaBoost思路相似。
类似于Viola-Jones:1、如何选择待检测区域:图像金字塔+P-Net;2、如何提取目标特征:CNN;3、如何判断是不是指定目标:级联判断。
训练数据整理
Wider_face包含人脸边框标注数据,大概人脸在20万,CelebA包含边框标注数据和5个点的关键点信息.对于三个网络,提取过程类似,但是图像尺寸不同.
正负样本,部分样本提取:
1.从Wider_face随机选出边框,然后和标注数据计算IOU,如果大于0.65,则为正样本,大于0.4小于0.65为部分样本,小于0.4为负样本.
2.计算边框偏移.对于边框,(x1,y1)为左上角坐标,(x2,y2)为右下角坐标,新剪裁的边框坐标为(xn1,yn1),(xn2,yn2),width,height.则offset_x1 = (x1 - xn1)/width,同上,计算另三个点的坐标偏移.
3.对于正样本,部分样本均有边框信息,而对于负样本不需要边框信息
关键点样本提取
1.从celeba中提取,可以根据标注的边框,在满足正样本的要求下,随机裁剪出图片,然后调整关键点的坐标.
loss修改
由于训练过程中需要同时计算3个loss,但是对于不同的任务,每个任务需要的loss不同.
所有在整理数据中,对于每个图片进行了15个label的标注信息
1.第1列:为正负样本标志,1正样本,0负样本,2部分样本,3关键点信息
2.第2-5列:为边框偏移,为float类型,对于无边框信息的数据,全部置为-1
3.第6-15列:为关键点偏移,为floagt类型,对于无边框信息的数据,全部置为-1
修改softmax_loss_layer.cpp 增加判断,只对于1,0计算loss值
修改euclidean_loss_layer.cpp 增加判断,对于置为-1的不进行loss计算
困难样本选择
论文中作者对与人脸分类任务,采用了在线困难样本选择,实现过程如下:
修改softmax_loss_layer.cpp,根据计算出的loss值,进行排序,只对于70%的值较低的数据,进行反向传播.
- 人脸识别之人脸检测(十四)--MTCNN
- 人脸检测算法MTCNN
- 人脸检测之MTCNN训练自己的数据
- 人脸检测——MTCNN
- 人脸检测——MTCNN
- 人脸检测——MTCNN
- 基于 MTCNN/TensorFlow 实现人脸检测
- 基于 MTCNN/TensorFlow 实现人脸检测
- 人脸检测、人脸对齐(MTCNN方法)
- 基于Opencv/TensorFlow/mtcnn/Facenet的实时人脸检测/人脸识别
- 人脸检测和对齐--MTCNN训练1--P-net
- 人脸检测——MTCNN学习笔记
- 基于NCNN的人脸检测MTCNN实现过程
- 人脸检测(三)——Multi-task CNN(MTCNN)
- MTCNN人脸及特征点检测---代码应用详解(基于ncnn架构)
- MTCNN批量读取图片进行人脸和关键点检测,并保存检测结果
- MTCNN-将多任务级联卷积神经网络用于人脸检测和对齐
- 人脸检测——mtcnn思想,生成negative、positive、part样本。
- 入库时效列表
- 常见zz错误
- 装饰模式
- 第一个项目
- 栗酱的异或和(取石子问题)
- 人脸识别之人脸检测(十四)--MTCNN
- HDU 1421 搬寝室 (DP)
- Sublime Text3(ST3)连接ftp/sftp
- 使用Python import cv2失败 显示ImportError: DLL load failed:找不到指定的模块。
- 小白双链表
- swing java画图工具
- 链表(下)
- 在Qt中集成QVTKWidget
- unity ray射线说明, 及使用ray拾取物体的方法。