一、MTCNN原理
1.MTCNN的推理流程
MTCNN包括三个阶段:在第一阶段,通过一个浅层的CNN网络来快速生成检测窗口作为第二阶段的输入。第二额极端,通过一个更复杂的CNN网络来剔除大量非面部窗口,以达到细化候选窗口的目的。第三阶段,使用一个更强大的CNN网络来再次细化结果,并输出5个人脸关键点的位置。这三个阶段分别对应三个网络:P-Net、R-Net和O-Net。
注意:第一阶段的输入并不是原始图像,而是将图片调整到不同比例之后,得到一个图像金字塔,将其作为输入。
-
P-NET(Proposal Network):P-Net是一个全卷积网络,用来获得人脸的候选窗口(candidate facial windows)以及他们的边界框回归向量(bounding box regression vectors)。之后通过估计的边界框回归向量校准候选窗口。之后,我们采用了非极大值抑制(non-maximum suppression, NMS)来合并高度重合的候选框。
-
R-NET(Refine Network):R-Net进一步拒绝了大量错误的候选框,之后通过候选窗口的边界框回归进行校准,之后执行NMS。
-
O-NET(Output Network):O-Net和之前类似,但是O-Net会识别出更多标注的人脸区域,并且这个网络会输出五个面部特征点的位置。
2.CNN的结构
由于Cascade CNN的的性能可能受到以下限制:
-
卷积层中的某些卷积核缺乏可能限制其辨别能力的多样性。
-
与其它检测任务相比,人脸检测是一项二分类任务,因此每层可能需要的滤波器数量较少。
因此,MTCNN减少滤波器的数量并将5×5的卷积核更改为3×3以减少计算,同时增加深度以获得更好的性能。通过这些改进,可以在更少的运行时间内获得更好的性能。为了公平比较,在每个组中使用相同的训练和验证数据。MTCNN将PReLU作为卷积层和全连接层(输出层除外)之后的非线性激活函数。
3.训练模型
MTCNN人脸检测器的训练分为三个任务(task):面部/非面部分类(face/non-face classification)、边界框回归(bounding box regression)和面部关键点定位(facial landmark localization)。
-
人脸分类:这是一个二分类问题。对于每个样本(x_i),使用交叉熵损失:
[L_i^{det} = - (y_i^{det} log(p_i) + (1 - y_i^{det})(1-log(p_i))) ag{1} ]其中(p_i)是样本(x_i)被网络判定为人脸的概率,(y_i^{det})是样本(x_i)的标签,只有0和1这两个取值。
-
边界框回归:对于每个候选窗口,预测它与最近的样本真实值(ground truth,在有监督学习中,Ground Truth通常指代样本集中的标签)之间的偏移量(即边界框的左边、顶部、高度和宽度)。这是一个回归问题。对于每个样本(x_i),使用欧式距离来度量损失:
[L_i^{box} = ||hat{y}_i^{box} - y_i^{box} ||_2^2 ag{2} ]其中,(hat{y}_i^{box})是网络预测的回归结果,(y_i^{box})是样本真实值的坐标(包含四个维度:左边、顶部、高度和宽度,因此是一个四维向量)。
-
面部关键点定位:这也是一个回归问题。对于每个样本(x_i),使用欧式距离来度量损失:
[L_i^{lan dmark} = ||hat{y}_i^{landmark} - y_i^{landmark} ||_2^2 ag{3} ]其中,(hat{y}_i^{landmark})是网络预测的回归结果,(y_i^{landmark})是第i个样本的真实值的坐标(包含五个关键点:是左眼,右眼,鼻子,左嘴角和右嘴角,因此是一个十维向量)。
-
多源训练(Multi-source trainning):由于我们在每个CNN中使用不同的任务,所以在学习过程中有不同类型的训练图像,如人脸、非人脸和部分对齐的人脸。在这种情况下,一些损失函数(即等式1-3)不会被用到。例如,对于背景区域的样本,我们只计算(L_i^{det}),其他两个损失设为0。这可以直接用样本类型指示器来实现。然后总体学习目标可以表述为:
[min Sigma_{i=1}^N Sigma_{j in {det, box, landmarks}} alpha_j eta_i^j L_i^j ag{4} ]其中N是训练样本的数量,(alpha_j)是任务的重要性(也就是不同任务的损失函数所占的权重)。在P-Net和R-Net中,(alpha_{det} = 1, alpha_{box} = 0.5, alpha_{landmark} = 0.5);在O-Net中,规定(alpha_{det} = 1, alpha_{box} = 0.5, alpha_{landmark} = 1)来获得更为准确的人脸关键点位置。(eta_i^j)是样本类型指示器,用于指示样本的类型。j有三个取值:det、box和landmrks,(eta_i^j)有0和1两个取值。最后使用梯度下降法来训练模型。
-
在线难样本挖掘(Online Hard sample mining):与传统的在原始分类器训练后进行难样本挖掘不同,MTCNN在人脸/非人脸分类任务中进行在线难样本挖掘,这与训练过程相适应。特别是,在每一个小批量中,从所有样本中对前向传播计算的损耗进行排序,并选择其中前70%作为难样本。然后只计算这些难样本在反向传播中的梯度。这意味着忽略了那些在训练中对增强探测器帮助不大的简单样本。实验表明,该策略在不需要人工选择样本的情况下取得了较好的性能。
二、MTCNN的训练数据
因为人脸检测和人脸对齐是结合在一起的,所以在训练过程中将数据标注为了四类:
- 负样本(Negatives):指那些和任何真实人脸样本(ground-truth faces)相比,并交比(也称雅卡尔指数,Intersection-over-Union, IoU)小于0.3的区域
- 正样本(Positives):和一个真实人脸样本(a ground-truth face)的IoU大于0.65的区域
- 部分人脸样本(Part faces):和一个真实人脸样本(a ground-truth face)的IoU在0.4和0.65之间的区域
- 关键点人脸样本(Landmark faces):包含了五个人脸关键点的样本
注意:在部分人脸样本和负样本之间的IoU值不存在明显的差距,并且不同的人脸标注之间也存在差异。因此,选择IoU值相差在0.3-0.4之间的样本作为训练数据。其中,正样本和负样本作为人脸分类的训练数据,正样本和部分人脸样本作为边界框回归的训练数据,关键点人脸样本作为面部关键点定位的训练数据。并且负样本:正样本:部分人脸样本:关键点人脸样本=3:1:1:2。
每个网络的训练数据集描述如下:
- P-Net:从WIDER FACE中随机裁剪了几个窗口来收集正、负、部分脸样本。之后,从CelabA中截取面部作为关键点样本。
- R-Net:使用框架第一部分检测来自WIDER FACE的人脸来收集pos,neg,part样本,同时检测来自CelebA的关键点样本。
- O-Net:与R-Net的数据收集类似,但是这次使用框架的前两个部分来检测脸部和收集数据。
三、一些小细节
1.图像金字塔(image pyramid)
-
为什么需要图像金字塔?
由于原始图像中,存在大小不同的脸,为了在统一尺度下检测人脸,进入网络训练之前,就要将原始图片缩放至不同尺度。以增强网络对不同尺寸大小人脸的鲁棒性。
-
如何得到图像金字塔?
缩放因子:resize_factor,每次图像缩放的比例。第一次缩放得到就是原图( imes resize\_factor),第二次就是原图( imes resize\_factor^2), ... ,依次类推。(这个具体根据数据集人脸大小分布来确定,基本确定在0.60-0.80之间会比较合适,设的比较大,容易延长推理时间,小了容易漏掉一些中小型人脸。论文中设置的是0.6)
图片的最小尺寸: min_face_size,每次经过缩放后得到的图片应该大于min_face_size,并且最后一次缩放得到的图片大小应该恰好大于等于min_face_size。
经过缩放后的得到的这些不同大小的图片,堆叠起来的话像是金字塔,简单称为图片金字塔。注意,这些图像都是要一幅幅输入到Pnet中去得到候选的。
-
mtcnn算法的训练和推理阶段,都要使用图像金字塔吗?
对多个尺度的输入图像做训练,训练是非常耗时的。因此通常只在推理阶段使用图像金字塔,提高算法的精度。训练的时候,需要对训练集中的每个样本缩放到(12 imes 12)的大小,用来训练全卷积网络。在推理的时候,因为测试图像中人脸区域的尺度未知,所以需要使用图像金字塔技术,增加人脸区域的召回率。
2.人脸分类(face classification)
为什么输出是(1 imes1 imes2)的向量,如果是指示被判定为人脸为1的概率,最后一个维度应该是1啊?
之所以有两个值(0和1的概率),是为了方便计算交叉熵。
3.样本类型指示器(sample type indicator)
(eta)表示样本类型,其取值只有0和1。具体的取值,和对应的数据用于哪一个任务的训练有关。例如负样本韩剧只用于人脸分类的训练,所以只有(eta_{det} = 1),其余均为0。
- 当样本为负样本数据时, (eta^{det} = 1, eta^{box} = 0, eta^{landmark} = 0) ;
- 当样本为正样本数据时, (eta^{det} = 1, eta^{box} = 1, eta^{landmark} = 0) ;
- 当样本为部分人脸数据时, (eta^{det} = 0, eta^{box} = 1, eta^{landmark} = 0) ;
- 当样本为关键点样本数据时, (eta^{det} = 0, eta^{box} = 0, eta^{landmark} = 1);
4.训练数据(training data)
P-Net使用的是(12 imes 12)大小的图片,这个图片怎么得到的呢?嗯,很简单,去WIDER和CelebA数据集随机截取,这个时候大家会问,随机截取怎么截取?就是字面上的意思,不过有点点技巧。首先,如果真的随机截取的话,如果图片里面人脸只有一个,很多都会截取到非pos甚至非part的图片,所以为了得到足够多的positives、part faces数据,真正的随机截取是基于图片实际label进行上下左右微调来截取,进而保障positivies、part faces数据的足够。最终会得到很多还没有resize的图片,长宽不一,这个时候把他们resize为(12 imes 12)大小的图片即可。
5.非极大值抑制(non-maximum suppression)
NMS 主要是用于对多个候选框去除重合率大的冗余候选框,从而保留区域内最优候选框,其过程是一个迭代遍历的过程。
算法步骤如下图所示:
cls score表示face classification的得分,b box是指bounding box。
6.并交比(Intersection over Union, IoU)
论文中指bounding box和 groud truth 的并交比,计算方式:可以将这两个看作两个集合,交运算的面积/并运算的面积。
7.为什么是三个阶段(three stages)
P-Net 、R-Net、O-Net ,图像的输入越来越大,每一层卷积核的个数越来越多,网络的深度也是越来越深。所以他们的运行速度也是越来越慢,然而其准确度却是越来越高。
那既然O-Net的准确度最高,为什么不直接过O-Net呢?或者是比O-Net更深的网络呢?
这是因为,假如直接过O-Net网络,运行速度会非常的慢,实际上P-Net和R-Net 这两步对含人脸检测Proposal 和bounding box 做了一个过滤,使得最后过耗时更大的O-Net网络 的bounding box 比较少,从而减少了整体时间。