python ssd目标检测_SSD单次多框目标检测器

SSD(Single Shot MultiBox Detector)原文分享

摘要

我们提出了一种使用单个深层神经网络检测图像中目标的方法。我们的方法,名为SSD,将边界框的输出空间离散化为一组默认框,该默认框在每个特征图位置有不同的宽高比和尺寸。在检测阶段,网络对每个默认框中存在的感兴趣的目标类别产生分数,并对该默认框进行调整以便更好的匹配目标的形状。另外,该网络结合了来自不同分辨率的多个特征图的预测结果,以适应处理各种尺寸大小的目标。我们的SSD模型与那些需要region proposal的方法相比是相对简单的,因为它完全消除了proposal生成和后续的像素或特征重采样阶段,并且把所有计算封装到单个网络中,这使得SSD易于训练且便于直接集成到需要检测组件的系统中。PASCAL VOC、COCO和ILSVRC数据集上的实验结果,证实了SSD相对于那些利用额外的的目标提出步骤的方法相比,具有可比较的准确率,并且速度更快,同时为训练和推理提供统一的框架。对于图像大小为300*300的输入,SSD在VOC2007的测试中以59FPS的速度在Nvidia Titans X上达到了74.3%的mAP,对于500*500的输入。SSD达到了76.9%的mPA,性能优于最先进的Faster R-CNN模型。与其他的单阶段方法相比,SSD即使在输入图像尺寸较小时也有着更好的准确率。

01

引言

目前最先进的目标检测系统是以下方法的变体:假设边界框,对每个框重采样像素或者特征,并应用一个高质量分类器。自选择性搜索方法【1】后,Faster R-CNN【2】在PASCAL VOC、COCO和ILSVRC数据集检测中均取得领先的结果(尽管具有更深的特征,如【3】所示),这种检测流程成为了检测领域的里程碑。尽管这种方法检测准确率很高,但是对于嵌入式系统而言,即使是高端的硬件,这类方法的计算量都太大,另外对于要求实时处理的应用而言处理速度也太慢。通常,这些方法的检测速度是以每帧秒(SPF)来衡量的,即使是最快的高精度检测器Faster R-CNN也仅以每秒7帧(FPS)的速度运行。已经有很多尝试,通过研究处理检测流程中的每个阶段来企图构建更快的检测器(参见第4节中的相关工作),但是到目前为止,显著性的检测速度提升仅以显著性降低检测准确率为代价。

本篇论文提出了第一个基于深层网络的目标检测器,它不需要对边界框假设的像素或特征进行重采样,并且和已有的方法有一样的检测精确度。这对于高精度检测在速度上有显著的提升(在VOC2007测试中,59的FPS,74.3%的准确率,与Faster R-CNN7FPS和73.2%的准确率,以及YOLO的45FPS和63.4%的准确率)。速度根本性的提升来源于消除了边界框提出阶段和后续像素或特征重采样阶段,虽然我们并不是第一个这样做的人(参见文献【4、5】),但是通过增加一系列的改进,我们设法比以前的尝试显著提高了准确性。我们的改进包括使用小的卷积滤波器来预测边界框位置中的目标类别和偏移量,使用单独的预测滤波器进行不同宽高比检测,并将这些滤波器应用于网络后期阶段的多个特征图,以便进行多尺度检测。通过这些改进---特别是使用多层进行不同尺寸的预测---我们可以使用较低的分辨率输入实现高精度,进一步提高检测速度。虽然这些贡献单独看起来都很小,但是我们可以注意到由此产生的系统将PASCAL VOC实时检测的准确率从YOLO的63.4%的mPA提升到我们SSD的74.3%的mPA。相比于最近备受瞩目的残差网络方面的工作【3】,SSD在检测精度上是相对更大的进步。此外,高质量检测速度的显著性提升可以扩大计算机视觉的使用范围。

我们总结我们的贡献如下:

1、我们引用了SSD,一个争对多个类别的单次检测器,比先前最先进的单次检测器YOLO更快,并且检测更准确,事实上和使用region proposal、pooling(包括Faster R-CNN)更慢技术的方法具有相同的检测精度

2、SSD方法的核心是使用小卷积滤波器来预测特征图上一组固定的默认边界框的类别分数和位置偏移

3、为了实现高精度检测,我们从不同特征图上产生不同尺寸的预测,并通过长宽比明确地区分开预测

4、这些设计特性使得即使在低分辨率的输入图像上也能实现简单的端到端的训练和高精度,并进一步的提高检测素的与检测精度之间的平衡。

5、实验包括在PASCAL VOC、COCO和ILSVRC数据集上评估具有不同输入大小的模型时间和精度分析,并和最近的一系列最先进的方法进行对比。

02

单次检测器

本节描述了我们提出的SSD检测框架(2.1节)和相关的训练方法(2.2节)。之后,2.3节展示了数据集特有的模型细节和实验结果。

python ssd目标检测_SSD单次多框目标检测器_第1张图片

图1:SSD框架。(a)在训练阶段,SSD仅需要输入图像和每个目标物体的真实边界框。在卷积处理时,我们在具有不同尺寸(例如图b和图c中的8*8和4*4)的若干特征图的每个位置评估不同长宽比的小集合默认框(比如4个)。对于每一个默认框,我们预测所有目标类别(c1、c2....cp)的位置偏移量和置信度。在训练时,我们首先将这些默认框与真实边界框匹配。例如,两个默认框匹配到猫和狗,这些框记为正样本,其余框视为负样本。整个模型的损失是位置损失(例如平滑L1【6】)和置信损失(例如Softmax)之间的加权和。

03

模型

python ssd目标检测_SSD单次多框目标检测器_第2张图片

图2.SSD和YOLO【5】两个单次检测模型的对比:SSD模型增加了若干个特征层到基础网络的末端,用来预测不同尺寸和不同长宽比的默认框的偏移量,及其相关的置信度。在VOC2007数据集上测试时,输入图像大小为300*300的SSD检测准确率明显优于输入图像大小为448*448的YOLO,另外SSD的检测速度也相对YOLO有所提升。

SSD方法基于前馈神经网络,该网络产生一个固定大小的边界框集合,并对边界框中存在的目标类别实例进行评分,然后通过非极大值抑制步骤来产生最终的检测结果。早期的网络层是基于用于高质量图像分类的标准架构(在任何分类层前被截断),我们可以将其称为基础网络。然后,我们将辅助结构添加到网络结构中,得到具有以下关键特征额检测:

用于检测的多尺寸特征图:我们将卷积特征层添加到截取网络的末端。这些层在尺寸上逐渐减小,并允许在多个尺寸上对检测结果进行预测,用于预测检测的卷积模型在每个特征层上都是不同的(参见文献over feat【4】和YOLO【5】在单尺度特征图上的操作)。

检测的卷积滤波器:每一个添加的特征层(或者任选的来自基础网络的现有特征层)都能通过使用一组卷积滤波器产生一个固定的检测预测集合。这些都在图2的SSD网络架构上指出。对于具有p个通道的大小为m*n的特征层,使用3*3*p的卷积核进行卷积操作,产生目标的类别分数或相对于默认框的坐标偏移。在每个应用卷积核运算的大小为m*n的位置处,产生一个输出值。边界框偏移输出值是相对于每个特征图位置的相对默认框来度量的(YOLO【5】架构中,在该步骤是使用全连接层而不是卷积滤波器)。

默认框和长宽比:对于网络顶端的多个特征图,我们将一组默认边界框与每个特征映射单元相关联。默认框对特征图作卷积运算,使得每个框相对于其对应单元的位置是固定的,对于每一个特征图单元,我们预测单元中相对于默认框形状的偏移量,以及每个框中实例的每类分数。具体来说,对于给定位置的K个默认框中的每一个,我们计算框中C个类别得分和相对于原始默认框形状的4个偏移量。这就导致在特征图的每个位置周围总共应用(C+4)K个滤波器,对于m*n大小的特征图将取得(C+4)K*m*n个输出。有关默认框的说明,请参考图1。我们的默认框和和Faster R-CNN【2】中使用的anchor box是相似的,然而我们将其运用到不同分辨率的若干个特征图中。在多个特征图中使用不同的默认框形状,可以有效地离散可能输出框形状空间。

04

训练

训练SSD和训练使用region proposal(区域提出)的典型检测器之间的关键区别在于,需要将真实边界框的信息分配给固定检测器输出集合中的特定输出。在YOLO的训练和Faster R-CNN以及MultiBox的区域提出阶段,一些版本也需要这样的操作。一旦确定了这个分配,损失函数和反向传播就可以运用到端对端了。训练也设计选择默认框集合和缩放来进行检测,以及难样本挖掘和数据增强策略。

匹配策略:在训练过程中,我们需要确定哪些默认框对应真实边界框检测,并相应的训练网络。对于每个真实边界框,我们从默认框中选择,这些框会在位置、长宽比和尺度上变化。开始时,我们将每个真实边界框与具有最好的jaccard重叠的默认框相匹配,这是MultiBox使用的匹配方法。与MultiBox不同的是,我们将默认框匹配到Jaccard重叠值高于0.5的任何真实边界框。这简化了学习问题,这允许网络为多个重叠的默认框预测高分,而不是只要求具有最大重叠的一个默认边界框。

训练目标:SSD训练目标来自MultiBox,但扩展到处理多个目标类别。设X(ij)^(p) = 1,表示第i个默认框与类别p的第j个真实边界框相匹配。相反的X(ij)^(p)= 0。根据上面的匹配策略,有sum(i) X(i,j)^(p) >=1,这意味可以有多于一个的默认框与第j个真实边界框相匹配。总体的目标函数损失是定位损失(loc)和置信度损失(conf)的加权和:

目标函数:

f4ee78d435f0a062d1de638706025859.png

其中,N是匹配的默认框数量,如果N=0,则将损失置为0。

定位损失:

python ssd目标检测_SSD单次多框目标检测器_第3张图片

定位损失是预测框(l)和真实标签框(g)参数之间的平滑 L1损失(Smooth L1)。类似Faster R-CNN,我们回归默认边界框(d)的中心偏移量(cx,cy)和其框的宽度(w)和高度(h)。权重α设置为1的交叉验证。

注:目标检测的一个目标是希望最后的bounding box(P)和ground truth(G)一致,但是实现方法并不是学习坐标,而是学习变形比例:包括两个部分,一个是对边框(x, y)进行移动,一个是对边框大小(w, h)进行缩放

python ssd目标检测_SSD单次多框目标检测器_第4张图片
python ssd目标检测_SSD单次多框目标检测器_第5张图片

置信损失是在多类别置信度(c)上的Softmax损失:

1249f0746b0adbebba09c33b10ca6705.png

选择默认框的尺寸和长宽比:大多数卷积网络通过加深卷积层数减小特征图的大小,这不仅减少了计算量和储存消耗,而且还提供了一定程度的平移和尺寸不变性。为了处理不同目标尺寸,一些方法【4、9】建议先将图像转换为不同尺寸的图像,然后单独处理每个尺寸图像,最后将结果合并。然而,通过使用单个网络中的若干不同层的特征图来进行预测,我们可以得到相同的效果,同时也可以跨所有目标尺寸共享参数。以前的工作【10、11】已经表明,使用低层的特征图可以提高语义分割的质量,因为低层特征图可以捕获输入目标的更多细节。同样,【12】工作表明,从特征图上添加全局上下文池化操作可以有助平滑分割的结果。受到这些方法的启发,我们可以同时使用较低层的特征图和较高层的特征图进行映射(可以考虑改进SSD)。图一展示了SSD框架中使用的两个特征图的示例(8*8、4*4)。在实际应用中,我们可以使用更多具有小的计算量的特征图。

已知网络中不同层的特征映射具有不同的感受野大小【13】。幸运的是,在SSD框架内,默认框不需要对应于每层的实际感受野。我们设计平铺默认框,使得特定的特征图学习响应于目标的特定尺寸。假设我们需要使用m个特征图进行预测,每个特征图的默认框的尺寸计算如下:

d8c1e48d4eae398d584ea828afa24ad6.png

这意味着最低层具有0.2的尺度,最高层具有0.9的尺度,并且在它们之间的所有层是规则间隔的。我们为默认边界框添加不同的长宽比,表示为αr={1,2,3,1/2,1/3}。我们可以计算每个默认框的宽度和高度:

python ssd目标检测_SSD单次多框目标检测器_第6张图片

对于宽高比为1,我们还增添了一个默认框:,从而使得每个特征图的单元位置有6个默认框,我们将每个默认框的中心设置为:

ac8c4005140536592d79603870090730.png

其中fk是第k个正方形特征图的大小:,随后截取默认框坐标使其始终在【0,1】内。在实践中,也可以设计默认框的分布以最适合特定的数据集。如何设计最佳的平铺方式也是一个悬而未决(可以考虑改进)的事情。

通过组合多个特征图在所有位置的不同尺寸和宽高比的所有默认框的预测,我们就有一组多样化的预测集合,覆盖各个尺寸和形状的输入目标。例如图1中,狗被匹配到一个4*4特征图的默认框,但是不能与8*8特征图的任何默认框匹配。那是因为那些框有不同的尺寸,与狗的真实边界框不匹配,因为在训练期间被认为是负例。

Hard negative mining(难负样本挖掘):在匹配步骤之后,大多数默认框都是负样本,特别是当可能的默认框数量较多时。这导致了训练期间正负样本的严重不均衡。我们使用每个默认框的最高置信度对它们进行排序,并选择前面的那些负样本默认框而不使用所有的负样本,这就使得正负样本之间的比率最多为3:1。我们发现这会导致更快的优化和更稳定的训练。

数据增强:为了使模型对各种输入目标大小和形状具有更强的鲁棒性,每张训练图像都是通过下面选项之一进行随机采样的:

1、使用整个原始输入图像

2、采样一个图像块,使得与目标之间最小的Jaccard重叠为0.1、0.3、0.5、0.9

3、随机采样一个图像块每个采样图像块大小为原始图像大小的【0.1-1】,长宽比在1/2—2之间。如果真实边界框的中心在采样的图像块中,则保留真实边界框与采样图像块的重叠部分。经过上述采样步骤之后,除了应用文献【14】所描述的图片度量变形,将每个采样图像块调整到固定尺寸,并以0.5的概率进行水平翻转。

05

实验结果

基础网络:我们的实验全部是基于VGG16的,它是先在ILSVRC CLS-LOC数据集上预先训练的。类似于DeepLab-LargeFOV【17】,我们将fc6和fc7全连接层转换为卷积层,从fc6和fc7下采样得到参数,并将pool5从2*2-s2更改为3*3-s1,并使用atrous空洞算法【18】来填补“小洞”。我们去除了所有的dropout层和fc8层,并使用SGD对模型进行微调,初始学习率设置为10^-3,动量设置为0.9,权重衰减设置为0.0005.完整的训练和测试代码建立在Caffe上并开源:https://github.com/weiliu89/caffe/tree/ssd.

06

结论

本文介绍了SSD,一种用于多个类别的快速单次对象检测器。模型的一个关键特点是使用多尺度卷积边界框输出附加到网络顶部的多个特征图。这种表示允许我们有效地模拟可能的框形状空间。我们实验验证,给定适当的训练策略,更大量的仔细选择的默认边界框得到了性能的提高。我们建立SSD模型,与现有方法相比,至少相差一个数量级的框预测位置,规模和纵横比[2,5,7]。

给定相同的VGG-16基础架构,SSD在精度和速度方面胜过最先进的对象检测器。我们的SSD500型号在PASCAL VOC和MS COCO的精度方面明显优于最先进的Faster R-CNN[2],速度快了3倍。我们的实时SSD300模型运行在58 FPS,这比当前的实时YOLO[5]更快,同时有显著高质量的检测。

除了它的独立实用程序,完整和相对简单的SSD模型为使用对象检测组件的大型系统提供了一个伟大的组成块。一个有希望的未来方向,是探索其作为使用循环神经网络的系统一部分,用以检测和跟踪视频中对象。

你可能感兴趣的:(python,ssd目标检测,ssd目标检测训练自己的数据)