人脸识别学习笔记三:强化篇

一、MTCNN原理
1.MTCNN的推理流程

MTCNN包括三个阶段:在第一阶段,通过一个浅层的CNN网络来快速生成检测窗口作为第二阶段的输入。第二额极端,通过一个更复杂的CNN网络来剔除大量非面部窗口,以达到细化候选窗口的目的。第三阶段,使用一个更强大的CNN网络来再次细化结果,并输出5个人脸关键点的位置。这三个阶段分别对应三个网络:P-Net、R-Net和O-Net。

MTCNN的总体流程

注意:第一阶段的输入并不是原始图像,而是将图片调整到不同比例之后,得到一个图像金字塔,将其作为输入。

  • 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作为卷积层和全连接层(输出层除外)之后的非线性激活函数。

MTCNN的网络结构

3.训练模型

MTCNN人脸检测器的训练分为三个任务(task):面部/非面部分类(face/non-face classification)、边界框回归(bounding box regression)和面部关键点定位(facial landmark localization)。

  1. 人脸分类:这是一个二分类问题。对于每个样本\(x_i\),使用交叉熵损失:

    \[L_i^{det} = - (y_i^{det} log(p_i) + (1 - y_i^{det})(1-log(p_i))) \tag{1} \]

    其中\(p_i\)是样本\(x_i\)被网络判定为人脸的概率,\(y_i^{det}\)是样本\(x_i\)的标签,只有0和1这两个取值。

  2. 边界框回归:对于每个候选窗口,预测它与最近的样本真实值(ground truth,在有监督学习中,Ground Truth通常指代样本集中的标签)之间的偏移量(即边界框的左边、顶部、高度和宽度)。这是一个回归问题。对于每个样本\(x_i\),使用欧式距离来度量损失:

    \[L_i^{box} = ||\hat{y}_i^{box} - y_i^{box} ||_2^2 \tag{2} \]

    其中,\(\hat{y}_i^{box}\)是网络预测的回归结果,\(y_i^{box}\)是样本真实值的坐标(包含四个维度:左边、顶部、高度和宽度,因此是一个四维向量)。

  3. 面部关键点定位:这也是一个回归问题。对于每个样本\(x_i\),使用欧式距离来度量损失:

    \[L_i^{lan dmark} = ||\hat{y}_i^{landmark} - y_i^{landmark} ||_2^2 \tag{3} \]

    其中,\(\hat{y}_i^{landmark}\)是网络预测的回归结果,\(y_i^{landmark}\)是第i个样本的真实值的坐标(包含五个关键点:是左眼,右眼,鼻子,左嘴角和右嘴角,因此是一个十维向量)。

  4. 多源训练(Multi-source trainning):由于我们在每个CNN中使用不同的任务,所以在学习过程中有不同类型的训练图像,如人脸、非人脸和部分对齐的人脸。在这种情况下,一些损失函数(即等式1-3)不会被用到。例如,对于背景区域的样本,我们只计算\(L_i^{det}\),其他两个损失设为0。这可以直接用样本类型指示器来实现。然后总体学习目标可以表述为:

    \[min \Sigma_{i=1}^N \Sigma_{j \in \{det, box, landmarks\}} \alpha_j \beta_i^j L_i^j \tag{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\)来获得更为准确的人脸关键点位置。\(\beta_i^j\)是样本类型指示器,用于指示样本的类型。j有三个取值:det、box和landmrks,\(\beta_i^j\)有0和1两个取值。最后使用梯度下降法来训练模型。

  5. 在线难样本挖掘(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。

每个网络的训练数据集描述如下:

  1. P-Net:从WIDER FACE中随机裁剪了几个窗口来收集正、负、部分脸样本。之后,从CelabA中截取面部作为关键点样本。
  2. R-Net:使用框架第一部分检测来自WIDER FACE的人脸来收集pos,neg,part样本,同时检测来自CelebA的关键点样本。
  3. O-Net:与R-Net的数据收集类似,但是这次使用框架的前两个部分来检测脸部和收集数据。
三、一些小细节
1.图像金字塔(image pyramid)
  1. 为什么需要图像金字塔?

    由于原始图像中,存在大小不同的脸,为了在统一尺度下检测人脸,进入网络训练之前,就要将原始图片缩放至不同尺度。以增强网络对不同尺寸大小人脸的鲁棒性。

  2. 如何得到图像金字塔?

    缩放因子:resize_factor,每次图像缩放的比例。第一次缩放得到就是原图\(\times resize\_factor\),第二次就是原图\(\times resize\_factor^2\), ... ,依次类推。(这个具体根据数据集人脸大小分布来确定,基本确定在0.60-0.80之间会比较合适,设的比较大,容易延长推理时间,小了容易漏掉一些中小型人脸。论文中设置的是0.6)

    图片的最小尺寸: min_face_size,每次经过缩放后得到的图片应该大于min_face_size,并且最后一次缩放得到的图片大小应该恰好大于等于min_face_size。

    经过缩放后的得到的这些不同大小的图片,堆叠起来的话像是金字塔,简单称为图片金字塔。注意,这些图像都是要一幅幅输入到Pnet中去得到候选的。

  3. mtcnn算法的训练和推理阶段,都要使用图像金字塔吗?

    对多个尺度的输入图像做训练,训练是非常耗时的。因此通常只在推理阶段使用图像金字塔,提高算法的精度。训练的时候,需要对训练集中的每个样本缩放到\(12\times 12\)的大小,用来训练全卷积网络。在推理的时候,因为测试图像中人脸区域的尺度未知,所以需要使用图像金字塔技术,增加人脸区域的召回率。

2.人脸分类(face classification)

为什么输出是\(1\times1\times2\)的向量,如果是指示被判定为人脸为1的概率,最后一个维度应该是1啊?

之所以有两个值(0和1的概率),是为了方便计算交叉熵。

3.样本类型指示器(sample type indicator)

\(\beta\)表示样本类型,其取值只有0和1。具体的取值,和对应的数据用于哪一个任务的训练有关。例如负样本韩剧只用于人脸分类的训练,所以只有\(\beta_{det} = 1\),其余均为0。

  • 当样本为负样本数据时, \(\beta^{det} = 1, \beta^{box} = 0, \beta^{landmark} = 0\) ;
  • 当样本为正样本数据时, \(\beta^{det} = 1, \beta^{box} = 1, \beta^{landmark} = 0\)
  • 当样本为部分人脸数据时, \(\beta^{det} = 0, \beta^{box} = 1, \beta^{landmark} = 0\) ;
  • 当样本为关键点样本数据时, \(\beta^{det} = 0, \beta^{box} = 0, \beta^{landmark} = 1\);
4.训练数据(training data)

P-Net使用的是\(12\times 12\)大小的图片,这个图片怎么得到的呢?嗯,很简单,去WIDER和CelebA数据集随机截取,这个时候大家会问,随机截取怎么截取?就是字面上的意思,不过有点点技巧。首先,如果真的随机截取的话,如果图片里面人脸只有一个,很多都会截取到非pos甚至非part的图片,所以为了得到足够多的positives、part faces数据,真正的随机截取是基于图片实际label进行上下左右微调来截取,进而保障positivies、part faces数据的足够。最终会得到很多还没有resize的图片,长宽不一,这个时候把他们resize为\(12\times 12\)大小的图片即可。

5.非极大值抑制(non-maximum suppression)

NMS 主要是用于对多个候选框去除重合率大的冗余候选框,从而保留区域内最优候选框,其过程是一个迭代遍历的过程。

NMS演示

算法步骤如下图所示:

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 比较少,从而减少了整体时间。

posted @ 2020-07-15 20:29  李一二  阅读(52)  评论(0编辑  收藏