虽然人脸的结构是确定的,由眉毛、眼睛、鼻子和嘴等部位组成,近似是一个刚体,但由于姿态和表情的变化,不同人的外观差异,光照,遮挡的影响,准确的检测处于各种条件下的人脸是一件相对困难的事情。
人脸可能出现在图像中的任何一个位置人脸可能有不同的大小
人脸在图像中可能有不同的视角和姿态
人脸可能部分被遮挡
评价一个人脸检测算法好坏的指标是检测率和误报率。我们将检测率定义为:
算法要在检测率和误报率之间做平衡,理想的情况是有高检测率,低误报率。
由于一个人脸附件可能会检测出多个候选位置框,还需要将检测结果进行合并去重,这称为非极大值抑制(NMS)。多尺度滑动窗口技术的原理如下图所示:
以512x512大小的图像为例,假设分类器窗口为24x24,滑动窗口的步长为1,则总共需要扫描的窗口数为:
即要检测一张图片需要扫描大于120万个窗口!!!计算量惊人,因此有必要采取某种措施提高效率,具体解决方案本文会给出。
我们将整个人脸检测算法分为3个阶段,分别是早期算法,AdaBoost框架,以及深度学习时代,在接下来将分这几部分进行介绍。
Rowley的方法有不错的精度,由于分类器的设计相对复杂而且采用的是密集滑动窗口进行采样分类导致其速度太慢。
用级联AdaBoost分类器进行目标检测的思想是:用多个AdaBoost分类器合作完成对候选框的分类,这些分类器组成一个流水线,对滑动窗口中的候选框图像进行判定,确定它是人脸还是非人脸。
这种特征捕捉图像的边缘、变化等信息,各种特征描述在各个方向上的图像变化信息。人脸的五官有各自的亮度信息,很符合Haar-like特征的特点。
在上图中,要计算黑色矩形框内的像素值之和。假设上面四个矩形的右下角的坐标分别为
弱分类器采用最简单的深度很小的决策树,甚至只有一个内部节点。决策树的训练算法此处不做详细的阐述,需要注意的是这里的特征向量是稀疏的,即每一棵决策树只接受少量特征分量的输入,根据它们来做决策。
强分类器和前面讲述的是一样的,不同的是这里的强分类器加上了一个调节阈值:
其中为阈值,它通过训练得到。每一级强分类器在训练时使用所有的人脸样本作为正样本,并用上一级强分类器对负样本图像进行扫描,把找到的虚警中被判定为人脸的区域截取出来作为下一级强分类器的负样本。
假设第i级强分类器的检测率和误报率分别为,由于要通过了所有强分类器才被判定为正样本,因此级联分类器的误报率为:上式表明增加分类器的级数可以降低误报率,类似的级联分类器的检测率为:
这个式子表明增加分类器的级数会降低检测率。对于前者,可以理解为一个负样本被每一级分类器都判定为正样本的概率;对于后者,可以理解为一个正样本被所有分类器都判定为正样本的概率。
在VJ算法问世之后,较好的解决了近似正面人脸的检测问题。此后出现了大量改进方案,在深度学习技术出现之前,一直是人脸检测算法的主流框架。这些方案的改进主要在以下几个方面:
新的特征,包括扩展的Haar特征[4],ACF特征[15]等,它们比标准的Haar-like特征有更强的描述能力,同时计算成本也很低。
在深度学习出现以前工业界的方案都是基于VJ算法。但VJ算法仍存在一些问题:
1. Haar-like特征是一种相对简单的特征,其稳定性较低;
2. 弱分类器采用简单的决策树,容易过拟合。因此,该算法对于解决正面的 人脸效果好,对于人脸的遮挡,姿态,表情等特殊且复杂的情况,处理效果不理想(虽然有了一些改进方案,但还是不够彻底!!)。
3. 基于VJ-cascade的分类器设计,进入下一个stage后,之前的信息都丢弃了,分类器评价一个样本不会基于它在之前stage的表现----这样的分类器鲁棒性差。
相较于VJ-cascade的设计,Soft-Cascade采用几个改进的方案:
1. 每个stage的决策函数不是二值而是标量值(scalar-valued) ,且与该样本有多"容易"通过这个stage以及在这个stage的相对重要性成比例。
2. 生成的决策函数是需要通过之前每个阶段的值而不单单是本阶段来判定。
3. 文中把检测器的运行时间-准确率权衡通过一个叫ROC surface的3维曲面清楚的展示出来,方便调节参数,可以明确的知道动了哪个参数会对这个检测器的性能会有些什么影响。
DPM模型一个大的问题是速度太慢,因此在工程中很少使用,一般采用的是AdaBoost框架的算法。
基于深度学习的方法在FDDB上基本饱和了,是时候抛出一个新的benchmark了!!!
Cascade CNN12x12,24x24,48x48尺寸作为输入的分类CNN网络结构,其中输出为2类-人脸和非人脸。
12x12,24x24,48x48尺寸作为输入的矫正(calibration)CNN网络结构。其中输出为45中种矫正模式的类别。
文中影响区域位置和大小的因素有三种:尺度、X方向偏移、Y方向偏移。总共构成了5x3x3=45种模式。
上一级检测网络输出的人脸位置(x,y,w,h)通过以下公式进行校正:
1. 对待检测图像进行缩放,将各种尺度的图像送入卷积网络中处理,以检测不同大小的目标。
2. 经过多次卷积和池化操作之后,对特征图像进行上采样然后再进行卷积,得到最终的输出图像,这张图像包含了每个位置出现目标的概率,以及目标的位置、大小信息。
第一个分量是候选框是一个目标的置信度,后面4项分别为本像素的位置与矩形框左上角、右下角的距离。每个像素都转化成一个矩形框和置信度值,然后对置信度值大于指定阈值的矩形框进行非最大抑制,得到最终检测结果。
总损失函数为这两部分加权求和。训练时样本标注方案如下:对于任何一个位置,如果它和真实目标矩形框的重叠比大于指定阈值,则标注为1,否则标注为0;对位置的标注根据每个像素与目标矩形框4条边的距离计算。
Faceness-Net第1阶段:生成partness map,由局部推理出人脸候选区域。
第2阶段:Refining the face hypotheses。
上一阶段proposal生成的候选框已经有较高的召回率,通过训练一个人脸分类和边界回归的CNN可以进一步提升其效果。
MTCNN除了增加人脸5个关键点的回归任务,另外在calibration阶段采用了直接回归真实位置坐标的偏移量的思路替代了Cascade CNN中的固定模式分类方式,整个思路更为合理。
MTCNN的整体设计思路很好,将人脸检测和人脸对齐集成到了一个框架中实现,另外整体的复杂度得到了很好的控制,可以在中端手机上跑20~30FPS。该方法目前在很多工业级场景中得到了应用。
先抛出一张据说是目前世界上人数最多的合照吓吓大家。一眼望过去能估计下有多少人吗?因为本文对小目标人脸检测有很多独到的理解,我们下面会多花点笔墨去分析!
HR针对小目标人脸检测,作者主要从三个方面做了研究:尺度不变,图像分辨率和上下文,作者的算法在FDDB和WIDERFace取得了当时最好的效果。
问题1:Multi-task modeling of scales
问题2:How to generalize pre-trained networks?
虽然许多应用于“多分辨率”的识别系统都是处理一个图像金字塔,但我们发现在插值金字塔的最底层对于检测小目标尤为重要。
因此,作者的最终方法是:通过尺度不变方式,来处理图像金字塔以捕获大规模变化,并采用特定尺度混合检测器,如下图:
(e)定义了从深度模型的多个层中提取的特征模板,也就是foveal descriptors
问题3:How best to encode context?
作者证明从多个层中提取的卷积深度特征(也称为 “hypercolumn” features)是有效的“ foveal”描述符,其能捕获大感受野上的高分辨率细节和粗略的低分辨率线索。
Face R-CNN[22]该方法基于Faster R-CNN框架做人脸检测,针对人脸检测的特殊性做了优化。
对于最后的二分类,在softmax的基础上增加了center loss。通过加入center loss使得类内的特征差异更小(起到聚类的作用),提高正负样本在特征空间的异性从而提升分类器的性能。
加入在线困难样本挖掘(OHEM),每次从正负样本中各选出loss最大的N个样本加入下次训练,提高对困难样本的的分类能力。
多尺度训练,为了适应不同尺度影响(或者更好地检测小目标),训练阶段图片会经过不同尺度缩放。
SSHPyramidBox
这张图又出现了!!!这一次是百度的“PyramidBox”[24]跑出来的结果。880个人脸!!!
PyramidBox从论文看主要是已有技术的组合应用,但是作者对不同技术有自己很好的理解,所以能组合的很有效,把性能刷的非常高。
针对之前方法对上下文信息的利用不够充分的问题,作者提出了自己的优化方案:
第四点:文中提出了尺度敏感的Data-anchor-采样策略,改变训练样本的分布,重点关注了较小的人脸。