MTCNN人脸检测与人脸对齐


MTCNN人脸检测与人脸对齐


1 写在前面

首先再次提一下人脸识别的一般步骤:

人脸检测:简单的说就是得到人脸图像在图片中的位置;具体的一些方法有比如HOG/FHOG/SVM,还有一些基于Cascade的方式可以达到比较不错的效果。例如Compact CascadeCNN速度较快,速度要优于opencv和dlib,还有就是RCNN系列的通用检测方法(如R-CNN,FAST R-CNN,FASTER R-CNN等),这篇要讨论的MTCNN,速度和检测精度相比较而言都有一定的提升。
人脸对齐:一般是根据关键点的信息,将人脸图像进行仿射变换、缩放到统一大小(简单理解,例如根据人眼位置对齐);
特征提取:传统方式或是深度学习方法,本质是用特征对人脸图像进行表达;
特征比对:常见的是计算一个距离,例如用cos计算夹角;

2 MTCNN简介

MTCNN是2016年论文(Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks)提出的一个多任务级联卷积神经网络,它可以用来做人脸检测和人脸对齐,并且人脸检测和人脸对齐是同时进行的,它使用了3级CNN级联,包括三个部分PNet,RNet, ONet,也就是步骤1: Proposal Net,步骤2: Refine Net,步骤3: Output Net,参考论文示意图如下:
MTCNN人脸检测与人脸对齐_第1张图片

在Figure2中详细介绍了三个子网络的结构。
MTCNN人脸检测与人脸对齐_第2张图片

Stage1(P-Net): 主要用来生成一些候选框(bounding box),具体的:
给定一个图像,最初将其调整为不同的缩放比例的一个图像金字塔,然后利用一个全卷积神经网络, 称为Proposal网络(P-Net),获得候选窗口以及它们的边界框回归(bounding box regression)向量,这也类似论文论文中的方式。然后使用bounding box regression vectors用来校准候选窗口。再用非极大值抑制(NMS)合并高度重叠的候选窗口。
从上图中可以看到,在有3条支路用来分别做人脸分类、人脸框的回归和人脸关键点定位;在测试的时候这一步的输出只有N个bounding box的4个坐标信息和score,当然这4个坐标信息已经用回归支路的输出进行修正了,score可以看做是分类的输出(是人脸的概率)
MTCNN人脸检测与人脸对齐_第3张图片

Stage2(R-Net): 上一步的所有候选窗口都被送到另一个CNN网络,这里叫做精炼网络(R-Net)Refine
Network,它可以进一步挑选并拒绝大量的错误候选,然后再用边界框回归(bounding box regression)进行校准,和再用非极大值抑制(NMS)候选窗合并。
从上图可以看到这一个步骤中每个输入的bounding box的大小都是24*24,这可以通过resize操作得到。同样在测试的时候这一步的输出只有M个bounding box的4个坐标信息和score,4个坐标信息也用回归支路的输出进行修正了
MTCNN人脸检测与人脸对齐_第4张图片

Stage3(O-Net):。这个阶段与第二阶段相似,但在这个阶段的目标是更详细地描述脸部。特别的,该网络将输出五个人脸关键点的位置。从上图可以看到输入大小调整为48*48,输出包含P个bounding box的4个坐标信息、score和关键点信息。

3 Loss

3.1 人脸分类

人脸分类:学习目标的制定。一个两级分类的问题。对于每个样本i,我们使用
交叉熵(cross-entropy)损失:

Ldeti=(ydetilog(pi)+(1ydeti)(1log(pi))) L i d e t = − ( y i d e t l o g ( p i ) + ( 1 − y i d e t ) ( 1 − l o g ( p i ) ) )

pi表示样本是人脸的网络产生的概率。符号表示ground-truth标签。

3.2 Bounding box regression

对于每个候选窗口,我们预测它与最近的ground truth之间的偏移量(即,
边界框的左上方,高度和宽度)。学习目标是一个回归问题,我们采用欧几里得的损失为每个样本:

Lboxi=yˆboxiyboxi22 L i b o x = ‖ y ^ i b o x − y i b o x ‖ 2 2

yˆboxi y ^ i b o x 回归目标从网络获得并且ground-truth坐标。有四个坐标,包括左顶,高度和宽度,因此 yboxiR4 y i b o x ∈ R 4

3.3 Facial landmark localization

和边界框回归任务类似,脸部关键点检测用回归问题的公式表示并且我们可以最小化欧式损失(Euclidean loss):

Llandmarki=yˆlandmarkiylandmarki22 L i l a n d m a r k = ‖ y ^ i l a n d m a r k − y i l a n d m a r k ‖ 2 2

yˆlandmarki y ^ i l a n d m a r k 是人脸的关键点坐标,它从网络中获得而 yboxi y i b o x 是ground-truth坐标,包括左眼、右眼、鼻子、左嘴角和右嘴角,因此 yboxiR10 y i b o x ∈ R 10 .

3.4 Multi-source training:

由于我们在每个CNNs中使用不同的任务,在学习过程中有不同类型的训练图像,如脸部、非脸部和部分对齐的脸。在这种情况下,一些损失函数(例如: Eq.(1)-(3)不能用。例如,对于背景区域的样本,我们只计算交叉熵(cross-entropy)损失,另外两个损失设为0。这可以通过一个样本类型指示器直接实现(下式中的Bi)。然后,整体学习目标可制定为:

mini=1Njdet,box,landmarkαjβjiLji m i n ∑ i = 1 N ∑ j ∈ d e t , b o x , l a n d m a r k α j β i j L i j

其中N是训练样本的个数,aj表示任务的重要性,Bi为样本类型指示器,训练的过程中的不同阶段aj与Bi取不同的值,最后用随机梯度下降来训练CNN.

4. 训练

4.1 数据集

首先是训练数据准备,论文中使用的是两个公开数据集:
Wider(http://mmlab.ie.cuhk.edu.hk/projects/WIDERFace/ )它有以下几个特点:
1) 人脸检测基准数据集
2) 包含32203个图像和393703个人脸图像
3) 尺度,姿势,闭塞,表达,装扮,光照等变化大
4) 40%作为训练集,10%用于交叉验证(cross validation),50%作为测试集
5) 无背景边界框

和Celeba(http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html )数据集,它由以下特点:
1) 5个关键点,40个属性值
2) 高清的名人图片
3) 用于人脸检测,5点训练,人脸头部姿势的训练

4.2 数据注释

因为我们在这里同时执行人脸检测和对齐,所以我们在训练过程中使用四种不同的数据注释。
先再提一下交并比Intersection-over-Union (IoU):
简单来讲就是模型产生的目标窗口和原来标记窗口的交叠率。具体我们可以简单的理解为: 即检测结果(DetectionResult)与 Ground Truth 的交集比上它们的并集,即为检测的准确率 IoU

IOU=DetectionResultGroundTruthDetectionResultGroundTruth I O U = D e t e c t i o n R e s u l t ⋂ G r o u n d T r u t h D e t e c t i o n R e s u l t ⋃ G r o u n d T r u t h

(i) 反例:交并比(IoU)小于0.3的区域;
(ii) 正例: 交并比(IoU)高于0.65的区域;
(iii) Part faces: 交并IoU在0.4 ~ 0.65之间的区域;
(iv) 关键点人脸:标记了5个关键点位置的人脸。
其中正例和反例是用作人脸分类任务,反例和部分用作边界框回归(bounding box regression);
关键点人脸用作人脸的关键点定位。
每个阶段网络的训练数据如下:
1)P-Net:我们从Wider数据集随机裁剪几个patchs,收集正例、反例和部分的脸。然后,
从CelebA数据集中选取样本并裁剪人脸做为关键点人脸。
2)R-Net:我们使用框架的第一阶段来检测人脸图来搜集正例、反例和部分人脸,与此同时从CelebA数据集中检测关键点人脸。
3)O-Net:类似于R-Net来收集数据,但我们使用框架中的前两个的各个阶段来检测人脸。

4.3 训练

具体的训练github参考: https://github.com/Seanlinx/mtcnn

你可能感兴趣的:(人脸识别,Learning)