最近做人脸相关项目的时候在检测阶段用到了SSH和MTCNN两种算法,学习一下paper的具体内容并记录一些重点
paper:: Single Stage Headless Face Detector
link:SSH paper
code:https://github.com/mahyarnajibi/SSH
摘要
- 本文提出了一个one stage人脸检测器
- headless的解释:在分类CNN网络的基础上移除了fully connected layer;
- 具有尺度不变性性特征:没有用图像金字塔image pyramid输入策略,只是在inference的时候用了多尺度的特征层feature pyramid来做检测(SSD算法思想);
- 由此产生的优点:速度快、轻量级,如果用上图像金字塔策略在WIDER所有的subset上都取得很好的表现;
引言
- 目前存在问题:虽然目前人脸检测的性能已经有了飞跃的提升但是在同时考虑速度和内存利用有效性的情况下,小人脸的检测还存在很大的挑战,WIDER数据集中就包含大量的小人脸;
- 提出一个解决方案SSH:基于去掉head的CNN分类网络,使用特征金字塔代替图像金字塔设计出one stage人脸检测算法;
- 在各数据集上的表现:WIDER上配合图像金字塔可以在三个子集都达到最好的性能,FDDB和Pascal-Faces在相对小的输入尺寸的情况下能够达到最好的性能;
相关工作
- 人脸检测相关进展:
- 文中主要提及了基于Faster-RCNN改进的two stage算法CMS-RCNN,以及
Finding Tiny Faces; - 有图像金字塔影响算法速度提出了利用特征金字塔的SSH算法;
- 文中主要提及了基于Faster-RCNN改进的two stage算法CMS-RCNN,以及
- 单阶段检测器和推荐区域网络进展:
- 目前one stage主流的算法有SSD、YOLO,但是在COCO检测数据集上还是two stage的算法性能更好;
- 目前的proposal network有两种anchor定义方式:Scalable, high-quality object detection使用聚类来定义anchor,RPN将anchor定位为以特征图上每个位置为中心的具有各种比例和尺寸的密集网格框,ssh采用RPN类似策略来构建anchor;
- 尺寸不变性和context建模进展:
- 目前检测模型针对不同尺寸的检测主要有两种策略:图像金字塔、特征金字塔,SSH采用后面这种策略;
- two stage的context建模通常通过扩开proposal周围的窗口;
(context建模应该是指上下文特征的融合?理解错误的地方希望大家纠正)
SSH network
- SSH的设计目标:
inference time
少,memory foot-print
低,scale-invariant
特性; - SSH整体结构:
- 从上图2中可以看出在stride为8、16、32的feature map后面加上
detection module
, M 1 , M 2 , M 3 M_1, M_2, M_3 M1,M2,M3,这些模块主要由卷积层组成用以完成binary classifier和regressor; - 关于bbox回归的任务,参考RPN的思路引入
anchor
,每个location有 K K K个不同scale anchor,文中提到在人脸检测任务中anchor
的长宽比固定就行,多样的比例对检测结果没有明显的影响; - feature map size为 W i × H i W_i \times H_i Wi×Hi,总共有 W i × H i × K i W_i \times H_i \times K_i Wi×Hi×Ki个anchor,由不同的scale组成的集合 S i 1 , S i 2 , … , S i K i {S_i^1, S_i^2,\dots,S_i^{K_i}} Si1,Si2,…,SiKi;
detection module
中还添加了一个context module
用来提升感受野的影响,模型最终的输出tensor shape为 W i × H i × K i × 2 W_i \times H_i \times K_i \times 2 Wi×Hi×Ki×2用来表示bbox的分类结果, W i × H i × K i × 4 W_i \times H_i \times K_i \times 4 Wi×Hi×Ki×4用来表示bbox的回归结果;
- 从上图2中可以看出在stride为8、16、32的feature map后面加上
- 尺寸不变性设计:
- 通过在不同stride的feature map上检测small、medium、larger人脸解决目标多尺度的问题;
- 在 M i M_i Mi的检测阶段中用到了特征融合的方法将 c o n v 5.3 conv5.3 conv5.3的feature map使用bilinear的方法上采样和 c o n v 4.3 conv4.3 conv4.3的feature进行融合;
- context模块:
context module
使用 3 × 3 3 \times 3 3×3的卷积核序列来实现 5 × 5 5 \times 5 5×5以及 7 × 7 7 \times 7 7×7的卷积核效果,通过卷积层来代替two-stage检测方法中通过扩充proposal around window来达到上下文合并的策略(没太明白文中提到的two-stage检测方法中的context合并策略,可能得回归一下Faster-RCNN的RPN部分了);detection module
整体比RPN的参数量要少,context module
能够提升检测性能;
- training:
- 针对不同的检测模块使用不同scale的人脸进行训练,只要人脸的scale没有在当前模块的规定scale范围内则不会回传loss,anchor和GT iou大于0.5则被当做true positive;
- Loss function:
∑
k
1
N
k
c
∑
i
∈
A
k
l
c
(
p
i
,
g
i
)
+
λ
∑
k
1
N
k
r
∑
i
∈
A
k
τ
(
g
i
=
1
)
l
r
(
b
i
,
t
i
)
\sum_{k} \frac{1}{N_k^c}\sum_{i\in A_k} l_{c}(p_i, g_i)+\lambda\sum_{k} \frac{1}{N_k^r}\sum_{i\in A_k} \tau(g_i=1)l_{r}(b_i, t_i)
∑kNkc1∑i∈Aklc(pi,gi)+λ∑kNkr1∑i∈Akτ(gi=1)lr(bi,ti):
- l c l_c lc代表分类loss采用logistic loss, A k A_k Ak表示 M k M_k Mk检测阶段所有的anchor, i i i表示和GT iou大于0.5具有positive label的bbox和iou小于0.3具有negtive label的bbox, N k c N_k^c Nkc表示参与分类运算的anchor数量;
- l r l_r lr代表回归loss采用smooth L1 loss,和大多数检测一样需要将anchor和GT在log空间进行编码, τ \tau τ表示只有positive anchor才能参与回归loss的计算;
- OHEM在线困难样本挖掘:
- OHEM在SSH中被独立地应用于每一个检测模块 M k M_k Mk,在每一个检测模块中选择置信度最高的负样本和置信度最低的正样本按照3:1的比例进行批量训练(和SSD里面OHEM用法有所区别,SSD只有困难负样本挖掘,且OHEM是针对分类任务的概念)
实验结果
- anchor生成阶段对应的尺寸是 M 1 ∈ ( 1 , 2 ) , M 2 ∈ ( 4 , 8 ) , M 3 ∈ ( 16 , 32 ) M_1\in(1,2), M_2\in(4,8), M_3\in(16,32) M1∈(1,2),M2∈(4,8),M3∈(16,32),anchor的基础大小是16个像素,在训练阶段每个检测阶段每张图旋转256个检测框,在inference阶段每个检测模块输出1000个分数最高的检测anchor然后用阈值为0.3的NMS进行各阶段检测结果的融合;
- 在WIDER数据集的表现:
- 在FDDB和Pascal Faces的表现:
- 不同策略尝试的结果:multi-scale、OHEM、feature fusion、anchor scale的提升
- ssh在不同input size的情况下速度和精度的表现:
总结
- 文本基于SSD的设计思路和RPN anchor的设计思路提出了单阶段的人脸检测算法,速度快内存占用少性能好;
- SSH完成了人脸检测任务使用特征金字塔的策略在小人脸的检测上表现更好,但是不具备MTCNN人脸landmark检测的功能,一种应用思路是用SSH做检测MTCNN的Onet做人脸关键点的定位;