人脸检测--SSH: Single Stage Headless Face Detector

论文题目《SSH:Single Stage Headless Face Detector》
作者 Mahyar Narjibi 与 Pouya Samangouei 2017
代码地址:https://github.com/mahyarnajibi/SSH

论文背景

SSH为single stage headless的缩写,为单阶段检测器。所谓的headless指的就是只保留基础网络,将原始分类网络中的全连接层去掉的意思,比如VGG16中的全连接层。这样做可以去掉大量的参数,同时加速运算,毕竟卷积的运算量和参数量相比全连接来说少了太多。相比较别的算法在检测不同尺度的人脸时所采用的图像金字塔,SSH中采用的是特征金字塔,也就是使用了卷积层的特征,有点SSD的意思。作者对卷积层使用了3种类型的检测模块,利用不同的卷积步长来同时检测大、中、小三种人脸。相比较基于RPN的网络,SSH不再是先用RPN生成anchor,然后进行分类和回归,而是直接进行分类和回归。在速度上会有5倍以上的提升,如果同时采用图像金字塔的话,会在精度上有进一步的提升,但是会导致网络前向变慢。

摘要

我们介绍了单点无头(SSH)人脸检测器。与两阶段提议分类检测器不同,SSH直接从分类网络中的早期卷积层以单阶段方式检测人脸。 SSH没有头部。也就是说,它能够在移除其底层分类网络的“头部”的同时实现最先进的结果 - 即VGG-16中包含大量参数的全连接的层(注:其实就是移除了VGG 的三个全连接层)。此外,SSH不是依靠图像金字塔来检测具有各种尺度的人脸,而是通过设计进行尺度不变。我们同时在网络的单个前向传递中检测具来自不同层不同尺度的人脸。这些属性使SSH快速且轻量级。令人惊讶的是,使用无头的VGG-16,SSH在WIDER数据集上击败了基于ResNet-101的最好的算法。尽管如此,与当前最好的算法不同,SSH不使用图像金字塔,速度提高了5倍。此外,如果部署了图像金字塔,我们的轻量级网络可以在WIDER数据集的所有子集上实现state of the art 结果,将AP提高2.5%。 SSH还可以在FDDB和Pascal-Faces数据集上使用较小的输入大小达到state of the art的结果,从而在GPU上实现50 ms /image的运行时间。

  • Single Stage Headless Face Detector” 中的 “headless”含义:在分类CNN网络的基础上移除了全连接层(fully connected layer);
  • 具有尺度不变性特征:使用特征金字塔(feature pyramid),而非图像金字塔(image pyramid);
  • 由此产生的优点:速度快、轻量级;
    注解一:
    
    最先进的基于CNN的检测器 将图像分类网络 转换为 两阶段检测器。
    
    * 在第一阶段,分类网络中,前面的卷积层用于提出一组候选框。  
    * 在第二阶段,分类网络的剩余层(全连接层,例如VGG-16中的fc6~8 ),我们称之为网络“头”,用于提取这些候选框的局部特征并对它们进行分类。
      分类网络的头部计算代价很大(例如, VGG-16网络头包含大约120M个参数,ResNet-101网络头包含大约12M个参数)。
      而且在两阶段检测器中,必须在所有提出的候选框上都计算一次。
    
    SSH是单阶段检测器,它移除了分类网络的头部(全连接层),从分类网络的卷积层直接检测人脸。
    
    注解二:
    
    目前检测模型针对不同尺寸图片的检测主要有两种策略:图像金字塔、特征金字塔。
    
    * 使用图像金字塔 需要将各个比例的图像 都传递到非常深的网络,必然会大大增加检测计算量,降低检测速度;
    * 图像金字塔和特征金字塔相比,更有助于能够提升检测的准确率。
    
    SSH采用的是特征金字塔的策略。

引言

  • 目前存在问题:虽然目前人脸检测的性能已经有了飞跃的提升但是在同时考虑速度和内存利用有效性的情况下,小人脸的检测还存在很大的挑战(WIDER数据集中就包含大量的小人脸);
  • 提出一个解决方案SSH:基于去掉head的CNN分类网络,使用特征金字塔代替图像金字塔设计出one stage人脸检测算法;
  • 在各数据集上的表现:WIDER上配合图像金字塔可以在三个子集都达到最好的性能,FDDB和Pascal-Faces在相对小的输入尺寸的情况下能够达到最好的性能;(注:是在论文发表时的最好性能)

 人脸检测--SSH: Single Stage Headless Face Detector_第1张图片

人脸检测是验证、识别、表情分析等各种问题的关键环节。从Viola-Jones检测器到Hu等人最近的工作,人脸检测器的性能得到了极大的提高。然而,检测小面孔仍然被认为是一项具有挑战性的任务。最近推出的包含大量小面孔的WIDER FACE人脸数据集,暴露了人类与现有人脸检测器之间的性能差距。当考虑到探测器的速度和存储效率时,这个问题变得更具挑战性。性能最好的人脸检测器通常速度较慢,并且具有较高的内存占用(例如处理一个图像需要1秒以上的时间),部分原因在于大量的参数,以及处理尺度或上下文合并的鲁棒性的方法。

最先进的基于cnn的检测器将图像分类网络转化为两阶段检测系统。在第一个阶段,早期的卷积特征图被用来提出一组候选对象框。在第二阶段,我们部署了分类网络的其余层(如VGG-16中的fc6~8),我们称之为网络“head”,为这些候选对象提取局部特征并进行分类。分类网络中的头部在计算上是昂贵的(例如,VGG-16中的头部大约包含120M参数,ResNet-101中的头部大约包含12M参数)。此外,在两阶段检测器中,必须对所有建议的候选框进行计算。

最近,Hu等人通过使用类似于区域建议网络(RPN)[24]的方法直接检测人脸,在WIDER FACE检测基准上展示了最新的结果。将图像金字塔作为该方法的一个组成部分,实现了对输入尺度的鲁棒性。然而,它需要处理一个输入金字塔,每边向上采样高达5000像素,并将每一层传递到一个非常深的网络,这增加了推理时间。

 本文介绍了一种单点无头人脸检测器。SSH在单个阶段执行检测。与RPN[24]类似,分类网络中的早期特征映射用于将一组预定义的anchor来进行人脸回归。然而,与两阶段检测器不同的是,最终的分类和anchor的回归是同时进行的。SSH是无头部网络的。它能够达到state of  the art的结果,同时删除其底层网络的头部(即VGG-16中所全连接层),导致一个轻量级检测器。最后,SSH在设计上是尺度不变的。受[14]的启发,SSH不再依赖外部多尺度金字塔作为输入,而是检测来自底层网络不同深度的人脸。这是通过将一个高效的卷积检测模块以不同的步长放置在图层的顶部来实现的,每个步长都经过适当的人脸尺度范围的训练。令人惊讶的是,基于无头VGG-16的SSH不仅在性能上大大超过了报告最好的VGG-16,而且在WIDER FACE 人脸检测数据集上也超过了目前基于resnet 101的最先进的方法。与当前最先进的技术不同,SSH不部署输入金字塔,并且速度快5倍。如果SSH也使用输入金字塔,我们基于轻量级vgg -16的检测器在WIDER FACE数据集的所有三个子集上的性能都优于最佳报告的ResNet-101[7],并且在验证集和测试集上分别将平均精度提高4%和2.5%。SSH还在输入相对较小的FDDB和Pascal-Faces数据集上实现最好的结果,导致运行时为50 ms/image。

相关工作

  • 人脸检测相关进展:

    • 文中主要提及了基于Faster-RCNN改进的 two stage算法CMS-RCNN,以及 Finding Tiny Faces

    • 由图像金字塔影响算法速度提出了利用特征金字塔的SSH算法;

在卷积神经网络(CNN)重新出现之前,为了提高人脸检测性能,人们开发了不同的机器学习算法。然而,随着这些网络在分类任务上的成功,它们也被应用于检测。基于CNN的人脸检测器显著缩小了人与人工检测器的性能差距。然而,具有挑战性的WIDER FACE数据集的引入,包含大量的小面孔,重新突出了这一差距。为了提高性能,CMS-RCNN改变Faster R-CNN目标检测器,以合并上下文信息。最近,Hu等人提出了一种基于proposal网络的人脸检测方法,该方法在数据集上获得了最好的检测结果。然而,除了skip连接之外,还通过将图像重新缩放到不同大小的输入金字塔来处理,从而导致检测速度变慢(多尺度测试)。相比之下,SSH能够在网络的单次前向传递中同时处理多个人脸尺度,大大缩短了推理时间。

  • 单阶段检测器和推荐区域网络进展

    • 目前one stage主流的算法有SSD、YOLO,但是在COCO检测数据集上还是two stage的算法性能更好;
    • 目前的 proposal network 有两种锚点(anchor)定义方式:Scalable, high-quality object detection使用聚类来定义anchor,RPN将anchor定位为以特征图上每个位置为中心的具有各种比例和尺寸的密集网格框。SSH采用RPN类似策略来构建anchor;

在通用目标检测中,通常采用单阶段检测和定位的方法。SSD和YOLO通过对固定的框格进行分类,并将它们回归到目标,同时进行检测和分类。G-CNN将检测建模为一个分段回归问题,并在对对象进行分类的同时迭代地将一个初始的多尺度方框网格推向目标。然而,目前对具有挑战性的MS-COCO目标检测基准的现有方法都是基于两阶段检测器。SSH是一个单阶段检测器;它可以直接从早期卷积层检测人脸,而不需要一个proposal阶段。

SSH虽然是一个检测器,但它更类似于作为检测管道第一阶段使用的目标proposal算法。这些算法通常将一组固定的anchors回归到目标,并为每个目标分配一个目标得分。MultiBox部署集群来定义anchors。另一方面,RPN将anchor定义为一个密集的网格,由不同比例和纵横比的boxes组成,以输入特征图中的每个位置为中心。SSH使用类似的策略,但同时定位和检测人脸。

  • 尺寸不变性和 context 建模进展:

    • 目前检测模型针对不同尺寸的检测主要有两种策略:图像金字塔、特征金字塔。SSH采用后面这种策略;
    • two stage的context建模通常通过扩开proposal周围的窗口;(context建模是指上下文特征的融合)

尺度不变对于无约束条件下的人脸检测非常重要。对于一般目标检测,利用早期(底层)卷积层的特征图来检测小目标。近年来,[14]以与[17]相同的方式使用跳过连接(skip connection),并从不同的卷积层使用多个共享的RPN和分类器头。对于人脸检测,CMS-RCNN[38]使用了与[1,36]相同的思想,并添加了跳跃连接(skip connections)到Faster RCNN[24]。[7]创建一个图像金字塔,并分别处理每个图像来检测不同大小的人脸。相比之下,SSH能够在网络的单次前向传递中检测不同尺度的人脸,而不需要创建图像金字塔。我们采用与[17,14]类似的方式使用skip连接,从卷积层以不同的步长联合训练三个检测模块来检测小、中、大人脸。

在两阶段目标检测器中,上下文通常是通过放大proposals[36]周围的窗口来建模的。[1]通过部署一个递归神经网络(RNN)来建模上下文。对于人脸检测,CMS-RCNN[38]使用了一个更大的窗口,并且复制了分类头。这增加了内存需求和检测时间。SSH使用简单的卷积层来实现同样更大的窗口效果,从而实现更有效的上下文建模。

提出的方法

SSH的设计目的是减少推理时间、具有较低的内存和尺度不变性。SSH是一个单阶段检测器,即不将检测任务划分为边界框proposal和分类,而是对卷积层提取的全局信息进行分类定位。我们的经验表明,通过这种方式,SSH可以删除底层网络的“头”,同时实现最好的人脸检测精度。此外,SSH在设计上是尺度不变的,可以有效地合并上下文。

  • SSH的设计目标:检测时间(inference time)少,内存占用量(memory foot-print)低,尺度不变性(scale-invariant)
  • SSH整体结构:

    • 检测模块(detection module)包含一个用于检测人脸和定位的回归器(regressor,求得目标框的位置)和 一个卷积二值分类器(binary classifier,用于判断该目标框中是不是目标)。三个检测模块 M1、M2、M3 在feature map(图片输入到分类网络前面的卷积层,得到的结果就是feature maps)基础上分别使用步长(stride)8、16、32进行操作;

    • 关于bbox回归的任务,参考RPN的思路引入anchor,每个location有K个不同scale anchor,文中提到在人脸检测任务中anchor的长宽比固定就行,多样的比例对检测结果没有明显的影响;

    • feature map size为 Wi × Hi,总共有 Wi × Hi × Ki个anchor,由不同的scale组成的集合 Si1, Si2, ..., SiKi
    • detection module中还添加了一个context module用来提升感受野的影响,模型最终的输出张量(tensor)shape为 Wi × Hi × Ki × 2。该张量用于表示bbox的分类结果, Wi × Hi × Ki × 4 用于表示bbox的回归结果
  • 尺寸不变性设计:

    • 通过在不同stride的feature map上检测small、medium、larger人脸解决目标多尺度的问题。具体是:

      对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,每一个像素点表示的输入图像的尺寸相比于深度较大的卷积层要小。对不同的卷积层分别进行检测,就实现了不同尺度人脸的检测。

    • 在Mi 的检测阶段中用到了特征融合的方法 将conv5.3的feature map使用双线性(bilinear)的方法上采样 和conv4.3 的feature进行融合;
  • context模块:

    • context module使用3×3的卷积核序列来实现5×5以及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;

    • 人脸检测--SSH: Single Stage Headless Face Detector_第2张图片

  • OHEM在线困难样本挖掘:

    • OHEM在SSH中被独立地应用于每一个检测模块 Mk,在每一个检测模块中选择置信度最高的负样本和置信度最低的正样本按照3:1的比例进行批量训练(和SSD里面OHEM用法有所区别,SSD只有困难负样本挖掘,且OHEM是针对分类任务的概念)

SSH网络

SSH使用的基础网络为VGG16,将其中的全连接层全部去掉,只使用了卷积层。
SSH的网络结构如下:

人脸检测--SSH: Single Stage Headless Face Detector_第3张图片

人脸检测--SSH: Single Stage Headless Face Detector_第4张图片 

人脸检测--SSH: Single Stage Headless Face Detector_第5张图片

可以看到,SSH的网络为全卷积网络,网络的连接方式为:

  1. 对VGG-16网络中conv4-3的输出使用M1进行检测,stride为8,检测small face;
  2. 对VGG-16网络中conv5-3的输出使用M2进行检测,stride为16,检测medium face;
  3. 对VGG-16网络中conv5-3池化后的输出使用M3进行检测,stride为32,检测large face。

图2显示了SSH的一般架构。它是一个全卷积网络,通过在特征图上添加检测模块,对人脸进行早期定位和分类,步长分别为8、16、32,分别表示为M1、M2、M3。检测模块由卷积二分类器和回归器组成,分别对人脸进行检测和定位。

为了解决定位子问题,如[28,24,19],SSH将一组称为anchors的预定义边界框回归到ground truth人脸。 我们采用与RPN类似的策略[24]来形成anchors集合。 我们以密集的重叠滑动窗口方式定义anchors。 在每个滑动窗口位置处,定义K个anchors,其具有与该窗口相同的中心和不同的比例。 但是,与RPN不同,我们只考虑纵横比为 1 的anchor s来减少anchor boxes的数量。 我们在实验中注意到,具有各种纵横比对人脸检测精度没有明显影响。 更正式地说,如果连接到检测模块Mi的特征图具有Wi*Hi的大小,则将存在Wi*Hi*Ki个anchors,它们的宽高比为1并且scale 为

人脸检测--SSH: Single Stage Headless Face Detector_第6张图片

detection module & context moudle

                                          人脸检测--SSH: Single Stage Headless Face Detector_第7张图片

每一个检测模块都同时完成两个任务:分类(人脸/非人脸)+回归(bbox框坐标) 

可以看到,detection模块包含一个context模块,这部分内容是为了增大感受野而设计的。通常的目标检测算法都会通过大的卷积核(5*5、7*7)来增大感受野,而作者这里为了减少参数和计算量,将其进行了拆分,从而用多个3*3的卷积核来代替,因此才会在context模块中出现两种方式的感受野增大方式。外面的3*3和上面3*3的分支结合起来代替5*5卷积核,与下面的两个3*3卷积核结合起来代替7*7卷积核。因此,该context模块的工作方式为:首先通过一个3*3的卷积将输入维度减少为原来的一半,然后通过上下两个分支进行卷积,完成增大感受野的工作,最后再将结果进行拼接。M1模块的输出为128维。而对于M2和M3模块而言也是这样的,只不过context模块的输出通道为256。

而在detection模块中,上面的3 × 3部分相当于一个skip connection。最终detection模块的输出包含两部分内容,一部分进行人脸/非人脸的分类预测,有2K个结果,另一部分进行bbox的回归预测,有4K个结果

另外需要注意的一个地方是,从SSH的网络结构中可以看到,conv4-3之后没有直接接入M1,而是在M1模块之前让conv4-3的结果和conv5-3的结果进行了特征融合后,才接入M1。这部分的安排实际上来源于语义分割,主要是为了增加语义信息。

总体而言,相对于原始图像来说,输入M1的特征图大小是在原始图上进行了stride=8的下采样,输入M2的特征图大小是在原始图像进行了stride=16的下采样,而输入M3的特征图大小是在原始图像进行了stride=32的下采样。

尺度不变设计

在无约束设置下,图像中的人脸具有不同的尺度。虽然像[7]一样,形成一个多尺度的输入图像金字塔,并在推理过程中执行多个前向遍历,使得检测不同尺度的人脸成为可能,但速度较慢(多尺度度测试增加了推理时间)。相反,SSH在网络的单次前传中同时检测大和小的人脸。受[14]的启发,我们使用检测模块M1、M2和M3来检测网络中三个不同卷积层的人脸。这些模块的步长分别为8、16和32,分别用于检测小、中、大人脸。

更精确地说,检测模块M2从VGG-16中的conv5-3层进行检测。虽然可以将检测模块M1直接放在conv4-3之上,但是我们使用了之前用于语义分割[17]和通用目标检测[14]特征融合的方法(conv5_3上采样)。然而,为了减少模型的内存消耗,使用1*1的卷积核将feature map中的通道数从512减少到128。对conv5-3 feature map进行上采样,并与conv4-3 feature map进行求和,然后是一个3*3的卷积层。在融合过程中采用双线性上采样。为了检测较大的人脸,在conv5-3层的基础上增加了一个步长为2的max-pooling层,使其步长增加到32(下采样率变为32)。检测模块M3被放置在这个新添加的层的顶部。

在训练阶段,对每个检测模块Mi进行训练,从目标尺度范围内检测人脸,如3.4所述。在推理过程中,将不同尺度的预测boxes连接在一起,然后进行非最大抑制(NMS),形成最终的检测结果。

训练过程

1. 检测器分配

由于算法是同时处理三种不同尺度的人脸,那么在训练的时候需要为每种模块分配不同尺度的anchor从而来进行反向传播训练。这里,作者是根据anchor的大小来进行区分的。对于产生的小的anchor,则分配给M1模块进行检测,对于中等大小的,则分配给M2,对于大的则分配给M3。

Faster RCNN中对anchor与ground-truth的处理方式是:目标区域产生的anchor都与ground-truth之间进行IOU计算,结果中排序最大的则认为是该目标的目标anchor,将来就对该anchor进行回归,使其逼近ground-truth,这样可以保证每个ground-truth都有一个anchor与其对应。而本文的处理方式是,仅仅对anchor与ground-truth之间的IOU大于0.5的则为该anchor对应这个ground-truth。这样做的好处是:如果某一个anchor比较小,那么其与小的人脸的IOU会满足大于0.5这个条件,而对一个中等大小的人脸的IOU则不会满足这样的条件,因此,可以通过这样的方式,将该anchor分配给M1来进行分类和回归;同理,对于另外一些中等大小的anchor,其与中等大小的人脸之间的IOU大于0.5,则分配给M2来进行分类和回归。对于大的anchor则分配给M3。这样就解决了不同尺度的人脸的检测器分配问题。即使有多个anchor对应一个ground-truth,那么后期也可以通过NMS进行处理,保证结果的唯一性。

2. 损失函数

人脸检测--SSH: Single Stage Headless Face Detector_第8张图片

图4 损失函数形式

 其中  是人脸分类损失,我们使用标准多项逻辑损失作为 。索引 k 表示SSH检测模块, Ak表示Mk中定义的一组anchors,Mk中第i个anchor的预测类别及其指定的ground-truth标签分别表示 pi 和 gi。正如第3.2节所讨论的,只有当且仅当IoU大于阈值(即0.5)时,才将anchors分配给ground-truth边界框。就像在[24]中一样,anchors与任何ground-truth边界框的IOU小于预定义的门限值(即,0.3)标记为负。是模块Mk中参与分类损失计算的anchor个数。

    表示边界框回归损失。遵循[6,5,24]的操作,我们对回归空间进行参数化,在box维中使用log-space移位和尺度不变平移,并使用平滑L1损失作为。在这个参数化空间中,pi 表示预测的四维平移和尺度位移, 为Mk模块中第i个anchor指定的ground truth回归目标。 是指指示函数,它仅将回归损失限制为正anchors和(与ground truth 框匹配的anchors的数量)。

在线硬负和正样本挖掘OHEM

OHEM是所有目标检测算法都要面临的一个问题,因为实际中正负样本太不均衡了。本文作者对每个detection模块都进行了OHEM:使用负样本中与ground-truth之间IOU最大的样本与正样本中与ground-truth之间IOU最小(但大于0.5)的样本组成一个mini-batch来进行训练。但由于负样本实在太多,作者有25%的mini-batch中仅仅使用了正样本。OHEM对于SSH的表现起到了很关键的作用。

训练中所采用的尺度为M1:{1,2}, M2:{4,8}, M3:{16,32}。纵横比是固定的,最小的anchor尺寸为16*16。每张图像中,每个检测模块输出256个检测结果。而在预测的时候,每个模块输出1000个最佳检测结果,最终将这些结果进行阈值为0.3的NMS合并。
另外提一句,作者使用了4块GPU进行并行训练,一个mini-batch是4

实验结果

  • anchor生成阶段对应的尺寸是 M1∈(1,2),M2∈(4,8),M3∈(16,32) ,anchor的基础大小是16个像素,在训练阶段每个检测阶段每张图旋转256个检测框,在 inference 阶段每个检测模块输出1000个分数最高的检测 anchor 然后用阈值为0.3的 NMS 进行各阶段检测结果的融合;

  • 在WIDER数据集的表现:

人脸检测--SSH: Single Stage Headless Face Detector_第9张图片

  • 在FDDB和Pascal Faces的表现:

人脸检测--SSH: Single Stage Headless Face Detector_第10张图片

  • 不同策略尝试的结果:multi-scale、OHEM、feature fusion、anchor scale的提升

人脸检测--SSH: Single Stage Headless Face Detector_第11张图片

  • ssh在不同input size的情况下速度和精度的表现:

人脸检测--SSH: Single Stage Headless Face Detector_第12张图片

 总结

  • 文本基于SSD的设计思路和 RPN anchor的设计思路提出了单阶段的人脸检测算法,速度快、内存占用少、性能好;

  • SSH完成了人脸检测任务使用特征金字塔的策略在小人脸的检测上表现更好,但是不具备MTCNN人脸landmark检测的功能;

参考资料 

  1. http://tongtianta.site/paper/2607
  2. https://www.cnblogs.com/jiangnanyanyuchen/p/9433791.html
  3. https://www.cnblogs.com/shouhuxianjian/p/9999674.html

你可能感兴趣的:(人工智能)