在小尺寸人脸检测上发力的S3FD

1. 前言

人脸检测领域目前主要的难点集中在小尺寸,模糊人脸,以及遮挡人脸的检测,这篇 ICCV2017 的 S3FD(全称:Single Shot Scale-invariant Face Detector)即是在小尺寸人脸检测上发力。

2. 出发点&贡献

S3FD 这篇论文的出发点是当人脸尺寸比较小的时候,Anchor-Based 的人脸检测算法效果下降明显,因此作者提出了这个不受人脸变化影响的 S3FD 算法。这一算整体上可以看做是基于 SSD 的改进,它的主要贡献可以概括为:

  • 改进检测网络并设置更加合理的 Anchor,改进检测网络主要是增加Stride=4的预测层,Anchor 尺寸的设置参考有效感受野,另外不同预测层的 Anchor 间隔采用等比例设置。
  • 引入尺度补偿的 Anchor 匹配策略增加正样本 Anchor 的数量,从而提高人脸的召回率。
  • 引入max-out background label降低误检。

3. 小尺寸人脸检测效果不好的原因研究

下面的 Figure1 展示了论文对 Anchor-Based 的人脸检测算法在小人脸检测中效果下降明显的原因分析。

Figure1

  • Figure1(a)中展示的是网络结构本身设计的问题。了解过 SSD 的同学知道在网络结构中有多个特征层被用于检测目标,这些特征层中stride最小的是8,这样原图中8\times 8大小的区域在该预测层中就仅有 1 个像素点,这对小人脸的检测是非常不利的,因为有效的特征太少了。同样,对于 Faster-RCNN 来讲,用于检测目标的特征层的stride16,这样用于人脸检测的有效特征范围就更小,这对小脸检测是致命打击。
  • Figure1(b)中展示了 Anchor 的尺寸,感受野和人脸的尺寸不匹配的问题。
  • Figure1(c)中展示了由于一般设置的 Anchor 尺寸都是离散的,例如[16,32,64,128,256,512], 而人脸的尺寸是连续的,因此当人脸的尺寸在设定的 Anchor 值之间时可以用于检测的 Anchor 数量就会很少,如图中的红色圆圈部分所示,这样就会导致人脸检测的召回率低。
  • Figure1(d) 指出为了提高小人脸的检测召回率,很多检测算法都会通过设置较多的小尺寸 Anchor 实现,这样容易导致较多的小尺寸负样本 Anchor,最终导致误检率的增加。这里两张图的分辨率是一样的,左图中的人脸区域较小,因此主要通过浅层特征来进行检测,因此这里 Anchor 尺寸设置较小,而右图中的人脸区域较大,因此主要是通过高层特征进行检测,此时 Anchor 尺寸设置较大。可以看出左图中标签为背景的 Anchor 数量远远多于标签为目标的 Anchor,而在右图中数量比例还是相对较均衡的。

4. S3FD 原理

论文针对第三节的问题进行了分析并提出了解决方案,也就有了这篇 S3FD。

首先针对FIgure1(a),(b)的问题,论文对检测网络的设计以及 Anchor 的铺设做了改进,提出了不受人脸尺寸影响的检测网络,改进的主要内容包括:

  • 预测层的最小stride降低到4(具体而言预测层的stride范围为4128,一共6个预测层),这样就保证了小人脸在浅层进行检测时能够有足够的特征信息。
  • Anchor 的尺寸根据每个预测层的有效感受野和等比例间隔原理进行设置,设置为16512,前者保证了每个预测层的 Anchor 和有效感受野大小匹配,后者保证了不同预测层的 Anchor 再输入图像中的密度基本类似。

下面的 Figure3 展示了 Anchor 尺寸和数量设置的依据。

Anchor尺寸和数量设置的依据

  • Figure3(a)展示了有效感受野effective receptive field和理论感受野theoretical receptive field的区别,其中整个(a)代表的就是理论感受野,一般都是矩形,而(a)中的白色点状区域就是有效感受野。这一点可以看我们更详细的文章:目标检测和感受野的总结和想法

  • Figure3(b)以预测层conv3_3(stride=4)为例介绍理论感受野、有效感受野和 Anchor 尺寸的关系。首先黑色点组成的方形框就是理论感受野,对于conv3_3预测层来说是48\times 48,而有效感受野是蓝色点组成的圆形框,而红色实线组成的方形框是该预测层设置的 Anchor,尺寸是16\times 16,可以看到这里 Anchor 的尺寸和有效感受野是匹配的。

  • Figure3(c)是关于 Anchor 的等比例间隔设置。假设n是 Anchor 的尺寸,那么将 Anchor 的间隔设置为n/4。例如对于stride=4conv3_3预测层而言,Anchor 的尺寸为16\times 16,那么相当于在输入图像中每隔4个像素点就有一个16\times 16大小的 Anchor。可以看出这部分和 SSD 中关于 Anchor 尺寸的设置是类似的,只是相同 Stride 层的 Anchor 数量比 SSD 少,因为这里设置的 Anchor 宽高比为1:1,因为人脸一般是正方形的,另外 SSD 是对特征图每个像素点都设置 Anchor。

下面的 Table1 展示了预测层的strideanchor尺寸和感受野之间的关系。

Table1

S3FD 的 Anchor 尺寸设置和 SSD 最主要的区别在于 S3FD 中的 Anchor 大小是只和stride相关的,而 SSD 的 Anchor 大小不仅和stride有关,还和输入大小有关。

这里以conv3_3为例子,来手算一下理论感受野,注意这里说的理论感受野是基于预测层计算的,比如第一行的conv3_3,是指在conv3_3后接的预测层的感受野,不是conv3_3的感受野。

conv3_3的预测层采用的是3\times 3且步长为1的卷积,所以预测层中的一个点映射到预测层的输入就是3\times 3的区域,预测层的输入是conv3_3的输出,所以conv3_3输出3\times 3区域映射到conv3_3的输入就是5\times 5的区域,conv3_3的输入又是conv3_2的输出,因此conv3_2输出的5\times 5区域映射到conv3_2的输入就是7\times 7区域,conv3_2的输入是conv3_1的输出,因此conv3_1输出的7\times 7区域映射到conv3_1的输入就是9\times 9的区域,conv3_1的输入是pool2的输出,因此pool2输出的9\times 9区域映射到pool2的输入就是18\times 18的区域,然后映射到conv2_2的输入是20\times 20的区域,映射到conv2_1的输入是22\times 22的区域,映射到pool1的输入是44\times 44的区域,映射到conv1_2的输入是46\times 46的区域,映射到conv1_1的输入是48\times 48的区域,因为conv1_1的输入就是输入图像,所以conv3_3预测层的感受野就是48,这个层就计算完了,其它层同理,注意这里计算的方法是从网络顶端算到底端,下面用一张 pprp 的图来看一下整个 VGG16 各层的感受野。

VGG16各层的感受野,made by pprp

接下来的是针对Figure1(c)中的问题,论文提出了尺度补偿的 Anchor 匹配策略。这部分主要分两步,第一步和常规确定 Anchor 的正负标签类似,只不过将 IOU 阈值从0.5降到0.35,这样可以保证每个目标有足够的 Anchor 来检测,这样相当于间接解决了原本处于不同 Anchor 尺寸之间的人脸的可用 Anchor 数量少的问题。经过这一步之后,仍然会有较多的小人脸没有足够的正样本 Anchor 来检测,因此第二部的目的就是提高小人脸的正样本 Anchor 数量,具体而言是对所有和 Ground Truth 的 IOU 大于 0.1 的 Anchor 做排序,选择前 N 个 Anchor 作为正样本,这个 N 是第一步的 Anchor 数量均值。

最后获得的 Anchor 尺寸和人脸尺寸的匹配数量曲线如Figure4(a)所示,相比Figure1(c)相比有较大提升。虽然降低 IOU 阈值能够提高人脸的召回率,但同时也会带来一些误检,之所以采用这种方式,可能时因为召回率的增加远远大于误检率并且后面还有减少误检的操作。

Anchor和人脸匹配数量及max-out background label的示意图

最后针对Figure1(d)的问题,作者提出了针对stride=4的预测层(conv3_3)的max-out background label操作,从而减少误检。具体如Figure4(b)所示,左边支路是分类支路,右边支路是回归支路。左边支路中一共预测N_m个背景概率和一个目标概率,选择N_m个背景概率中最高的概率作为最终的背景概率。这部分其实就相当于集成了N_m个分类器,有效削弱了负样本的预测概率,从而降低误检率,这种做法在目前不平衡的图像分类任务中也比较常用。

对 max-out background label 一个直观的解释就是对于每一个小尺寸 anchor,进行 N 次人脸和背景分类,选择其中某个背景 Acore 最高的一个作为该 Anchor 的 score。 其实就是对 Anchor 进行多次预测,然后取其最大背景概率结果,以此降低误检为人脸的 anchor 数量,从而降低假阳性率。

5. S3FD 网络结构

最后,S3FD 的网络结构如 Figure2 所示:

S3FD的网络结构

可以看到它和 SSD 网络结构差不多,不过预测层(predicted convolutional layers)部分和 SSD 的区别在于:

  • 预测层整体前移了,也就是stride=4stride=1286个预测层。
  • stride=4的预测层通道数和其他stride的预测层通道数不同,stride=4的预测层通道数是1\times (Ns+4),其它stride的预测层通道数是1 \times(2+4),这里的2其实也可以用Ns表示,不过对其它stride的预测层来说Ns2,表示1个前景(人脸)和1个背景(非人脸)共2个类别。而对于stride=4的预测层,N_s=N_m+1,其中1表示前景(人脸),N_m表示 max-out background label 数量。

另外,网络的输入大小为640\times 640

6. 模型训练

6.1 数据增强方法

模型是在 WIDER FACE 的 12880 张人脸数据上进行训练的。其数据增强方法如下:

  • 颜色扰动。
  • 随机裁剪:对小尺寸人脸放大,随机裁剪 5 块,最大的为原图上裁剪,其他 4 张为原图短边缩放至原图[0.3,1]的图像上裁剪得到。
  • 裁剪图像缩放为640\times 640后,并以 0.5 的概率随机左右翻转。

6.2 损失函数

损失函数包括两部分,一部分为 Anchor 是否为人脸的分类损失函数,还有一部分是 Anchor 为人脸的检测框坐标修正值的回归损失函数。最后得到总损失函数如下所示:

损失函数

其中,i表示 Anchor 的索引,而p_i表示 Anchor 是人脸的概率,p_i^*为 ground-truth,即实际情况当该 anchor 为人脸时,其值为 1,而不为人脸时,其值为 0;t_i为预测的 4 个检测框坐标修正值向量,t_i^*为检测框实际坐标。分类损失采用 softmax 损失函数,回归损失采用 smooth-L1 损失函数。p_i^*L_{reg}表示仅对正样本的 anchor 计算回归损失。N_{cls}N_{reg}分别表示分类时正负 anchor 的数量和回归的正 Anchor 数量,\lambda表示平衡参数,用于平衡分类损失和回归损失。

6.3 难样例挖掘

经过 Anchor 匹配过程后,会存在严重的正负样本不平衡的问题,为了模型训练时稳定及更快收敛。对于负样本,选择 loss 值逆序排序的 top N ,使得正负样本比例为 3:1,并且设定N_m=3,\lambda=4以平衡分类和回归损失。

7. 实验结果

下面的 Table3 展示了 S3FD 的消融实验结果,Baseline 是 Faster RCNN 和 SSD。S3FD(F)表示只改进检测网络和 Anchor 设置,S3FD(F+S)表示改进检测网络、Anchor 设置和尺度补偿的 Anchor 匹配策略,S3FD(F+S+M)是最终的算法。

S3FD的消融实验结果

Figure8 是 S3FD 和其它人脸检测算法在 WIDER FACE 数据集上的对比。

S3FD和其它人脸检测算法在WIDER FACE数据集上的对比

下面的 Table4 展示了关于选择不同预测层对最终模型效果(mAP 值)的影响。

重点看下 去掉<code>conv3_3</code>层的效果,因为这是S3FD算法在改进检测网络时做的非常重要的一个操作,可以看到去掉这个预测层对<code>hard</code>人脸的检测效果影响很大,这是因为<code>hard</code>部分主要是小尺寸人脸

8. 结论

这篇论文在小尺寸人脸检测上发力,提出了一些非常有用的 Trick 大大提升了在小尺寸人脸上的召回率以及效果,我觉得

9. 参考


欢迎关注 GiantPandaCV, 在这里你将看到独家的深度学习分享,坚持原创,每天分享我们学习到的新鲜知识。( • ̀ ω•́ )✧

有对文章相关的问题,或者想要加入交流群,欢迎添加 BBuf 微信:

二维码