人脸检测之Faceboxes
1. 简介
FaceBoxes是一个足够轻量的人脸检测器,由中国科学院自动化研究所和中国科学院大学的研究者提出,旨在实现CPU下的实时人脸检测,FaceBoxes论文是《FaceBoxes: A CPU Real-time Face Detector with High Accuracy》。里面有一些思路值得大家学习,比如如何对模型进行加速处理,以及多尺度检测时检测框的密度不一致的问题~~
提到快速的人脸检测网络,MTCNN是一个绕不过去的坎。但是作者罗列了级联人脸检测器的几大不足:
- 检测速度会受到人脸数量的影响;
- 多阶段训练,过程复杂;
- VGA上速度也就那样(16fps),也不是很高呀。
针对这些问题,FaceBoxes提出以下几个创新点:
- 使用RDCL模块快速降低特征图大小,为检测速度提供了保证
- MSCL模块使用多尺度特征图预测,解决了多尺度的问题
- 使用anchor稠密化策略提高小脸的召回率
2. 网络结构
可以看出,这个网络与SSD网络有很多相似的地方,但是对SSD算法有了很多的改进,使其更加适应于人脸的检测!由于目标任务的改变,是人脸,也就是相对于整张图片一般为小目标,且大多数为等比例的目标,所以与通用的SSD来说,我们的anchor设置比例为1:1,且只从三个层的范围检测,预知人脸的尺度比例变化不大~
本节介绍了使facebox在CPU设备上准确和高效的三个贡献:快速消化卷积层(RDCL)、多尺度卷积层(MSCL)和anchor加密策略。最后,我们介绍了相关的训练方法。
2.1 快速消化卷积层-RDCL:Rapidly Digested Convolutional Layers
大多数基于CNN的人脸检测方法通常都受到时间开销的限制,尤其是在CPU设备上。更准确地说,当输入、卷积核和输出的大小都很大时,CPU的卷积运算是非常耗时的。我们RDCL的设计是通过适当的卷积核大小来快速缩小输入空间大小,减少输出通道的数量,使CPU设备上的facebox达到实时速度,具体如下:
- 缩小输入空间大小:快速缩小
输入的空间大小,我们的RDCL为它的卷积和池化层设置了一系列大的步长。如图1所示,Conv1、Pool1、Conv2和Pool2的步长分别为4、2、2和2。RDCL的总步长为32,这意味着输入空间的大小减少了32倍。 - 选择合适的卷积核大小:卷积核的大小
一个网络的前几层应该是小的,以加快速度,同时也应该足够大,以减轻空间尺寸减小带来的信息损失。如图1所示,为了保持效率和效率,我们对Conv1、Conv2和所有池层分别选择了$77$、$55$和$3*3$个内核大小。 - 减少输出通道数量:
我们利用C.ReLU激活函数,减少输出通道的数量。C.ReLU可以通过在应用ReLU之前将负输出连接起来,将输出通道的数量增加一倍。使用C.ReLU显著提高了速度,而精度的下降可以忽略不计。
2.2 多尺度卷积层-MSCL:Multiple Scale Convolutional Layers
该方法以RPN为基础,在多目标检测的场景中,RPN作为一种不确定类的检测器。对于单类检测任务(如人脸检测),RPN自然是唯一相关类的检测器。然而,作为一种独立的人脸检测器,RPN无法获得具有竞争力的性能。我们认为,这种令人不满意的表现来自两个方面。首先,RPN中的anchor只与最后一个卷积层相关,该卷积层的特征和分辨率都太弱,无法处理各种大小的人脸。其次,anchor相关层负责检测一定尺度范围内的人脸,但它只有一个单一的感受野,无法匹配不同尺度的人脸。为了解决以上两个问题,我们的MSCL按照以下两个维度进行设计:
-
沿网络深度维度进行多尺度设计。
如上图所示,我们设计的MSCL由多个层组成。这些层的尺寸逐渐减小,形成多尺度特征图。这些层是一种沿网络深度维度的多尺度设计,将anchor离散在多个分辨率不同的层上,自然处理不同大小的尺度。
-
沿网络宽度尺寸进行多尺度设计。
为了学习不同尺度人脸的视觉模式,anchor相关层的输出特征应该对应不同大小的感受野,这可以通过Inception模块[34]轻松实现。Inception模块由多个不同卷积核的卷积分支组成。这些分支作为网络宽度维度上的多尺度设计,能够丰富感受野。如上图所示,MSCL的前三层基于Inception模块。下图说明了我们的Inception实现,这是一个性价比高的模块,可以捕捉不同尺度的人脸。
2.3 Anchor稠密化
类似于SSD算法,我们在不同的feature map上设置anchor box用于检测目标物体,但是对于目标拥挤的情况,我们就会发现,在网络底层设置的小anchor显然非常的稀疏!!!所以我们要对那些底层的小anchor进行一个稠密化的工作,具体就是在每个感受野的中心,也就是SSD中的anchor中心,对其进行偏移。根据其密度大小进行2 、3或4倍的稠密化工作!
anchor密度:
$A_{scale}$表示anchor的尺度,而 $A_{interval}$ 表示anchor的间隔,默认为32、32、32、64、128. 所以5中anchor的密度分别为1,2,4,4,4,显然出现了密度不均衡的情况,所以我们要对32x32的anchor进行四倍的稠密化,对64x64的anchor进行二倍的稠密化~
3. 网络训练
3.1 数据增强
每一幅训练图像都采用以下数据增强策略进行顺序处理:
- 颜色蒸馏:应用一些光度蒸馏。
- 随机裁剪: 我们从原始图像中随机裁剪五个方形补丁:一个是最大的方形补丁,其他的大小介于原始图像的短边尺寸的[0.3,1]之间。 然后我们随意选择一个补丁用于后续操作。
- 尺度变换:随机裁剪后,将选中的正方形patch调整为1024*1024。
- 水平翻转:调整大小后的图像水平翻转的概率为0:5。
- 人脸框过滤:如果人脸框的中心在上述处理过的图像中,我们保留重叠的部分,然后过滤掉这些高度或宽度小于20像素的人脸框。
- 匹配策略:在训练中,我们需要确定哪些anchor对应于一个人脸边界框。我们首先将每个人脸匹配到具有最佳jaccard重叠的锚点,然后将锚点匹配到具有高于阈值(即0.35)。
- 损失函数:我们的损失函数与faster R-CNN中的RPN相同。采用2类softmax损失进行分类,smoothL1损失进行回归。
3.2 困难负样本挖掘
在anchor匹配后,大多数anchor都是负样本,导致正样本和负样本严重不均衡。为了更快更稳定的训练,将他们按照loss值排序并选取最高的几个,保证正样本和负样本的比例最高不超过3:1.
3.3 其他实现细节
使用“xavier”方法随机初始化所有参数。我们以0:9的动量,0.0005的重量衰减和32的batch size对模型进行fine tune。迭代的最大数量是120 k,我们使用$10^{-3}$学习速率的80 k迭代,然后继续分别训练了20 k迭代学习率为$10{-4}$和$10$。
4. 测试
4.1 运行时间效率
基于CNN的方法一直因其运行时效率而受到指责。虽然现有的CNN人脸检测器可以通过高端gpu加速,但在大多数实际应用中,尤其是基于CPU的应用中,速度不够快。如下所述,Facebox足够高效,可以满足实际需求。
在推理过程中,我们的方法输出大量的框(如一个vga分辨率图像的8525个框))。在应用NMS之前,首先以0:05的置信度阈值过滤掉大多数框并保留前400个框,然后执行jaccard重叠为0.3的NMS并保留前200个框。使用Titan X (Pascal)和cuDNN v5.1以及Intel Xeon E5-2660v3@2:60GHz来测量速度。如下表所示,与最近基于cnn的方法相比,Facebox可以在CPU上以每秒20帧的速度运行,具有最先进的精度。
4.2 模型分析
为了更好地理解facebox,我们一个接一个地去除每个组件,以检查每个提出的组件如何影响最终性能。
- 实验一:去掉anchor稠密化策略
- 实验二:使用三个卷积层来代替MSCL,也就是使用单一的感受野
- 实验三:在RDCL中,使用ReLU来代替CReLU
实验结论如下: - Anchor加密策略至关重要: anchor加密策略用于增加小anchor的密度(即3232和6464),以提高小人脸的召回率。 从上表中,我们可以看到在消除anchor加密策略后,FDDB上的mAP从96.0%降低到94.9%。 急剧下降(即1.1%)证明了所提出的anchor加密策略的有效性。
- MSCL更好: 表2中第二列和第三列之间的比较表明MSCL有效地将mAP增加1.0%,这取决于不同的感受域和多尺度anchor平铺机制。
- RDCL是高效且准确的保留: RDCL的设计使FaceBoxes能够在CPU上实现实时速度。 如上表中所述,RDCL导致精度略微下降,但速度显着提高。 具体而言,FDDB mAP以大约19.3ms的速度改进而降低0.1%。