算法|SSH人脸检测算法(SSH: Single Stage Headless Face Detector)

论文:《SSH: Single Stage Headless Face Detector》 链接:https://arxiv.org/pdf/1708.03979.pdf 代码链接:https://github.com/mahyarnajibi/SSH
摘要 我们介绍了单点无头(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 /图像的运行时间。该代码可在https://github.com/ mahyarnajibi / SSH获得。

1 引言 人脸检测是验证、识别、表情分析等各种问题的关键环节。从Viola-Jones[29]检测器到Hu等人最近的[7]工作,人脸检测器的性能得到了极大的提高。然而,检测小面孔仍然被认为是一项具有挑战性的任务。最近推出的包含大量小面孔的WIDER FACE人脸数据集[35],暴露了人类与现有人脸检测器之间的性能差距。当考虑到探测器的速度和存储效率时,这个问题变得更具挑战性。性能最好的人脸检测器通常速度较慢,并且具有较高的内存占用(例如[7]处理一个图像需要1秒以上的时间,参见4.5节),部分原因在于大量的参数,以及处理尺度或上下文合并的鲁棒性的方法。
最先进的基于cnn的检测器将图像分类网络转化为两阶段检测系统[4,24]。在第一个阶段,早期的卷积特征图被用来提出一组候选对象框。在第二阶段,我们部署了分类网络的其余层(如VGG-16[26]中的fc6~8),我们称之为网络“head”,为这些候选对象提取局部特征并进行分类。分类网络中的头部在计算上是昂贵的(例如,VGG-16中的头部大约包含120M参数,ResNet-101中的头部大约包含12M参数)。此外,在两阶段检测器中,必须对所有建议的候选框进行计算。
最近,Hu等人通过使用类似于区域建议网络(RPN)[24]的方法直接检测人脸,在WIDER FACE检测基准上展示了最新的结果。将图像金字塔作为该方法的一个组成部分,实现了对输入尺度的鲁棒性。然而,它需要处理一个输入金字塔,每边向上采样高达5000像素,并将每一层传递到一个非常深的网络,这增加了推理时间。
本文介绍了一种单点无头人脸检测器。SSH在单个阶段执行检测。与RPN[24]类似,分类网络中的早期特征映射用于将一组预定义的anchor向人脸回归。然而,与两阶段检测器不同的是,最终的分类和anchor的回归是同时进行的。SSH是无头部网络的。它能够达到state ofthe 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。
2.相关工作 2.1 人脸检测 在卷积神经网络(CNN)重新出现之前,为了提高人脸检测性能,人们开发了不同的机器学习算法[29,39,10,11,18,2,31]。然而,随着这些网络在分类任务[9]上的成功,它们也被应用于检测[6]。基于CNNs的人脸检测器显著缩小了人与人工检测器的性能差距[12,333,32,38,7]。然而,具有挑战性的WIDER FACE数据集[35]的引入,包含大量的小面孔,重新突出了这一差距。为了提高性能,CMS-RCNN[38]改变Faster R-CNN目标检测器[24],以合并上下文信息。最近,Hu等人提出了一种基于proposal网络的人脸检测方法,该方法在数据集[7]上获得了最好的检测结果。然而,除了skip连接之外,还通过将图像重新缩放到不同大小的输入金字塔来处理,从而导致检测速度变慢(多尺度测试)。相比之下,SSH能够在网络的单次前向传递中同时处理多个人脸尺度,大大缩短了推理时间。
2.2 单点检测器和proposal 网络 在通用目标检测中,通常采用单阶段检测和定位的方法。SSD[16]和YOLO[23]通过对固定的框格进行分类,并将它们回归到目标,同时进行检测和分类。G-CNN[19]将检测建模为一个分段回归问题,并在对对象进行分类的同时迭代地将一个初始的多尺度方框网格推向目标。然而,目前对具有挑战性的MS-COCO目标检测基准的现有方法都是基于两阶段检测器[15]。SSH是一个单阶段检测器; 它可以直接从早期卷积层检测人脸,而不需要一个proposal阶段。
SSH虽然是一个检测器,但它更类似于作为检测管道第一阶段使用的目标proposal算法。这些算法通常将一组固定的anchors返回归到目标,并为每个目标分配一个目标得分。MultiBox[28]部署集群来定义anchors。另一方面,RPN[24]将anchor定义为一个密集的网格,由不同比例和纵横比的boxes组成,以输入特征图中的每个位置为中心。SSH使用类似的策略,但同时定位和检测人脸。
2.3 尺度不变和上下文建模 尺度不变对于无约束条件下的人脸检测非常重要。对于一般目标检测,[1,36]利用早期(底层)卷积层的特征图来检测小目标。近年来,[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使用简单的卷积层来实现同样更大的窗口效果,从而实现更有效的上下文建模。
3. 提出的方法 SSH的设计目的是减少推理时间、具有较低的内存和尺度不变性。SSH是一个单阶段检测器,即不将检测任务划分为边界框proposal和分类,而是对卷积层提取的全局信息进行分类定位。我们的经验表明,通过这种方式,SSH可以删除底层网络的“头”,同时实现最好的人脸检测精度。此外,SSH在设计上是尺度不变的,可以有效地合并上下文。
3.1 通用结构 算法|SSH人脸检测算法(SSH: Single Stage Headless Face Detector)
文章图片


图2 SSH的网络结构
【算法|SSH人脸检测算法(SSH: Single Stage Headless Face Detector)】图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人脸检测算法(SSH: Single Stage Headless Face Detector)
文章图片

算法|SSH人脸检测算法(SSH: Single Stage Headless Face Detector)
文章图片

图3 SSH 检测模块
对于检测模块(注:该检测模块被后续很多论文所采用或改进),部署了一组卷积层来提取人脸特征进行检测和定位,如图3所示。这包括一个简单的上下文模块来增加有效的感受野,如3.3节所述。上下文模块的输出通道数(即图3和图4中的“X”)设置为128作为检测模块M1,检测模块模块M2和M3的通道数设置为256。最后,两个卷积层进行边界盒回归和分类。在每个卷积位置Mi中,分类器决定过滤器中心对应的每个尺度为算法|SSH人脸检测算法(SSH: Single Stage Headless Face Detector)
文章图片
的窗口是否包含一个人脸。分类器采用2*K个1*1的卷积层作为分类器。对于回归器分支,还部署了4K个1*1的通道进行回归预测。在卷积过程中的每个位置,回归器预测所需的尺度变化和平移量,以便将每个正anchors与人脸匹配。
3.2 尺度不变设计 在无约束设置下,图像中的人脸具有不同的尺度。虽然像[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),形成最终的检测结果。
3.3 上下文模块 算法|SSH人脸检测算法(SSH: Single Stage Headless Face Detector)
文章图片

图4 SSH 上下文模块
在两阶段检测器中,通常通过扩大候选proposals周围的窗口来整合上下文。SSH通过简单的卷积层模仿这种策略。图4显示了集成到检测模块中的上下文层。由于anchors是以卷积的方式分类和回归的,所以采用更大的过滤器(更大的卷积核尺寸),这类似于在两阶段检测器中增加proposals周围的窗口大小。为此,我们在上下文模块中使用5*5和7*7的过滤器(卷积核)。以这种方式对上下文建模增加了与相应层的步长成比例的感受野,并且因此增加了每个检测模块的目标尺度。为了减少参数的数量,我们使用了类似于[27]的方法,并采用一些串联的3*3的卷积核来代替较大的卷积核(注:尽管大卷积核可以获得更大的感受野,但是参数数量更大,而采用一些较小的卷积核层堆叠起来可以达到与大感受野同样的效果,同时减少了参数数量)。对于模块M2和M3,检测模块的输出通道数(即图4中的“X”)分别设置为:M1通道数为128,M2和M3的通道数为256。应该注意的是,与部署在[24]中用于生成提案的模块相比,我们的检测模块及其上下文过滤器使用的参数更少。尽管更有效,但我们通过经验发现上下文模块将WIDER FACE的验证集的平均精度提高了0.5%以上。
3.4 训练 我们使用momentum和权重衰减的随机梯度下降来训练网络。如第3.2节所述,我们将三个检测模块放在不同步长的特征层上,以检测不同尺度的人脸。因此,正如3.4.1节所讨论的,我们的网络在每个模块的分类和回归分支上有三个多任务损失。为了针对特定的尺度范围对这三个检测模块进行专门化,我们只对分配给相应范围内人脸anchors的损失进行反向传播。这是通过根据anchors的大小将anchors分配到这三个模块来实现的(即,相对于M2和M3,较小的anchors分配到M1)。当且仅当IOU高于0.5时,才将anchors分配给ground truth 人脸。这与基于Faster RCNN的方法形成了对比,该方法为每个ground truth分配至少一个具有最高IOU 的anchor。因此,对于与模块anchor大小不一致的ground-truth人脸,我们不通过网络反向传播损失。
3.4.1 损失函数
SSH有一个多任务丢失。这种损失可以这样表示:
算法|SSH人脸检测算法(SSH: Single Stage Headless Face Detector)
文章图片

其中 算法|SSH人脸检测算法(SSH: Single Stage Headless Face Detector)
文章图片
是人脸分类损失,我们使用标准多项逻辑损失作为 算法|SSH人脸检测算法(SSH: Single Stage Headless Face Detector)
文章图片
。索引 k 表示SSH检测模块算法|SSH人脸检测算法(SSH: Single Stage Headless Face Detector)
文章图片
, 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)标记为负。算法|SSH人脸检测算法(SSH: Single Stage Headless Face Detector)
文章图片
是模块Mk中参与分类损失计算的anchor个数。
算法|SSH人脸检测算法(SSH: Single Stage Headless Face Detector)
文章图片
表示边界框回归损失。遵循[6,5,24]的操作,我们对回归空间进行参数化,在box维中使用log-space移位和尺度不变平移,并使用平滑L1损失作为算法|SSH人脸检测算法(SSH: Single Stage Headless Face Detector)
文章图片
。在这个参数化空间中,pi 表示预测的四维平移和尺度位移,算法|SSH人脸检测算法(SSH: Single Stage Headless Face Detector)
文章图片
为Mk模块中第i个anchor指定的ground truth回归目标。算法|SSH人脸检测算法(SSH: Single Stage Headless Face Detector)
文章图片
是指示函数,它仅将回归损失限制为正anchors和算法|SSH人脸检测算法(SSH: Single Stage Headless Face Detector)
文章图片
(与ground truth 框匹配的anchors的数量)。
3.5 在线硬负和正样本挖掘 我们使用在线负挖掘和正挖掘(OHEM)来训练SSH,如[25]中描述的那样。但是,OHEM分别应用于每个检测模块(Mk)。也就是说,对于每个模块Mk,我们选择得分最高的负anchors和得分最低的正anchors点作为我们的mini-batch。此外,由于负anchors的数量大于正anchors的数量,所以遵循[4]的方法,将保留25%的mini-batch处理用于正anchors。根据经验,在第4.8节中,OHEM在SSH的成功中扮演了重要角色。
4. 实验 4.1 实验步骤 所有的模型都使用随机梯度下降法在4个gpu上并行训练。我们的mini-batch使用了4张图片。我们的网络从一个预先训练好的ImageNet分类网络开始,针对21K次迭代进行了微调。遵循[4]的方法,我们将初始卷积修正为conv3-1。学习速度最初设置为0.004,经过18K次迭代后下降了10倍。momentum为0.9,权重衰减为0.0005。带有IoU> 0.5的anchors被分配到正类,带有IoU< 0.3的anchors被分配到背景类。对于anchors的生成,我们使用scale: M1中设置为{1,2} ,M2中设置为{4,8}, M3中设置为{16,32},base anchors大小为16像素。所有anchors的长宽比均为1。在训练过程中,每个模块为每个图像选择256个检测。在推理过程中,每个模块输出1000个最佳得分anchors作为检测,对所有模块的输出一起执行阈值为0.3的NMS。
4.2 数据集 WIDER FACE:该数据集包含32203张图片,393703个注释人脸,158989个框用于训练集,39496个boxes用于验证集,其余的都在测试集中,验证集和测试集累计分为“easy”、“medium”和“hard”子集(即“hard”集合包含所有图像)。这是最具挑战性的公共人脸数据集之一,主要是因为各种各样的人脸尺度和遮挡。我们在WIDER FACE 训练集上训练所有模型,并在验证集和测试集上进行评估。消融研究是在验证集(即“hard”子集)上进行的。
FDDB: FDDB包含2845张图片和5171张带注释的人脸。我们仅将此数据集用于测试。
Pascal FACES:Pascal Facees是Pascal VOC数据集[3]的子集,包含用于人脸检测的851张注释图像。我们只使用这个数据集来评估我们的方法。
4.3 WIDER 数据集结果
我们将SSH与HR[7]、CMS-RCNN[38]、多任务Cascade CNN[37]、LDCF[20]、Faceness[34]和多尺度Cascade CNN[35]进行了比较。在没有图像金字塔的情况下报告SSH时,我们将图像的最短边缩放到1200像素,而将最大边保持在1600像素以下,而不改变纵横比。当我们将SSH应用于输入图像的金字塔时,SSH+Pyramid是我们的方法。与HR一样,也部署了一个四层的图像金字塔。为了形成金字塔,首先对图像进行缩放,使其最短的一边不超过800像素,最长的一面不超过1200像素。然后,我们将图像缩放到最小尺寸为500,800,1200,1600的金字塔。所有模块检测所有金字塔层的人脸,除了M3不采用最大的层。
表1比较了SSH和在WIDER FACE验证集上性能最好的方法。SSH在不使用图像金字塔的情况下,基于VGG-16网络,其性能比HR的VGG-16版本在“easy”、“medium”和“hard”子集中,分别高出:5.7%,6.3%和6.5%。令人惊讶的是,SSH在整个数据集(即“hard”子集)上的性能也比基于ResNet-101的HR高出0.8。相比之下,HR则采用了一种图像金字塔。使用一个图像金字塔,SSH基于一个轻量级vgg16模型,比ResNet-101版本的HR有很大的优势,将这个数据集上的最新技术提高了4%。
算法|SSH人脸检测算法(SSH: Single Stage Headless Face Detector)
文章图片

图5 WIDER FACE 测试集上检测结果

测试集上的PR曲线如图5所示。我们只提交了一次带有图像金字塔的SSH检测进行评估。可以看出,基于无头VGG-16的SSH在所有子集上的性能都优于之前的方法,使最最好的结果提高了2.5%。
4.4 FDDB 和 Pascal Faces结果 在这些数据集中,我们将输入的最短边调整为400像素,同时将较大的边保持在800像素以下,从而导致推理时间小于50 ms/image。我们将SSH与HR[7]、HR-er[7]、Conv3D[13]、Faceness[34]、Faster R-CNN(VGG-16)[24]、MTCNN[37]、DP2MFD[21]和Headhunter[18]进行了比较。图6a和图6b分别显示了FDDB数据集上离散和连续测量的ROC曲线。
算法|SSH人脸检测算法(SSH: Single Stage Headless Face Detector)
文章图片

图6 FDDB和Pascal VOC数据集的检测结果
值得注意的是HR-ER也使用FDDB作为10折交叉验证的训练数据。此外,HR-ER和Conv3D都生成椭圆,以减少定位误差。相反,SSH不使用FDDB进行训练,而是通过生成边界框在这个数据集上进行评估。但是,可以看出,SSH在离散值方面的性能优于其他所有方法。与HR相比,SSH在连续和离散评分上分别提高了5.6%和1.1%。
我们还将SSH与Faster R-CNN(VGG- 16)[24]、HyperFace[22]、headhunter[18]和Faceness[34]在Pascal-Faces数据集中进行了比较。如图6c所示,SSH在这个数据集上实现了最好的结果。

更多实验结果详见论文!!!



    推荐阅读