人脸检测算法总结:SSH

人脸检测算法:Single stage Headless Face Detector


学习人脸检测算法,其实主要是为了前一段时间参加了云从科技的人头计数比赛,然后就看了一些针对人脸检测算法的论文,在这里总结一下。
整个算法和SSD类似,均为one-stage,并且直接在featuremap金字塔上做预测,每个featuremap中的anchor尺度不同,这一点完全和SSD的思路一样。
总体结构

人脸检测算法总结:SSH
上为SSH的流程图。在分类网络各层feature map后面连接三个检测分支,通过全卷积而非全连接层做人脸检测和bbox分类。三个分支的stride分别为8,16,32.检测分支有连个全卷积网络分别用于分类和bbox回归。
SSH在anchor 上的操作基本上和RPN一致,区别在于仅用了一个长宽比,即每个feature map上的anchor总数为W×H×k,k为尺度。
人脸检测算法总结:SSH
检测分支如图3所示,包含一个context module用于提升有效感受野,context module的输出通道数目X在分支M1设置为128,M2M3为256。二者结果concat之后,接两个1×1的卷积,用于bbox回归和分类。具体的输出维度为2×k,和4×k。
Scale Invariance Design
如图2所示,三个检测分支中,M2使用的是VGG中conv5-3的feature map。M1基于feature map的融合,使用更大尺度的conv4-3融合双线性插值上采样后的conv5-3.同时使用1×1的卷积将channels减少到128,以减少计算量。M3用于检测最大尺度的人脸,在conv5-3上使用stride2的Maxpooling,将feature map的stride变为32×32。再接检测分支M3.
context module
之前的two-stage检测器,通过增大proposal的尺度来获取上下文信息,SSH通过简单的conv层叠也可以达到类似的效果;如图4所示:基于使用更大的filter就可以获得更大感受野的思路,在context module中使用5×5和7×7的,同时为了减少参数,采用3×3卷积核叠加的方式。
training
使用3个不同stride的检测分支检测不同scale的人脸。因此网络有3个独立的loss。同时,每个检测分支匹配特定尺度范围内的anchor,这些被分配到不同分支的anchor,其得到的loss也仅用于更新其所处于分支的参数 ,实现上也很好做:基于anchor尺度大小,将anchor分配给不同的检测分支即可。
损失函数
人脸检测算法总结:SSH
上式中lc为人脸分类loss。k为分支索引。Ak为分支anchor集合。lr为人脸回归的loss,与fasterRCNN一致。
难例挖掘
这个地方比较模糊,我参考了源码发现是按照SSD对Loss进行排序的。
训练
正例:iou>0.5
负例:iou<0.3
anchor size: basesize 16,scale: M1(1,2)M2(4,8)M3(16,32)
即size:M1(16,32),M2(64,128),M3(256,512)

总结
1 SSH是一个快速、轻量级的single stage人脸检测器,不需要使用proposal + classification的2stage方式;

2 SSH在分类网络的early conv layers同时定位和检测人脸,有点类似RPN操作;

3 SSH是headless的,不使用分类网络的fc层;

4 SSH通过在特征金字塔上预测,而非图像金字塔,达到了尺度不变性;

5 SSH在wider face、fddb、pascal face上sota;

SSH的源码我看了一下,并不难,看过SSD算法的应该无压力。

本文参考
1,https://zhuanlan.zhihu.com/p/37715872