跳转至

为了方便读者获取资料以及我们公众号的作者发布一些Github工程的更新,我们成立了一个QQ群,二维码在文章末尾,感兴趣可以加入。

1. 前言

Single Stage Headless Face Detector(SSH)是ICCV 2017提出的一个人脸检测算法,它有效提高了人脸检测的效果,主要的改进点包括多尺度检测,引入更多的上下文信息,损失函数的分组传递等等,论文相对比较简单,获得的效果也还不错(从Wider Face的结果来看,和前几天介绍的在小尺寸人脸检测上发力的S3FD 差不多)。

2. 网络结构

SSH算法的网络结构如Figure2所示:

Figure2 SSH算法的网络结构

SSH算法是在VGG的基础上进行了改进,创新点主要有两个,即尺度不变性和引入更多的上下文信息

在Figure2中,尺度不变性是通过不同尺度的检测层来完成的,和SSD,YOLOV3等目标检测算法类似。具体来说一共有3个尺寸的检测模块(detection module),检测模块 M1,M2,M3的stride分别为81632,从图中也可以看出M1主要用来检测小尺寸人脸,M2主要用来检测中等尺寸人脸,M3主要用来检测大尺寸人脸。每个检测模块都包含了分类(Scores)和回归(Boxes)两个分支。检测模块M2是直接接在VGG的conv5_3层后面,而检测模块M1的输出包含了较多的特征融合和维度缩减(从512->128)操作,从而减少计算量。

引入更多的上下文信息 是通过在检测模块中插入上下文模块(context module)实现的,上下文模块的结构如Figure4所示,它是通过将原始的特征分别接一个3\times 3卷积的支路和23\times 3卷积的支路从而为特征图带来不同的感受野,达到丰富语义信息的目的:

通过增大感受野引入更多的上下文信息

3. 创新点详解

刚才提到,SSH算法的创新点就3个,即新的检测模块,上下文模块以及损失函数的分组传递,接下来我们就再盘点一下:

3.1 检测模块

下面的Figure3是检测模块的示意图:

检测模块结构

分类和回归的特征图是融合了普通卷积层和上下文模块输出的结果。分类和回归支路输出的K表示特征图上每个点都设置了K个Anchor,这K个Anchor的宽高比例都是1:1,论文说增加宽高比例对于人脸检测的效果没有提示还会增加Anchor的数量。

3.2 上下文模块

下面的Figure4是上下文模块的示意图:

上下文模块结构

作者原本是通过引入卷积核尺寸较大的卷积层例如5\times 57\times 7来增大感受野,从而引入更多的上下文信息。但为了减少计算量,作者借鉴了GoogleNet中用多个3\times 3卷积代替5\times 5卷积或者7\times 7卷积的做法,于是最终上下文模块的结构就如Figure4所示了,另外注意到开头的3\times 3卷积是共享的。

3.3 损失函数的分组传递

SSH算法还对损失函数做了一些调整,公式如下所示:

损失函数

分类的损失函数还是采用常用的二分类损失函数,其中A_k表示属于检测模块M_k的Anchor,而回归损失部分多了一个I(g_i=1),意思对于不同尺度的检测模块来说,只回传对应尺度的Anchor损失,这就实现了第二节中提到的M1主要用来检测小人脸,M2主要用来检测中等尺寸人脸,M3主要用来检测大尺寸人脸的目的。另外,在引入OHEM算法时也是针对不同尺度的检测模块分别进行的。

4. 实验结果

下面的Table1展示了不同的人脸检测算法在Wider FACE数据集上的效果对比。HR算法的输入为图像金字塔,可以看到不使用图像金字塔的SSH算法效果都超过了相同特征提取网络的HR算法。最后一行的SSH(VGG-16)+Pyramid表示的是输入为图像金字塔,可以看到准确率进一步提升了。

SSH算法在Wider FACE上的实验结果

下面的Table2展示了在NVIDIA Quadro P6000 GPU上的速度测试,结果如下:

速度测试结果

5. 总结

这篇文章介绍了一下用于人脸检测的SSH算法,它提出的上下文模块和损失函数的分组传递还是比较有意思的,论文的精度也说明这几个创新点是有用的。但是论文给出的实验结果比较少,所以我们无法判断每个Trick对结果的影响幅度到底多大,这是比较遗憾的。

6. 附录


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

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

二维码

为了方便读者获取资料以及我们公众号的作者发布一些Github工程的更新,我们成立了一个QQ群,二维码如下,感兴趣可以加入。

公众号QQ交流群