论文:https://arxiv.org/abs/1512.02325
我们提出了一种使用单个深度神经网络进行图像中目标检测的方法。我们的方法名为SSD,将边界框的输出空间离散化为一组默认框,在每个特征图位置上获得了多种宽高比、尺度的检测框。在预测时,网络为每个默认框中的每个对象类别的存在可能性进行评分,并对检测框进行调整以更好地匹配目标形状。另外,网络使用不同分辨率的多个特征图的预测组合在一起以检测多种尺寸的目标。SSD相对于需要对象提议的方法而言更加简单,因为它完全消除了提议生成和后续像素或特征重采样阶段,并将所有计算封装在单个网络中。这使得SSD易于训练并且可以直接集成到需要检测组件的系统中。在PASCAL VOC,COCO和ILSVRC数据集上的实验结果证实,SSD与使用额外对象提议步骤的方法相比具有竞争力,并且速度更快,同时为训练和推理提供了统一的框架。对于300×300的输入图像,SSD在VOC2007测试集中获得74.3%mAP,在Nvidia Titan X上为59 FPS,对于512×512的输入,SSD达到76.9%mAP,优于同类最先进的Faster R-CNN模型。与其他单阶段检测方法相比,即使输入图像尺寸较小,SSD也具有更高的精度。代码见:https//github.com/weiliu89/caffe/tree/ssd。
当前最先进的目标检测系统是以下方法的变体:假设每个box的边界框,重采样像素或特征,并应用高质量分类器进行目标分类。自从基于选择性搜索[1]和深度特征提取网络的Faster R-CNN在PASCAL VOC,COCO和ILSVRC检测中取得了当下领先的结果以来,该处理流程已经在检测领域占据了主流位置。但是这个处理流程计算量大,难以应用到嵌入式设备上,即便是对于计算能力更强的硬件设备,也难以做到实时处理。这些方法的检测速度通常以每帧秒数(SPF)来衡量,即使是最快的高精度检测器,例如Faster R-CNN,也只能以每秒7帧(FPS)的速度运行。已经有许多尝试通过修改检测管道的每个阶段来构建更快的检测器(参见第4节中的相关工作),但到目前为止,速度的提升往往导致了检测精度的下降。
本文介绍了第一个不对边界框进行重新特征提取的深度目标检测器,并且效果与Faster R-CNN等两阶段目标检测算法一样准确。这导致了高精度目标检测速度的显著提高(在VOC 2007测试集中具有74.3%的mAP,59 FPS,而mAP为73.2%的Faster R-CNN 仅为7 FPS或具有mAP为63.4%的YOLO为45 FPS)。速度的根本改进来自于消除边界框提议以及随后的像素或特征重采样阶段。我们不是第一个这样做的人(参见[4,5]),但通过添加一系列改进,我们设法比以前的尝试显著提高了准确性。我们的改进包括使用小尺寸卷积滤波器预测边界框位置中的对象类别和偏移,使用单独的预测器(滤波器)进行不同的宽高比检测,并将这些滤波器应用于网络后期的多个特征图以执行多尺度检测。通过这些修改 - 特别是使用多个层进行不同尺度的预测 - 我们可以使用相对低分辨率的输入实现高精度,进一步提高检测速度。虽然这些贡献可能看起来很小,但我们注意到,由此产生的系统提高了PASCAL VOC的实时检测准确度,从YOLO的63.4%mAP到我们SSD的74.3%mAP。与最近在残差网络上非常高调的工作相比,这是在检测精度上相对较大的改进。此外,显著提高高质量检测的速度可以扩大计算机视觉的应用范围。
我们的贡献包括:
2.1节描述了SSD的处理框架,2.2节描述了训练细节。
SSD方法基于前馈卷积网络,该网络生成固定大小的边界框集合以及在这些框中存在对象类实例的可能性,随后通过非最大抑制步骤以产生最终检测。早期的网络层基于用于高质量图像分类的标准架构(VGG16,在分类层之前被截断),我们称之为基础网络。然后,我们将辅助结构添加到网络中,以生成检测结果:
用于检测的多尺度特征图:我们将卷积特征层添加到截断的基础网络的末尾。这些层的尺寸逐渐减小,并允许在多个尺度上预测检测。用于预测检测的卷积模型对于每个特征层是不同的(参见在单个尺度特征图上操作的Overfeat [4]和YOLO [5])。
用于检测的卷积预测器:每个添加的特征层(或者可选地来自基础网络的现有特征层)可以使用一组卷积滤波器产生一组固定的检测预测结果。如图2中SSD网络架构的高层所示。对于具有p个通道的大小为m×n的特征层,用于预测潜在检测的参数的基本元素是3×3×p小内核,其产生目标类别的分数或相对于默认框坐标的位置偏移。在应用内核的m×n个位置中的每一个处,都产生输出值。边界框偏移输出值是相对于默认框的。
默认框和长宽比:我们将一组默认边界框与每个特征图单元关联,以用于网络顶部的多个特征图。默认框以卷积方式平铺特征图,以便每个框相对于其对应单元的位置是固定的。在每个特征图单元格中,我们预测相对于单元格中默认框形状的偏移量,以及指示每个框中是否存在类实例的每个类别得分。具体来说,对于给定位置的k个框中的每个框,我们计算c类分数和相对于原始默认框形状的4个偏移。这导致在特征图中的每个位置周围应用总共(c + 4)k个滤波器,在m×n特征图上产生(c + 4)kmn输出。图1给出了示意图。我们的默认框类似于Faster R-CNN [2]中使用的锚框,但是我们将它们应用于不同分辨率的几个特征图。允许在多个特征图中使用不同的默认框形状,可以有效地离散可能的输出框形状的空间。
SSD的设计思想就是对于输入图像进行多尺度的检测,网络的高层的输出都参与最终的预测过程,以此实现多尺度的目标预测。在特征图的每一个位置,都有k个不同大小和长宽比的anchor box,图1中画出来的是四个。对每一个anchor box,获得了一组类别概率和四个坐标偏移值。这样对于一个大小为m * n的feature map,获得了m * n * k * (4 + c)的输出。如图1所示,在做样本标记时,只标记了目标位置和类别信息,但希望对于图像中不同大小的目标,能够通过不同尺度的feature map和目标对应上,并且对应到不同大小和长宽比的anchor box上,如图1中是猫的图像对应到了8 * 8 feature map的两个蓝色框中,狗的图像对应到了4 * 4 feature map的红色anchor box上。
训练SSD和训练使用区域建议的检测器之间的关键区别在于,需要将目标真实信息分配给固定检测器输出组中的特定输出。在YOLO [5]和Faster R-CNN [2]和MultiBox [7]的区域建议阶段,也需要相似的训练思路。确定此对应关系后,确定损失函数和反向传播后就可进行端到端训练。训练还涉及选择一组默认框和检测尺度以及难例最小化和数据增强策略。
匹配策略:在训练期间,我们需要确定哪些默认框对应于真实检测框并相应地训练网络。对于每个真实框,我们从位置、长宽比和大小不同的默认框中选择最优匹配。我们首先将每个真实框与具有最佳jaccard重叠的默认框匹配(如MultiBox [7]中所述)。与MultiBox不同,我们将默认框与jaccard重叠高于阈值(0.5)的任何真实框匹配。这简化了学习问题,允许网络预测多个较高重叠的默认框,而不是要求它仅选择具有最大重叠的框。
训练目标:SSD训练目标源自MultiBox目标[7,8],但扩展到处理多个对象类别。设 x i j p = { 0 , 1 } x_{ij}^p=\{0,1\} xijp={0,1}用于将第i个默认框与类别p的第j个真实框匹配的指示符。按照前面的匹配策略,我们有 ∑ i x i j p > 1 \sum_ix_{ij}^p > 1 ∑ixijp>1。最终的损失函数是定位损失(Loc)和置信度损失(Conf)的加权和:
N是对一张图像中的目标而言,被匹配的默认框的数量,如果N=0,则损失为0。定位损失是预测框(l)和真实框(g)参数之间的smooth L1损失[6]。类似于Faster R-CNN [2],我们回归到默认边界框(d)的中心(cx,cy)以及宽度(w)和高度(h)的偏移量。
分类损失就是多类别的softmax交叉熵损失。
参数 α \alpha α是通过交叉验证确定的定位损失和分类损失的相对权重。
选定默认框的大小和长宽比:为了进行多尺度检测,一些算法通过处理不同尺度的输入图像再进行检测结果的组合。然而,通过利用来自单个网络中的若干不同层的特征图进行预测,我们可以模仿相同的效果,同时还在所有对象尺度上共享参数。之前的论文[10,11]已经表明,使用较低层的特征图可以提高语义分割质量,因为较低层捕获输入对象的更精细细节。同样,[12]表明,从特征图中添加全局上下文可以帮助平滑分割结果。在这些方法的推动下,我们使用低层和高层特征图联合进行检测。图1显示了框架中使用的两个示例性特征映射(8×8和4×4)。实际上,我们可以使用更多的特征图。
已知网络内不同层的特征图具有不同大小的(经验)感受野。幸运的是,在SSD框架内,默认框不一定需要与每层的实际感知野相对应。我们设计了默认框的平铺,以便特定的特征图学习响应特定尺度的对象。假设我们想要使用m个特征映射进行预测。每个特征图的默认框的比例计算如下:
s m i n = 0.2 , s m a x = 0.9 s_{min} = 0.2,s_{max} = 0.9 smin=0.2,smax=0.9,即最低层尺度是0.2,最高层是0.9,其余层都是等距离分布。我们对默认框施加不同的宽高比,表示成 a r = { 1 , 2 , 3 , 1 2 , 1 3 } a_r = \{1,2,3,\frac{1}{2},\frac{1}{3}\} ar={1,2,3,21,31}。对每一个默认框,我们计算宽度为 w k a = s k ∗ a k w_k^a=s_k*\sqrt{a_k} wka=sk∗ak,高度为 h k a = s k / a k h_k^a=s_k/\sqrt{a_k} hka=sk/ak。对于长宽比为1的框,我们添加一个单独的尺度 s k ′ = s k s k + 1 s_k^{'}=\sqrt{s_ks_{k+1}} sk′=sksk+1,这样在特征图的每一处得到了6个默认框。设置每一个默认框的中心位置为 ( i + 0.5 ∣ f k ∣ , j + 0.5 ∣ f k ∣ ) (\frac{i+0.5}{|f_k|},\frac{j+0.5}{|f_k|}) (∣fk∣i+0.5,∣fk∣j+0.5), ∣ f k ∣ |f_k| ∣fk∣是第k个方形特征映射的大小, i , j ∈ [ 0 , ∣ f k ∣ ] i,j \in [0,|f_k|] i,j∈[0,∣fk∣]。在实践中,还可以设计默认框的分布以最佳地适合特定数据集。如何设计最佳平铺也是一个悬而未决的问题。
通过结合来自许多特征图的所有位置的具有不同尺度和纵横比的所有默认框,我们具有多种预测结果,涵盖各种输入对象尺寸和形状。例如,在图1中,狗匹配4×4特征图中的默认框,但不匹配8×8特征图中的任何默认框。这是因为8*8特征图中的这些框具有不同的尺度并且与狗的真实框不匹配,因此在训练期间被认为是负样本。
难例挖掘:在匹配步骤之后,大多数默认框都是负样本,尤其是当可能的默认框的数量很大时。这引入了正例和负例数量的显著不平衡。我们不是使用所有的负例,而是按照每个默认框的置信度对各负例默认框进行排序,然后选择较大的那些,使得负数和正数之间的比率最多为3:1。我们发现这可以带来更快的优化和更稳定的训练过程。
数据增强:为了使模型对各种输入大小和形状更加健壮,每个训练图像通过以下选项之一随机采样:
每个采样块的尺寸是原始图像尺寸的[0.1,1],纵横比在1/2和2之间。如果一个目标的中心位于采样块中,我们保留其与真实框的重叠部分。在上述采样步骤之后,除了应用与[14]中描述的类似的一些光度尺度失真之外,每个采样块被缩放为固定大小并且以0.5的概率进行水平翻转。
图3显示SSD可以检测高质量的各种对象类别(大白区)。其大部分自信的检测都是正确的。召回率约为85-90%,并且在“弱”(0.1 jaccard重叠)标准下更高。与R-CNN [22]相比,SSD具有较少的定位误差,表明SSD可以更好地定位对象,因为它直接学习回归对象形状并对对象类别进行分类,而不是使用两个解耦步骤。然而,SSD与类似的对象类别(特别是对于动物)有更多的混淆,部分原因是我们共享多个类别的位置。
图4显示SSD对边界框大小非常敏感。换句话说,它对于小目标的检测比对大目标的检测效果表现更差。这并不奇怪,因为那些小物体甚至可能在最顶层都没有任何信息。增加输入尺寸(例如从300×300到512×512)可以帮助改进检测小物体,但仍有很大的改进空间。从积极的方面来说,我们可以清楚地看到SSD在大型物体上的表现非常出色。并且它对于不同的对象宽高比非常稳健,因为我们使用每个特征映射位置的各种宽高比的默认框。
为了更好地理解SSD,我们进行了对照实验,以检查每个组件如何影响性能。对于所有实验,除了对设置或组件的指定更改外,我们使用相同的设置和输入大小(300×300)。
预测时要在最后使用NMS抑制重叠框。
请注意,大约80%的前向运算时间花费在基础网络上(在我们的例子中是VGG16)。因此,使用更快的基础网络甚至可以进一步提高速度,这也可能使SSD512模型实现实时检测。