SSH人脸检测

SSH: Single Stage Headless Face Detector

1 整体结构

SSH网络的整体结构如下图所示

图1

  • 全卷积网络;
  • 三个检测模型M1,M2,M3,在卷积层的feature map基础上使用stride为8,16,32进行操作;检测模块由一个人脸分类器和人脸回归器组成;
  • 为了解决定位问题,也是定义了一系列的叫做bounding box的anchor,通过回归的方法逐渐使其靠近真正的ground-truth。使用密集的滑动窗的方式定义这些anchor,在当前feature map任一被滑动窗口覆盖的区域,定义具有和当前滑动窗口相同中心位置但尺度不同的K个anchor。但是这里作者定义的anchor都是长宽比为1的anchor,这是因为作者实验表明定义多种长宽比的anchor对人脸检测的性能提升并没有什么帮助。假设和当前检测模块Mi关联的feature map大小为Wi * Hi,那么最终就得到了Wi * Hi * Ki 个长宽比为1的anchor。
    SSH人脸检测_第1张图片
    图2
  • 检测模块结构如下图所示。Context模块用于增大有效的感受野。M1中X = 128,M2、M3中X为256。最后使用两个卷积层完成检测框的回归和分类任务。在Mi的每一个卷积位置,分类器决定当前滤波器覆盖的中心位置的各尺度图像是否为人脸。最终输出W/S * H/S * 2K 个分类得分及W/S * H/S * 4K个回归坐标。
    SSH人脸检测_第2张图片
    图3

2 多尺度检测

作者没有采用将输入图像下采样形成金字塔,然后对各层图像分别进行网络前向运算检测的方式,原因就是这种方式处理速度慢。
作者采用的是如图1所示的在不同深度的卷积层分别进行检测的思路。具体是对VGG-16网络中conv4-3的输出使用M1进行检测,stride为8,检测small face;对VGG-16网络中conv5-3的输出使用M2进行检测,stride为16,检测medium face;对VGG-16网络中conv5-3池化后的输出使用M3进行检测,stride为32,检测large face。
作者这样做是因为深度较小的卷积层的feature map,每一个像素点表示的输入图像的尺寸相比于深度较大的卷积层要小。对不同的卷积层分别进行检测,就实现了不同尺度人脸的检测。

3 context module

SSH人脸检测_第3张图片 图4

在两阶段的检测算法中,经常会通过扩大候选框周围的检测窗口实现对上下文信息的结合。上图是集成在SSH检测模块中的上下文模块。由于在SSH中anchors是以卷积的方式进行分类和回归处理的,所以这里采用更大的卷积核来实现对处理的候选框区域的扩充。这里使用了55和77的卷积核进行实现,对应于上图中的两个33卷积和3个33卷积。作者的实验表明context module提升了WIDER验证集上超过0.5%的平均检测精度。

4 训练

使用带momentum和权重衰减的随机梯度下降算法进行模型训练。
正如第2节所介绍的那样,在不同的三个卷积层使用不同的检测模块实现多尺度的人脸检测,因此就有了三个多任务的loss。为了使得三个检测模型各自只针对特定尺度进行检测,我们只将属于该检测模型尺寸大小的人脸的分类及定位损失进行反向传播。也就是说,将各anchors根据其尺寸大小分配给三个不同的检测模型(最小的anchors分配给M1,中等的anchors分配给M2,最大的anchors分配给M3,)。当且仅当一个anchor与真实人脸之间的IOU大于0.5时才认为两者完成了匹配。作者只将与真实人脸匹配上了的anchor的训练误差回传进行网络的训练工作。

4.1损失函数

SSH人脸检测_第4张图片
图5

总体损失 = 分类损失 + 回归损失

  • 分类损失
    lc表示人脸分类损失,softmax loss。K表示对检测模型的遍历,这里就是M1,M2,M3。Ak表示Mk中定义的所有的anchors。pi表示某一个anchor的预测label,gi表示该目标的真实label。只有当一个anchor与一个真实的人脸bounding box之间的IOU大于0.5时则将该anchor的真实类别设置为1(该anchor区域为人脸);如果一个anchor与所有的真实人脸的bounding box之间的IOU都小于0.3,则将该anchor的真实类别设置为0(该anchor区域非人脸)。经过检测模型的前向运算后,获得了各anchor区域是人脸及不是人脸的score,可以和各anchor的真实的label进行比较计算分类损失。Nkc是在Mk检测模块中参与分类损失计算的总的anchor的数量。
  • 回归损失
    lr表示bounding box的回归损失。
    损失函数用的是l1损失,bi表示预测的四个值,ti为真实的四个值。I(.)是示性函数,表示只对标记类别为true的anchor进行计算。

4.2 在线的难例最小化(OHEM)

对每一个检测模型Mk单独使用在线难例样本最小化。
OHEM使得ssh算法能够在不使用全连接层的情况下取得良好的检测效果。

5 实验

WIDER数据集:
32203幅图像
393703个标记的人脸
158989个人脸用于训练
39496个人脸用于验证
剩余的作为测试集
验证集和测试集分为“easy”“medium”“hard”三个子集。

数据集包含多种人脸尺寸和严重遮挡,是一个最有挑战的人脸公开数据集。

SSH输入图像是图像的短边缩放到1200,长边保持在1600以内,不改变长宽比。
SSH人脸检测_第5张图片

单块 NVIDIA Quardo P6000显卡下耗时
SSH人脸检测_第6张图片

6 待学习

  • Training regionbased object detectors with online hard example mining OHEM;
  • RCNN、Fast RCNN、Faster r-cnn: Towards real-time object detection with region proposal networks 回忆下如何去定义回归损失;
  • Mxnet输入的图像需要是固定大小的,作者是如何做到一个模型处理不同尺寸的图像;
  • 研究下python版本的原始代码,尝试转到c++下,与MTCNN相比提升检测的时间效率。

才疏学浅,若有错误,欢迎批评指正!

你可能感兴趣的:(人脸识别)