论文地址 https://arxiv.org/pdf/1708.05234.pdf
开源代码 https://github.com/sfzhang15/FaceBoxes (若失效直接复制链接打开)
摘要
虽然在人脸检测方面已经取得了巨大进展,但有效的人脸检测模型往往在计算上难以实现,因此在CPU上达到实时速度并且保持高性能仍是一个开放性挑战之一。为了解决这个挑战,我们提出了一种新颖的人脸检测器,取名为FaceBoxes,其在速度和精度上都具有优异的性能。具体地说,我们的方法有一个轻量级但功能强大的网络结构,由快速消化卷积层(RDCL)和多尺度卷积层(MSCL)组成。RDCL的设计是能够使FaceBoxes在CPU上到达实时速度。MSCL目的在于丰富感受野和不同特征层上的离散anchor,以此处理多尺度的人脸。此外,我们还提出了一种新的anchor致密化策略,使不同类型的anchor在图像上具有相同的密度,从而显著提高了小人脸的召回率。因此,这个被提出的检测器在VGA分辨率图像中使用单个CPU内核能达到20 fps的运行速度,使用GPU能达到125 fps的运行速度。此外,FaceBoxes的速度不会随人脸数量而改变。我们综合评估了这种方法,并在AFW、PASCAL face 和FDDB这几个人脸检测基准数据集上达到了目前最先进的检测性能。
1、介绍
人脸检测是计算机视觉和模式识别的基本问题之一。它扮演了一个重要的角色在许多随后与人脸相关的应用领域,如人脸对齐[47]、人脸识别[48]和人脸追踪[12]。随着近几十年来取得的巨大进展,尤其是卷积神经网络的突破,人脸检测在各种场景下的日常生活中得到了成功的应用。
然而,面对无法控制的人脸检测问题,特别是对于CPU,仍然存在一些棘手的挑战。对人脸检测器来说这些挑战主要来自于两个要求:1)在杂乱的背景中,人脸的视觉性变化较大,要求人脸检测器能够准确地处理复杂人脸和非人脸分类问题;2)可能的人脸位置和人脸尺寸的较大搜索空间进一步增加了时间效率要求。这两个要求是矛盾的,因为高精度的人脸检测器往往需要昂贵的计算资源。因此,在CPU上达到实时速度和保持高性能是实际人脸检测中仍是尚待解决的问题之一。
为了满足这两个相互矛盾的要求,人脸检测主要从两种方法进行了深入的研究。早期的方法是基于手工设置的特征。在Viola-Jones人脸检测器[37]的开创性工作之后,早期的大部分工作都聚焦在设计鲁棒性的特征和训练有效的分类器上。除级联结构以外,还将变形的组件模型(DPM)引入人脸检测任务中,并取得了显著的性能表现。然而,这些方法在很大程度上依赖于非鲁棒的手工特征,并分别对每个部分进行单独优化,使得人脸检测方法欠佳。简言之,这些方法在CPU上是有效的,但在面对巨大视觉变化的人脸时不够精确。
另一种方法是基于卷积神经网络(CNN),近年来从图像分类到目标检测领域都取得了显著的成就。最近,CNN在传统的人脸检测框架中作为特征提取器被成功的引入人脸检测任务[23,41,42]。此外,一些人脸检测器[4,46]继承了通用目标检测方法的有效技术,如Faster R-CNN[29]。这些基于CNN的人脸检测方法对有大表情变化的人脸具有很强的鲁棒性,并表现出最先进的性能。但它们太耗时,无法获得实时速度,特别是在CPU上。
这两种方法有各自的优点。前者速度快,而后者精度高。为了在速度和精度上都表现出色,一个自然的想法是将这两种方法的优势结合起来。因此提出了基于级联CNN的方法[16,45]将CNN学习到的特性放入级联框架中,以提高性能和保持效率。然而,基于CNN的级联方法存在三个问题:1)它们的速度与图像上的人脸数量呈负相关。随着人脸数量的增加,速度会急剧下降;2)基于级联的检测器分别对各个部分进行单独优化,使得训练过程极为复杂,最终模型欠佳;3)对于VGA分辨率的图像,其在CPU上的运行效率约为14fps,速度不足以达到实时速度。
本文以Faster R-CNN[29]中的RPN和SSD[21]中的多尺度机制为灵感,开发了一种在CPU上具有实时速度的最先进的人脸检测器。具体地说,我们提出了一种新颖的人脸检测器FaceBoxes,它只包含一个全卷积的神经网络,可以被端到端的训练。所提出的方法具有一个轻量级但功能强大的网络结构(如图1所示),由快速消化卷积层(RDCL)和多尺度卷积层(MSCL)组成。RDCL的设计目的是使FaceBoxes能够在CPU上达到实时速度,而MSCL的目标是丰富感受野和不同特征层上离散化anchor,以处理不同尺度的人脸。此外,我们还提出了一种新的anchor致密策略,使不同类型的anchor在输入图像上具有相同的密度,从而显著提高了小人脸的召回率。所以,对于VGA分辨率图像,我们的人脸检测器在单个CPU内核上以20 fps的速度运行,使用GPU以125 fps的速度运行。更重要的是,FaceBoxes的速度不会随图像上的人脸数量改变而改变。我们对该方法进行了全面评估,在AFW、PASCAL face和FDDB这几个人脸检测基准数据集上表现出最先进的检测性能。
为清楚起见,这项工作的主要贡献可以概括为四个方面:
•我们设计快速消化卷积层(RDCL),使人脸检测在CPU上实现实时速度;
•我们引入了多尺度卷积层(MSCL),通过丰富感受野和特征层上的离散anchor来处理不同尺度的人脸。
•我们提出了一种新的anchor致密策略,以提高小人脸的召回率;
•我们进一步提高了在AFW、PASCAL face和FDDB数据集上的最先进性能表现。论文的其余部分组织如下。第2节回顾相关工作。FaceBoxes的分析见第3节。第4节给出了实验结果,第5节对本文进行了总结。
2、相关工作
现代人脸检测方法大致可分为两类。一个基于手工特征,另一个基于CNN。本节简要回顾了这两种方法。
2.1、基于手工特征的方法
以前的人脸检测系统大多基于手工特征。自从有重大意义的Viola-Jones人脸检测器[37]提出将Haar特征、Adaboost学习和级联推理相结合进行人脸检测,因此许多后续的工作都被提出用于实时人脸检测,如新的局部特征[20,40]、新的增强算法[3,25]和新的级联结构[2,18]。
除了级联框架外,基于结构模型的方法也逐渐获得了较好的性能,并且变得越来越高效。一些研究[38,39,49]将可变形组件模型(DPM)引入人脸检测任务中。这些工作使用被监督的部分,更多的姿势划分,更好的训练或更有效的推理,以实现显著的检测性能。
2.2、基于CNN的方法
CNN首次用于人脸检测可以追溯到1994年。Vaillant等人[36]使用一个受过训练的CNN,以滑动窗口的方式来检测人脸。Rowley等人[30,31]介绍一种用于垂直正面人脸检测的重新连接的神经网络,以及一种用于估计旋转不变人脸检测方向的“路由器”网络。Garcia等人[7]开发了一个神经网络检测半正面脸。Osadchy等人[24]训练CNN同时进行面部检测和姿势估计。这些早期的方法只能在简单的数据集上获得相对良好的性能。
近年来已经见证了基于CNN人脸探测器取得的进步。CCF[41]利用CNN特征的增强功能进行人脸检测。Farfade等人[6]对ImageNet1000分类任务中训练好的CNN模型进行微调后用于人脸和非人脸分类任务。Faceness[42]训练一系列CNN模型用于人脸属性识别,用于检测部分被遮挡的人脸。Cascadecnn[16]开发了一种基于CNN的级联体系结构,具有强大的识别能力和高性能。Qin等人[26]提出联合训练级联神经网络实现了端到端优化。与[5]类似,MTCNN[45]提出了一个基于多任务级联CNN的联合人脸检测和人脸对齐的框架。UnitBox[44]引入了一个新的intersection-over-union(IOU)损失函数。CMS-RCNN[46]在人脸检测中使用Faster RCNN和身体上下文信息。Convnet[19]将CNN与3D人脸模型集成在一个端到端的多任务学习框架中。STN[4]提出了一种新的监督变压器网络和用于人脸检测的ROI卷积。
图1 FaceBoxes结构与关于anchor设计的详细信息表
3、FaceBoxes
本节介绍了使FaceBoxes在CPU上精确和高效的三个贡献:快速消化卷积层(RDCL)、多尺度卷积层(MSCL)和anchor致密策略。最后,我们介绍了相关的训练方法。
3.1、快速消化卷积层
大多数基于CNN的人脸检测方法通常受到时间成本的限制,特别是在CPU上。更准确地说,当输入、卷积核和输出的尺寸较大时,CPU的卷积运算非常耗时。我们的RDCL旨在通过适当的卷积核大小快速缩小输入空间尺寸,同时减少输出的通道数量,从而使FaceBoxes 在CPU上达到实时速度,设计如下:
•缩小输入的空间尺寸:为了快速缩小输入的空间尺寸,我们的RDCL为其卷积层和下采样层设置了一系列较大stride尺寸。如图1所示,Conv1、Pool1、Conv2和Pool2的stride尺寸分别为4、2、2和2。RDCL总的stride大小为32(4x2x2x2),这意味着输入的空间尺寸将快速减少32倍。
•选择合适的卷积核尺寸:一个网络中的前几个层的卷积核尺寸应该很小,以加快卷积速度,同时也应该足够大,以降低空间尺寸减小带来的信息损失。如图1所示,为了保持有效性和高效性,我们分别为Conv1、Conv2和所有Pool层选择7×7、5×5和3×3的卷积核尺寸。
•减少输出通道的数量:我们利用C.ReLU激活函数(如图2(a)所示)减少输出的通道数量。C.ReLU[32]从CNN的观察中得出的动机是:较低层中的卷积核具有对滤波器(pair filters)的作用(即具有相反相位的滤波器)。从这个观察结果来看,C.ReLU可以通过在应用ReLU之前简单地连接取反输出,将输出的通道数量增加一倍。使用C.ReLU可以显著提高速度,而精度下降可以忽略不计。
提示:我们先简单了解一下C.ReLU激活函数的功能:C.ReLU[32]文章中作者观察到在卷积网络中低层的卷积核的参数分布具有更强的正负相关性(类似于正负对立的意思),随着卷积层次的加深,越高层的卷积核参数的这种相关性越来越小;所以作者认为,低层卷积核倾向于同时捕捉正负相位的信息,但是ReLU激活函数把小于0的部分置0,大于0的保持不变,相当于抹掉了负响应,这样会导致卷积核存在冗余,而C.ReLU可以解决这一问题。C.ReLU可表示为CReLU(x)= Concat[ ReLU(x), ReLU(−x) ],虽然保留了正负相位信息,但是同时也使其输出维度加倍。好了,了解C.ReLU的功能以后,我们再来看看上面标红的这句话,总感觉作者表述有点问题,作者的本意应该是想通过使用C.ReLU激活函数来是输出的通道数(channel)减少,虽然输出的维度加倍了,但是这样可以加快一点速度。(加倍的是维度,减少的是通道数)
3.2、多尺度卷积层
该方法基于RPN,RPN是在多类别目标检测场景下,作为一种class-agnostic proposer(可理解为推荐框,感兴趣可以去了解下class-aware detector和class-agnostic detector的区别)而发展起来的。对于单类别检测任务(如人脸检测),RPN自然是唯一相关类别的检测器。然而,作为一种独立的人脸检测器,RPN无法获得具有竞争力的性能。我们认为这种不满意的表现来自两个方面。首先,RPN中的anchor只与最后一个卷积层相关,最后一层的特征和分辨率太弱,无法处理各种尺度的人脸。第二,anchor相关层负责在相应的尺度范围内检测人脸,但它只有一种单一的感受野,不能匹配不同尺度的人脸。为了解决上述两个问题,我们的MSCL是按照以下两个方面设计的:
•沿网络深度方向进行多尺度设计。如图1所示,我们设计的MSCL由几个层组成。这些层的大小逐渐减小,形成多尺度feature map。与[21]类似,我们的默认anchor与多尺度feature map(即Inception3、Conv3_2和Conv4_2)关联。这些层作为沿网络深度方向的多尺度设计,使anchor离散覆盖在不同分辨率的多个层上,以自然地处理各种尺寸的人脸。
•沿网络宽度方向进行多尺度设计。为了学习不同尺度人脸的视觉模式,anchor相关层的输出特征应对应不同尺寸的感受野,这可以通过Inception模块轻松实现[34]。Inception模块由多个具有不同卷积核的卷积分支组成。这些分支作为一种沿网络宽度方向的多尺度设计,能够丰富感受野。如图1所示,MSCL中的前三层是基于Inception模块的。图2(b)说明了我们的Inception结构实现,它是一个成本划算的模块,用于捕获不同尺度的人脸。
图2. (a)C.relu模块,其中Negation仅将−1乘以卷积输出。(b) Inception模块。
图3. anchor致密示例。为了清楚起见,我们只在一个感受野中心(即中心black cell)加密anchor,并且只对对角anchor进行着色。
3.3、Anchor致密策略
如图1所示,我们对默认anchor(即方形anchor)设置1:1的宽高比,因为人脸框近似为方形。Inception3层的anchor尺度为32、64和128像素,conv3_2层和conv4_2层的anchor尺度分别为256和512像素。
图像上anchor的平铺间隔等于对应anchor关联层的stride尺寸。例如,conv3_2的stride尺寸为64像素,其anchor尺寸为256×256,表示输入图像上每64像素就有一个256×256尺寸的anchor。我们将anchor平铺密度(即A_density)定义如下:
(1)
这里,A_scale是anchor尺度,A_interval是anchor平铺间隔。默认anchor平铺间隔分别为32、32、32、64和128。根据方程(1)对应密度为1、2、4、4、4,其中不同尺度anchor之间存在明显的平铺密度不平衡问题。与大anchor(128×128、256×256、512×512)相比,小anchor(32×32、64×64)太稀疏,导致小人脸的召回率低。
为了消除这种不平衡,我们提出了一种新的anchor致密策略。具体来说,为了使一种anchor的密度增加N倍,我们在一个感受野的中心均匀地平铺个anchor,而不是仅在该接收场的中心平铺一个进行预测。一些例子如图3所示。在文章中为了提高小anchor的平铺密度,我们采用了4次加倍的32×32 anchor和2次加倍的64×64 anchor的策略,保证了不同尺度的anchor在图像上具有相同的密度(即图3),从而使不同尺度的人脸可以匹配几乎相同数量的anchor。
3.4、训练
本小节介绍了训练数据集、数据增强、匹配策略、损失函数、难负样本挖掘等其他实现细节。
训练数据集。我们的模型是在包含有12880张图像的WIDER FACE训练子集上训练的。
数据增强。每个训练图像通过以下数据增强策略按顺序处理:
•颜色失真:应用一些类似于[9]的图片度量失真。
•随机裁切:我们从原始图像中随机裁切五个正方形方块:一个是最大的正方形方块,其他方块的大小在原始图像短尺寸的[0.3,1]之间。然后我们任意选择一个方块进行后续操作。
•尺寸转换:随机裁剪后,所选方块的尺寸resize为1024×1024。
•水平翻转:被resize后的图像以0.5的概率进行水平翻转。
•人脸框过滤器:如果人脸框的中心在以上处理的图像中,我们保留其重叠的部分,然后过滤掉高或宽小于20个像素的人脸框。
(注:就是经过前面四种方法处理后的图面里还有一半以上的人脸存在,这样处理后的图为可训练的的有效图像,主要是以人脸中心是否还在为准)
匹配策略。在训练期间,我们需要确定哪些anchor与真实的人脸边界框相对应。我们首先用最佳jaccard(被称为并交比,Intersection over Union,即iou)重叠将每个人脸框与anchor相匹配,然后将anchor与jaccard重叠结果高于阈值(即0.35)的任何人脸框匹配。
损失函数。我们的损失函数与Faster R-CNN中的RPN相同[29]。我们采用Softmaxloss用于2分类和smooth L1 loss用于回归。
难负样本挖掘。在anchor匹配步骤之后,发现大多数anchor是负样本的,这导致了正负样本之间的显著不平衡。为了更快的优化和稳定的训练,我们根据损失值对其进行排序(代码中是按照loss从大到小排序),并选择最前面的一部分值,使负与正的比率至多为3:1。
其他实现细节。所有参数都是用“xavier”方法进行随机初始化的。我们使用momentum=0.9、weight decay=0.0005和batch size=32的SGD对结果模型进行了微调。最大迭代次数为120k,我们在前80k次迭代中使用10-3学习率,然后分别用10-4和10-5学习率继续训练了20k次迭代。我们的方法在caffe上实现。
4、实验
暂略。