人脸检测论文SSH

tags: 人脸检测;face detection

论文题目《SSH:Single Stage Headless Face Detector》
作者 Mahyar Narjibi 与 Pouya Samangouei 2017
代码地址:https://github.com/mahyarnajibi/SSH

论文背景

SSH为single stage headless的缩写,为单阶段检测器。所谓的headless指的就是只保留基础网络,将原始分类网络中的全连接层去掉的意思,比如VGG16中的全连接层。这样做可以去掉大量的参数,同时加速运算,毕竟卷积的运算量和参数量相比全连接来说少了太多。相比较别的算法在检测不同尺度的人脸时所采用的图像金字塔,SSH中采用的是特征金字塔,也就是使用了卷积层的特征,有点SSD的意思。作者对卷积层使用了3种类型的检测模块,利用不同的卷积步长来同时检测大、中、小三种人脸。相比较基于RPN的网络,SSH不再是先用RPN生成anchor,然后进行分类和回归,而是直接进行分类和回归。在速度上会有5倍以上的提升,如果同时采用图像金字塔的话,会在精度上有进一步的提升,但是会导致网络前向变慢。

SSH

SSH使用的基础网络为VGG16,将其中的全连接层全部去掉,只使用了卷积层。
SSH的网络结构如下:

SSH网络结构

图1 SSH网络结构

可以看到,SSH的网络为全卷积网络,网络的连接方式为:

  1. 在conv4-3之后接了1个检测模块M1,用来检测小人脸。
  2. 在conv5-3之后接了检测模块M2,用来检测中型人脸。
  3. 对conv5-3进行一次max pool之后,接了检测模块M3,用来检测大型人脸。

每一个检测模块都同时完成两个任务:分类(人脸/非人脸)+回归(bbox框坐标)
这里在进行bbox回归的时候,借鉴了RPN的想法,对于每个检测模块所对应的特征图,在每个像素出都生成K的anchor。但有一个不同的地方是,原始RPN在每个像素点出都会生成不同尺度的框,这里作者只使用一种纵横比,多种尺度,从而使得每个像素处生成的anchor数量大量减少。比如对于模块 M i M_i Mi,如果其检测的特征图大小为 W i × H i W_i \times H_i Wi×Hi,那么该特征图每个像素点所对应的anchor数量为 W i × H i × K i W_i \times H_i \times K_i Wi×Hi×Ki个, K i = S i 1 , S i 2 , . . . S i K i K_i={S_i^1, S_i^2,...S_i^{K_i}} Ki=Si1,Si2,...SiKi表示不同的尺度

detection module & context moudle

检测模块的结构如下:

detection module

图2 detection模块
语义模块的结构如下:

context module

图3 context模块

可以看到,detection模块包含一个context模块,这部分内容是为了增大感受野而设计的。通常的目标检测算法都会通过大的卷积核(5*5、7*7)来增大感受野,而作者这里为了减少参数和计算量,将其进行了拆分,从而用多个3*3的卷积核来代替,因此才会在context模块中出现两种方式的感受野增大方式。外面的3*3和上面3*3的分支结合起来代替5*5卷积核,与下面的两个3*3卷积核结合起来代替7*7卷积核。因此,该context模块的工作方式为:首先通过一个3*3的卷积将输入维度减少为原来的一半,然后通过上下两个分支进行卷积,完成增大感受野的工作,最后再将结果进行拼接。M1模块的输出为128维。而对于M2和M3模块而言也是这样的,只不过context模块的输出通道为256。

而在detection模块中,上面的3 × \times × 3部分相当于一个skip connection。最终detection模块的输出包含两部分内容,一部分进行人脸/非人脸的分类预测,有2K个结果,另一部分进行bbox的回归预测,有4K个结果。

另外需要注意的一个地方是,从SSH的网络结构中可以看到,conv4-3之后没有直接接入M1,而是在M1模块之前让conv4-3的结果和conv5-3的结果进行了特征融合后,才接入M1。这部分的安排实际上来源于语义分割,主要是为了增加语义信息。

总体而言,相对于原始图像来说,输入M1的特征图大小是在原始图上进行了stride=8的下采样,输入M2的特征图大小是在原始图像进行了stride=16的下采样,而输入M3的特征图大小是在原始图像进行了stride=32的下采样。

训练过程

1. 检测器分配
由于算法是同时处理三种不同尺度的人脸,那么在训练的时候需要为每种模块分配不同尺度的anchor从而来进行反向传播训练。这里,作者是根据anchor的大小来进行区分的。对于产生的小的anchor,则分配给M1模块进行检测,对于中等大小的,则分配给M2,对于大的则分配给M3。

Faster RCNN中对anchor与ground-truth的处理方式是:目标区域产生的anchor都与ground-truth之间进行IOU计算,结果中排序最大的则认为是该目标的目标anchor,将来就对该anchor进行回归,使其逼近ground-truth,这样可以保证每个ground-truth都有一个anchor与其对应。而本文的处理方式是,仅仅对anchor与ground-truth之间的IOU大于0.5的则为该anchor对应这个ground-truth。这样做的好处是:如果某一个anchor比较小,那么其与小的人脸的IOU会满足大于0.5这个条件,而对一个中等大小的人脸的IOU则不会满足这样的条件,因此,可以通过这样的方式,将该anchor分配给M1来进行分类和回归;同理,对于另外一些中等大小的anchor,其与中等大小的人脸之间的IOU大于0.5,则分配给M2来进行分类和回归。对于大的anchor则分配给M3。这样就解决了不同尺度的人脸的检测器分配问题。即使有多个anchor对应一个ground-truth,那么后期也可以通过NMS进行处理,保证结果的唯一性。

2. 损失函数

图4 损失函数形式

l c l_c lc为分类损失。k表示三种检测模块中的某一个,假设是M1模块,则k=1;N则表示M1模块中与ground-truth之间的IOU大于0.5的所有anchor总数。A表示M1模块所要检测的特征图中所产生的所有anchor总数。p和g分别表示预测概率和真实标签。而负样本定义为任何与ground-truth之间的IOU小于0.3的anchor。
l r l_r lr为bbox回归损失。这里要学习的目标与Faster RCNN一致:
t x = ( x − x a ) / w a t y = ( y − y a ) / h a t w = l o g ( w / w a ) t h = l o g ( h / h a ) \begin{aligned} t_x&=(x-x_a)/w_a \\ t_y&=(y-y_a)/h_a \\ t_w&=log(w/w_a) \\ t_h&=log(h/h_a) \\ \end{aligned} txtytwth=(xxa)/wa=(yya)/ha=log(w/wa)=log(h/ha)

损失函数为smooth-L1:
s m o o t h L 1 ( x ) = { 0.5 x 2 , if |x|&lt;1 ∣ x ∣ − 0.5 , otherwise smooth_{L1}(x) = \begin{cases} 0.5x^2, &amp; \text {if |x|&lt;1} \\ |x|-0.5 &amp;, \text{otherwise} \end{cases} smoothL1(x)={0.5x2,x0.5if |x|<1,otherwise

OHEM

OHEM是所有目标检测算法都要面临的一个问题,因为实际中正负样本太不均衡了。本文作者对每个detection模块都进行了OHEM:使用负样本中与ground-truth之间IOU最大的样本与正样本中与ground-truth之间IOU最小(但大于0.5)的样本组成一个mini-batch来进行训练。但由于负样本实在太多,作者有25%的mini-batch中仅仅使用了正样本。OHEM对于SSH的表现起到了很关键的作用。

训练中所采用的尺度为M1:{1,2}, M2:{4,8}, M3:{16,32}。纵横比是固定的,最小的anchor尺寸为16*16。每张图像中,每个检测模块输出256个检测结果。而在预测的时候,每个模块输出1000个最佳检测结果,最终将这些结果进行阈值为0.3的NMS合并。
另外提一句,作者使用了4块GPU进行并行训练,一个mini-batch是4。

实验结果

下图为不同算法在WIDER FACE数据集上的实验对比:
WIDER FACE数据集实验结果

图5 WIDER FACE数据集上实验对比1

可以看到,SSH在三种情况下都表现不错,如果加上图像金字塔的处理方式的话,精度还会进一步提升。

不同召回率下的精度对比如下:
WIDER FACE实验对比

图6 WIDER FACE数据集上实验对比2

在不同大小的图像上的处理速度如下:
不同大小图像上的时间消耗

图7 不同大小图像处理时间消耗

附加实验

作者对使用的各种技巧进行了分析,结果如下:
附加实验对比

图8 各种技巧的分析

可以看到,无论是多尺度检测还是OHEM,或者增加特征融合与增加anchor的尺度,都会使模型的精度进行进一步提升,也表明了作者所采取的各种策略是有效的。

结论

本文的SSH设计思想比较简单,速度快,效果也不错。但是训练比较重要,因为要同时对三种尺度的人脸进行检测,其难度还是有的。感觉作者在不同的detection模块中分配anchor训练部分是主要的精髓。总之,本人还是比较喜欢这篇文章的。
最后补一点作者的效果图:

实验效果1

实验效果1

实验效果2

实验效果2

实验效果3

实验效果3

参考文献:

SSH: Single Stage Headless Face Detector

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值