版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
代码语言:txt复制 本文链接:[https://blog.csdn.net/chaipp0607/article/details/100578202](https://blog.csdn.net/chaipp0607/article/details/100578202)
简介
SSH是一个用于人脸检测的one-stage检测器,提出于2017年8月,在当时取得了state-of-art的效果,论文是《SSH: Single Stage Headless Face Detector》,SSH本身的方法上没有太多新意,更多的是在把通用目标检测的方法往人脸检测上应用。
SSH原理
设计理念
SSH(Single Stage Headless)的目的是设计一个速度快,内存占用小的网络结构,所以采用了one-stage结构,并移除了backbone的全连接层。
但是这个速度快也是相对的,平台还是要依赖GPU,NVIDIA Quadro P6000,然后在400×800400times800400×800的输入下FPS也可达到20,在1200×16001200times16001200×1600时FPS只能到5。而且,这个时间是在没有image pyramid的情况下算出来的,但是state-of-art的效果却要加上image pyramid,加上之后会耗时会增加5倍。
SSH中所谓的Headless,指的是去除VGG中的全连接层,文中指出VGG的全连接层有160M的参数,ResNet-101有12M的参数,占内存比较大,而且在two-stage的情况下,这些参数要计算每一个区域建议,非常耗时,所以SSH采用了全卷积的设计,总体上SSH有下面三个部分:
- 一个去除连接层的VGG作为backbone;
- 用卷积层拉取的多层分支,共拉取三层,每一层最后输出都类似RPN;
- 用于融合上下文信息的Context Module。
网络结构
上图是SSH的整体网络结构,它的backbone选择了VGG结构,并从Conv4_3,Conv5_3拉取了两个分支,Conv5_3后做Max pool,拉取了第三个分支。三个分支分别是M1,M2和M3,其中M1在最浅层,M3在最深层。
在每一路分支上最后都有一个Detection Module(它是多种卷积的组合,后面会详细说明),最后在Detection Module输出的特征图上,参考RPN的方法滑动输出两路分支,分别负责是不是人脸的置信度(Scores)和(Boxes)。
值得注意的是,M1分支有一个跨层的信息融合,SSH把Conv4_3和Conv5_3的输出用1×11times11×1的卷积降低了通道数量到128,并将Conv5_3输出做上采样,最后把它们加起来。这种跨层的信息融合在通用目标检测网络中很常见,比如YOLOv2里面那个奇怪的reorg操作,在SSH之后的文章中,也有很多使用了这种思想,比如YOLOv3和FPN。
信息融合之后又加了一层卷积,主要是为了整合之前加操作得到的特征,然后就进入Detection Module了。
Detection Module
上图是SSH的Detection Module,在这里能清楚的看出来最后的输出,是w/s×h/sw/stimes h/sw/s×h/s个4k4k4k和w/s×h/sw/stimes h/sw/s×h/s个2k2k2k,kkk是Anchor的数量,和RPN是一样一样的。
此外,Detection Module还有一个Context Module。
Context Module
Context Module是一个聚合上下文信息的模块,说白了就是多用几种尺寸的卷积核,不同的卷积核的感受区域是同的。两个3×33times33×3的卷积核作用相当于一个5×55times55×5的,三个3×33times33×3的卷积核作用相当于一个7×77times77×7的。
所以最后Detection Module相当于有三种尺寸的卷积核3×33times33×3,5×55times55×5和7×77times77×7。
Anchor设置
由于SSH用于人脸检测,它的Anchor选取和RPN有所区别,它将人脸默认为正方形,所以Anchor只有一种比例,1:1。尺寸上,每一层分支都有两个,分别是16的{1,2},{4,8},{16,32}倍,话说最大的尺寸到1472,也是够大的。
OHEM
最后SSH训练的时候使用了OHEM,所以SSH训练必须有一个finetune的过程,而且三层分支的OHEM是分开finetune的,一个消融实验证明,OHEM对SSH来说,影响还是挺大的:
SSH性能评价
首先是SSH的耗时统计(NVIDIA Quadro P6000):
就像我们最开始说的那样,50ms的时间是在400×800400times800400×800的输入,在1200×16001200times16001200×1600时耗时达到了182ms。
其次是SSH的图像金字塔应用:
SSH不使用金字塔时要比HR(ResNet-101) Pyramid差上一点点,在用上金字塔后,可以超过HR(ResNet-101) Pyramid,当然这个时候SSH自己的耗时也会上去。
最后是在Wider Face上PR曲线:
在当时得到了state-of-art的效果,我们顺便看下在2019年9月的时候,SSH排在哪里?
大概在16名左右。