https://blog.csdn.net/fendouaini/article/details/82025759
【磐创AI导读】本文是深度学习之视频人脸识别系列的第二篇文章,介绍人脸检测与对齐的相关算法。欢迎大家关注我们的公众号:磐创AI。
一、人脸检测与关键点检测
问题描述:
人脸检测解决的问题为给定一张图片,输出图片中人脸的位置,即使用方框框住人脸,输出方框的左上角坐标和右下角坐标或者左上角坐标和长宽。算法难点包括:人脸大小差异、人脸遮挡、图片模糊、角度与姿态差异、表情差异等。而关键检测则是输出人脸关键点的坐标,如左眼(x1,y1)、右眼(x2,y2)、鼻子(x3,y3)、嘴巴左上角(x4,y4)、嘴巴右上角(x5,y5)等。
深度学习相关算法:
(1)Cascade CNN
Cascade CNN源于发表于2015年CVPR上的一篇论文A Convolutional Neural Network Cascade for Face Detection【2】,作者提出了一种级连的CNN网络结构用于人脸检测。算法主体框架是基于V-J的瀑布流思想【1】,是传统技术和深度网络相结合的一个代表,Cascade CNN包含了多个分类器,这些分类器使用级联结构进行组织,与V-J不同的地方在于Cascade CNN采用卷积网络作为每一级的分类器。整个网络的处理流程如下图所示:
整个处理流程里包含了六个网络:12-net、12-calibration-net、24-net、24-calibration-net、48-net、48-calibration-net,其中三个二分类网络用于分类其是否为人脸,另外三个calibration网络用于矫正人脸框边界。其中第二个网络之后、第四个网络之后、第五个网络之后使用NMS算法过滤掉冗余的框。
12-net,24-net和48-net的网络结构如下图所示:
13-12-calibration-net,24-calibration-net,48-calibration-net的结构如下图所示:
该算法结合了V-J框架构造了级连的CNN网络结构并设计边界矫正网络用来专门矫正人脸框边界,在AFW数据集上准确率达到97.97%。
(2)Faceness-Net
Faceness-Net源于论文A convolutional neural network cascade for face detection【3】,该算法基于DCNN网络【5】的人脸局部特征分类器,算法首先进行人脸局部特征的检测,使用多个基于DCNN网络的facial parts分类器对人脸进行评估,然后根据每个部件的得分进行规则分析得到Proposal的人脸区域,然后从局部到整体得到人脸候选区域,再对人脸候选区域进行人脸识别和矩形框坐标回归,该过程分为两个步骤。
第一个步骤:每个人脸局部特征使用attribute-aware网络检测并生成人脸局部图,其中一共五个特征属性: 头发、眼睛、鼻子、嘴巴、胡子。然后通过人脸局部图根据评分构建人脸候选区域,具体如下图所示:
第二个步骤:训练一个多任务的卷积网络来完成人脸二分类和矩形框坐标回归,进一步提升其效果,具体如下图所示:
Faceness从脸部特征的角度来解决人脸检测中的遮挡和姿态角度问题,其整体性能在当时是非常好的,在AFW数据集上准确率可以达到98.05%。
(3)MTCNN
MTCNN源于论文Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks【6】,是基于多任务级联卷积神经网络来解决人脸检测和对齐问题,同时输出图片的人脸矩阵框和关键点坐标(左眼、右眼、鼻子、嘴巴左上角、嘴巴右上角)。MTCNN为三阶的级联卷积神经网络,整体框架如下图所示:
输入阶段:为应对目标多尺度问题,将原始图像resize到不同尺寸,构建图像金字塔,作为三阶级联架构的输入,这样处理可以更好地检测大小不一的人脸。
第一阶段:通过一个全部由卷积层组成的CNN,取名P-Net,获取候选人脸框、关键点坐标和人脸分类(是人脸或不是),之后采用NMS过滤掉高重叠率的候选窗口。如下图所示:
第二阶段:第一阶段输出的候选人脸框作为更为复杂的R-Net网络的输入,R-Net进一步筛除大量错误的候选人脸框,同样也通过NMS过滤掉高重叠率的候选窗口。如下图所示:
第三阶段:与第二阶段类似,最终网络输出人脸框坐标、关键点坐标和人脸分类(是人脸或不是)。如下图所示:
MTCNN通过三级的级联卷积神经网络对任务进行从粗到细的处理,还提出在线困难样本生成策略(online hard sample mining )可以进一步提升性能。兼并了速度与准确率,速度在GPU上可以达到99FPS,在 FDDB数据集上可以达到95.04准确率,具体如下图所示:
二、人脸对齐(部分参考于GraceDD的博客文章)
人脸对齐通过人脸关键点检测得到人脸的关键点坐标,然后根据人脸的关键点坐标调整人脸的角度,使人脸对齐,由于输入图像的尺寸是大小不一的,人脸区域大小也不相同,角度不一样,所以要通过坐标变换,对人脸图像进行归一化操作。人脸关键点检测有很多算法可以使用包括:ASM、AAM、DCNN 、TCDCN 、MTCNN 、TCNN、TCNN等,这里就不详细介绍,主要说一下得到人脸关键点之后如何进行人脸对齐,是所有人脸达到归一化效果,该过程如下图所示:
该过程涉及到图像的仿射变换,简单来说,“仿射变换”就是:“线性变换”+“平移”,即坐标的变换。假如我们希望人脸图片归一化为尺寸大小600*600,左眼位置在(180,200),右眼位置在(420,200)。 这样人脸中心在图像高度的1/3位置,并且两个眼睛保持水平,所以我们选择左眼角位置为( 0.3*width, height / 3 ),右眼角位置为(0.7*width , height / 3) 。
利用这两个点计算图像的变换矩阵(similarity transform),该矩阵是一个2*3的矩阵,如下:
如果我们想对一个矩形进行变换,其中x、y方向的缩放因为分别为sx,sy,同时旋转一个角度 ,然后再在x方向平移tx, 在y方向平移ty
利用opencv的estimateRigidTransform方法,可以获得这样的变换矩阵,但遗憾的是,estimateRigidTransform至少需要三个点,所以我们需要构选第三个点,构造方法是用第三个点与已有的两个点构成等边三角形,这样第三个点的坐标为:
代码如下:
经过上一步的处理之后,所有的图像都变成一样大小,并且又三个关键点的位置是保持一致的,但因为除了三个点对齐了之外,其他点并没有对齐。所以根据得到的变换矩阵对剩下所有的点进行仿射变换,opencv代码如下所示:
img为输入图像;
warped为变换后图像,类型与src一致;
M为变换矩阵,需要通过其它函数获得,当然也可以手动输入;
Image_size为输出图像的大小;
三、 总结
本期文章主要介绍了人脸检测与对齐的相关算法,下一期我给大家介绍一下人脸表征的相关算法,即通过深度学习提取人脸特征,通过比较人脸特征进行人脸识别与验证。
参考文献:
【1】 S.Z.Li, L.Zhu, Z.Q.Zhang, A.Blake, H.J.Zhang, H.Y.Shum. Statistical learning of multi-view face detection. In: Proceedings of the 7-th European Conference on Computer Vision. Copenhagen, Denmark: Springer, 2002.67-81.
【2】Li H, Lin Z, Shen X, et al. A convolutional neural network cascade for face detection[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2015: 5325-5334.
【3】Yang S, Luo P, Loy C C, et al. Faceness-Net: Face detection through deep facial part responses[J]. IEEE transactions on pattern analysis and machine intelligence, 2017.
【4】Yang S, Luo P, Loy C C, et al. From facial parts responses to face detection: A deep learning approach[C]//Proceedings of the IEEE International Conference on Computer Vision. 2015: 3676-3684.
【5】Sun Y, Wang X, Tang X. Deep convolutional network cascade for facial point detection[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2013: 3476-3483.
【6】Zhang K, Zhang Z, Li Z, et al. Joint face detection and alignment using multitask cascaded convolutional networks[J]. IEEE Signal Processing Letters, 2016, 23(10): 1499-1503.