1. 前言
Single Stage Headless Face Detector(SSH)是ICCV 2017提出的一个人脸检测算法,它有效提高了人脸检测的效果,主要的改进点包括多尺度检测,引入更多的上下文信息,损失函数的分组传递等等,论文相对比较简单,获得的效果也还不错(从Wider Face的结果来看,和前几天介绍的在小尺寸人脸检测上发力的S3FD 差不多)。
2. 网络结构
SSH算法的网络结构如Figure2所示:
Figure2 SSH算法的网络结构
SSH算法是在VGG的基础上进行了改进,创新点主要有两个,即「尺度不变性和引入更多的上下文信息」。
在Figure2中,「尺度不变性」是通过不同尺度的检测层来完成的,和SSD,YOLOV3等目标检测算法类似。具体来说一共有
个尺寸的检测模块(「detection module」),检测模块 M1,M2,M3的stride
分别为
,
,
,从图中也可以看出M1主要用来检测小尺寸人脸,M2主要用来检测中等尺寸人脸,M3主要用来检测大尺寸人脸。每个检测模块都包含了分类(Scores)和回归(Boxes)两个分支。检测模块M2是直接接在VGG的conv5_3
层后面,而检测模块M1的输出包含了较多的特征融合和维度缩减(从
->
)操作,从而减少计算量。
而「引入更多的上下文信息」 是通过在检测模块中插入上下文模块(context module)实现的,上下文模块的结构如Figure4所示,它是通过将原始的特征分别接一个
卷积的支路和
个
卷积的支路从而为特征图带来不同的感受野,达到丰富语义信息的目的:
通过增大感受野引入更多的上下文信息
3. 创新点详解
刚才提到,SSH算法的创新点就
个,即新的检测模块,上下文模块以及损失函数的分组传递,接下来我们就再盘点一下:
3.1 检测模块
下面的Figure3是检测模块的示意图:
检测模块结构
分类和回归的特征图是融合了普通卷积层和上下文模块输出的结果。分类和回归支路输出的
表示特征图上每个点都设置了
个Anchor,这
个Anchor的宽高比例都是
,论文说增加宽高比例对于人脸检测的效果没有提示还会增加Anchor的数量。
3.2 上下文模块
下面的Figure4是上下文模块的示意图:
上下文模块结构
作者原本是通过引入卷积核尺寸较大的卷积层例如
和
来增大感受野,从而引入更多的上下文信息。但为了减少计算量,作者借鉴了GoogleNet中用多个
卷积代替
卷积或者
卷积的做法,于是最终上下文模块的结构就如Figure4所示了,另外注意到开头的
卷积是共享的。
3.3 损失函数的分组传递
SSH算法还对损失函数做了一些调整,公式如下所示:
损失函数
分类的损失函数还是采用常用的二分类损失函数,其中
表示属于检测模块
的Anchor,而回归损失部分多了一个
,意思对于不同尺度的检测模块来说,只回传对应尺度的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. 附录
- HR算法:https://blog.csdn.net/wfei101/article/details/80932095
- 参考:https://blog.csdn.net/u014380165/article/details/83590831
- 论文原文:https://arxiv.org/pdf/1708.03979.pdf
- 代码:https://github.com/mahyarnajibi/SSH