这是2016年发的文章。
Abstract
由于不同的姿势,照明,遮挡等原因,在不受控制的环境下人脸检测和对齐是具有挑战性的。
在这篇文章中,提出了一个深度级联的多任务框架,它能够探索人脸检测和人脸对齐的内在关系来提高他们的表现。
特别是,我们的框架利用了经过精心设计的三个阶段的深层卷积网络的级联架构,以粗略的方式预测人脸和地标位置。
(landmark location指的什么?)
Introduction
人脸检测和人脸对齐对许多人脸应用是有意义的,例如人脸识别,面部表情分析。但是,巨大的人脸的变化(遮挡),巨大的姿势的变化,照明这些因素,对在真实世界上应用提出了挑战。
Viola/Jones提出了级联人脸检测子:利用Haar-Like 特征和 AdaBoost。然而,即使在具有更高级的功能和分类器的情况下,这种检测器在具有较大人脸视觉变化的现实应用中也可能会严重退化。
除此之外,提出了 deformable part models (DPM)。
这些方法计算代价昂贵。
利用CNNs来做人脸检测。
From facial parts responses to
face detection: A deep learning approach:训练用于面部属性识别的深度卷积神经网络以获得在面部区域的高响应,从而进一步生成面部的候选窗口。但是其复杂的网络结构,在实际上很耗费时间。
A convolutional neural network cascade for face detection:用级联CNNs来做人脸检测,但是它需要边界框校准(增加了计算代价并且忽略了人脸的坐标定位和边界框回归的内在关系。)
人脸对齐激起了研究兴趣,可以分为两种策略:基于回归的方法,模板拟合方法。
Facial landmark detection by
deep multi-task learning:使用脸部属性识别作为辅助任务,以使用深度卷积神经网络增强脸部对齐性能。
这些人脸检测和人脸对齐的方法都忽略了他们之间的内在关系。
尽管已经有些工作尝试联合解决他们,但是仍然有些限制。
Joint cascade face detection
and alignment:利用像素值差的特征与随机森林共同进行对准和检测。这些手工的特征很大程度上限制了他的表现。
Improving multiview face detection with multi-task deep convolutional neural networks:用多任务CNN来提高多视角人脸检测的准确率,检测召回受到弱脸检测器产生的初始检测窗口的限制。(检测召回???)
在训练中挖掘hard samples对于增强检测器的功能至关重要(这个 hard samples指的是重要性的样本??)
传统的 hard sample 挖掘以离线的方式操作,它能够增加手动操作(??)。(意思是说需要人共来操作吗?增加了人的劳动负担??),所以需要设计一个在线的 hard sample 挖掘。
这篇文章,作者提出了一个新的框架利用统一的级联CNNs通过多任务学习来融合这两个任务。
提出的CNNs包含三个步骤。
- 通过浅层的CNN快速生成候选窗口。
- 通过一个复杂的CNN来拒绝一个没有人脸的窗口从而重新定义窗口。
- 使用功能更强大的CNN再次优化结果,并输出五个面部标志位置。
主要贡献:
- 提出了一个用于人脸检测和对齐的基于级联CNNs的框架,并且为实际表现设计了一个轻量级的CNN架构;
- 提出了一个在线的hard sample 挖掘来提高表现;
- 在人脸检测和人脸对齐任务上都取得了好效果。
Approach
Overall Framework
对于一个图片,先放缩到不同的大小建立一个图片金字塔,这是输入。
- Stage 1:利用一个全卷积网络,叫做提安网络(Proposal Network),简称 P-Net,来获得一个候选人脸窗口和他们的边界框回归向量。然后根据估计的边界框回归向量对候选者进行校准。 之后,我们采用非最大抑制(NMS)合并高度重叠的候选对象;
- Stage 2:所有候选者都被馈送到另一个称为“优化网络(R-Net)”的CNN,该网络进一步拒绝大量错误的候选者,使用边界框回归进行校准,并进行NMS;
- Stage 3:此阶段与第二阶段相似,但在此阶段中,我们旨在通过更多的监督来识别面部区域。 特别是,该网络将输出五个面部标志的位置。
CNN Architectures
已经用在人脸检测上的CNNs有一些缺点:
- 在卷积层的过滤器缺乏多样性限制了他们的判别能力;
- 与别的多任务目标检测和分类任务相比,人类检测是一个具有挑战的二分类任务,需要更少的过滤器的个数。
因此,减少过滤器的个数,并且把 5 x 5 的过滤器改成 3 x 3 的过滤器。
文章的CNN架构如下:
其中 MP 指的是最大池化,卷积和池化的步长分别是1和2。出来输出层以外,在卷积层和全连接层之后使用 PReLU 作为激活函数。
Training
利用三个任务来训练CNN检测子: face/non-face classification,bounding box regression, facial landmark localization。
-
Face classification:
学习的目标类似于二分类问题。对每一个样本,使用交叉熵损失函数:
公式 1
其中,,0代表不是人脸,1代表是人脸 -
Bounding box regression:
我们预测它与最近的ground truth(即边界框的左侧,顶部,高度和宽度)之间的偏移量。
学习的目标是一个回归问题。对每一个样本:
公式2
其中,是从网络中学习的,是ground-truth 候选。共有四个坐标,包括左,上,高和宽。。
(高,宽是指的??)
学到的是不是,图1那个长方形框的最左边竖线的横坐标(左),最上边横线的纵坐标(上),最右边竖线的横坐标(宽),最下边横线的纵坐标(高)
-
Facial landmark localization:
与 bounding box regression 任务相同,facial landmark localization 是一个回归问题,最小化欧式距离:
公式3
其中,是从网络中学出来的,是第个样本的ground-truth。有五个 facial landmarks:左眼,右眼,鼻子,左嘴角,右嘴角;因此:
- Multi-source training
并不是所有任务都会用到上面的所有损失函数。
例如在一个背景区域,只使用,并且另外两个设置为0。
所有的学习目标可以被写做:
其中,是样本总数,表示任务重要性。
在 P-Net 以及 R-Net 中:
在 O-Net 中:
- Online Hard sample mining
在每个 mine-batch 中,我们对所有样本在前向传播中计算出的损失进行排序,然后选择顶部
其中70%为硬样品。只计算这些硬样本的梯度。
参考资料:
Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks
我把测试完的图片也放出来给大家看看吧。
我虽然看懂了这篇文章,也能分别写每个网络的代码,但是不知道怎么去训练这整个网络,
直接用的已经训练好的模型,直接 pip install mtcnn 即可使用。