内容来源于:
https://blog.csdn.net/cdknight_happy/article/details/91994312
https://blog.csdn.net/xiaohu2022/article/details/79833786
https://blog.csdn.net/thisiszdy/article/details/89576389
包括整理!
论文:https://arxiv.org/abs/1512.02325
代码:https//github.com/weiliu89/caffe/tree/ssd

SSD: Single Shot MultiBox Detector

摘要

我们提出了一种使用单个深度神经网络进行图像中目标检测的方法。我们的方法名为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也具有更高的精度。

1 引言

目标检测近年来已经取得了很重要的进展,主流的算法主要分为两个类型:(1)two-stage方法,如R-CNN系列算法,其主要思路是先通过启发式方法(selective search)或者CNN网络(RPN)产生一系列稀疏的候选框,然后对这些候选框进行分类与回归,two-stage方法的优势是准确度高,缺点是速度慢;(2)one-stage方法,如Yolo系列和SSD,其主要思路是均匀地在图片的不同位置进行密集抽样,抽样时可以采用不同尺度和长宽比,然后利用CNN提取特征后直接进行分类与回归,整个过程只需要一步,所以其优势是速度快,但是均匀的密集采样的一个重要缺点是训练比较困难,这主要是因为正样本与负样本(背景)极其不均衡(参见Focal Loss),导致模型准确度稍低。不同算法的性能如图1所示,可以看到两类方法在准确度和速度上的差异。
目标检测:SSD Single Shot MultiBox Detector
图1 不同检测算法的性能对比

本文讲解的是SSD算法,其英文全名是Single Shot MultiBox Detector,Single shot指明了SSD算法属于one-stage方法,MultiBox指明了SSD是多框预测,其效果与Faster R-CNN一样准确,速度却快。

图2给出了不同算法的基本框架图,对于Faster R-CNN,其先通过CNN得到候选框,然后再进行分类与回归,而Yolo与SSD可以一步到位完成检测。

SSD相比于Yolo的改变:SSD采用CNN来直接进行检测,而不是像Yolo那样在全连接层之后做检测;SSD提取了不同尺度的特征图来做检测,大尺度特征图(较靠前的特征图)可以用来检测小物体,而小尺度特征图(较靠后的特征图)用来检测大物体;SSD采用了不同尺度和长宽比的先验框(Prior boxes, Default boxes,在Faster R-CNN中叫做锚,Anchors)。Yolo算法缺点是难以检测小目标,而且定位不准,但是这几点重要改进使得SSD在一定程度上克服这些缺点。
目标检测:SSD Single Shot MultiBox Detector
图2 不同算法的基本框架图

2 SSD

2.1 设计理念

SSD设计理念总结为以下三点:

(1)采用多尺度特征图用于检测

多尺度采用大小不同的特征图,CNN网络一般前面的特征图比较大,后面会逐渐采用stride=2的卷积或者pool来降低特征图大小。这样做的好处是比较大的特征图来用来检测相对较小的目标,而小的特征图负责检测大目标,如图3所示,8x8的特征图可以划分更多的单元,但是其每个单元的先验框尺度比较小。
目标检测:SSD Single Shot MultiBox Detector
图3 不同尺度的特征图

(2)采用卷积进行检测

SSD直接采用卷积对不同的特征图来进行提取检测结果。对于形状为m×n×p的特征图,只需要采用3×3×p这样比较小的卷积核得到检测值。

(3)设置先验框

SSD借鉴了Faster R-CNN中anchor的理念,每个单元设置尺度或者长宽比不同的先验框,预测的边界框(bounding boxes)是以这些先验框为基准的,在一定程度上减少训练难度。一般情况下,每个单元会设置多个先验框,其尺度和长宽比存在差异,如图4所示,可以看到每个单元使用了4个不同的先验框,图片中猫和狗分别采用最适合它们形状的先验框来进行训练。
目标检测:SSD Single Shot MultiBox Detector
图4 SSD的先验框

SSD的特征图将输入图像分成m*n个小格,每个小格有k个先验框,每个先验框预测c个类别的置信度和4个坐标修正值(cx,cy,w,h)(cx,cy,w,h)(跟RCNN一样),每个特征图有 mnk(c+4)mnk(c+4)个预测值。

2.2 网络结构

目标检测:SSD Single Shot MultiBox Detector
图5 SSD网络结构

(1)修改VGG基础网络

*SSD采用VGG16作为基础模型,VGG16是在ILSVRC CLS-LOC数据集预训练;
*将VGG16的全连接层fc6和fc7转换成3×3卷积层conv6和1×1卷积层conv7;
*移除dropout层和fc8层,并新增一系列卷积层,在检测数据集上做finetuing;
*池化层pool5由原来的2×2−s2变成3×3−s1;
*采用Atrous算法,在Conv6采用3×3,dilation rate=6的扩展卷积。扩展卷积是在不增加参数与模型复杂度的条件下指数级扩大卷积的视野,使用扩张率参数来表示扩张的大小。如下图6所示,(a)普通的3×3卷积,视野是3×3;(b)扩张率为2,视野是7×7;©扩张率为4,视野是15×15,视野特征更稀疏。
目标检测:SSD Single Shot MultiBox Detector
图6 扩展卷积

(2)抽取Conv4_3、Conv7、Conv8_2、Conv9_2、Conv10_2、Conv11_2层的特征图实现多尺度,大小分别是38x38x512、19x19x1024、10x10x512、5x5x256、3x3x256、1x1x256。Conv4_3之后的feature map默认的box是4个,即在38x38的这个平面上的每一小格上面获得4个box,总共可以获得38x38x4=5776个;同理,依次将FC7、Conv8_2、Conv9_2、Conv10_2和Conv11_2的box数量设置为6、6、6、4、4,分别可以获得的box为2166、600、150、36、4,总共8732个box。

细节注意:conv4_3层特征图大小是38×38,但是该层比较靠前,其norm较大,所以在其后面增加了一个L2 Normalization层,以保证和后面特征图差异不是很大。L2 Normalization和Batch Normalization不太一样,L2 Normalization仅仅是对每个像素点在channl维度做归一化,而Batch Normalization是在[batch_size, width, height]三个维度上做归一化。

(3)先验框的生成规则

先验框的设置分成尺度和长宽比两个方面。对于先验框的尺度,遵循线性递增规则,即特征图大小降低,先验框尺度线性增加。
目标检测:SSD Single Shot MultiBox Detector
其中,sks_k表示先验框大小相对于图像的比例;smin,smaxs_{min},s_{max}表示比例的最大值和最小值,论文中取0.2和0.9;mm表示特征图总数,为5(conv4_3层单独设置,不算它)。对于conv4_3层的特征图,先验框尺度比例一般设置为smin/2=0.1s_{min}/2=0.1,即3000.1=30300*0.1=30

对于先验框的长宽比,一般选取ar1,2,3,1/2,1/3a_r∈{1,2,3,1/2,1/3},按如下公式计算先验框的宽度与高度(这里的sks_k指先验框的实际尺度,不是尺度比例)。
目标检测:SSD Single Shot MultiBox Detector
目标检测:SSD Single Shot MultiBox Detector
(4)得到了特征图之后,需要对特征图进行卷积得到检测结果,检测值包含两个部分:类别置信度和边界框位置,各采用一次3×3卷积来进行完成。令nkn_k为该特征图所采用的先验框数目,那么类别置信度需要的卷积核数量为nk×cn_k×c,边界框位置需要的卷积核数量为nk×4n_k×4最后经过NMS来抑制掉一部分重叠或者不正确的bbox,得到检测结果。

2.3 训练过程

(1)先验框匹配

在训练过程中,首先要确定训练图片中的ground truth(真实目标)与哪个先验框来进行匹配,与之匹配的先验框所对应的边界框将负责预测它。在Yolo中,ground truth的中心落在哪个单元格,该单元格中与其IOU最大的边界框负责预测它。但是在SSD中却完全不一样,SSD的先验框与ground truth的匹配原则主要有两点。首先,对于图片中每个ground truth,找到与其IOU最大的先验框,该先验框与其匹配,这样,可以保证每个ground truth一定与某个先验框匹配。通常称与ground truth匹配的先验框为正样本,反之,若一个先验框没有与任何ground truth进行匹配,那么该先验框只能与背景匹配,就是负样本。一个图片中ground truth是非常少的, 而先验框却很多,如果仅按第一个原则匹配,很多先验框会是负样本,正负样本极其不平衡,所以需要第二个原则。第二个原则是:对于剩余的未匹配先验框,若某个ground truth的IOU大于某个阈值(一般是0.5),那么该先验框也与这个ground truth进行匹配。这意味着某个ground truth可能与多个先验框匹配,这是可以的。但是反过来却不可以,因为一个先验框只能匹配一个ground truth,如果多个ground truth与某个先验框IOU大于阈值,那么先验框只与IOU最大的那个先验框进行匹配。第二个原则一定在第一个原则之后进行,仔细考虑一下这种情况,如果某个ground truth所对应最大IOU小于阈值,并且所匹配的先验框却与另外一个ground truth的IOU大于阈值,那么该先验框应该匹配谁,答案应该是前者,首先要确保某个ground truth一定有一个先验框与之匹配。但是,这种情况我觉得基本上是不存在的。由于先验框很多,某个ground truth的最大IOU肯定大于阈值,所以可能只实施第二个原则既可以了。

尽管一个ground truth可以与多个先验框匹配,但是ground truth相对先验框还是太少了,所以负样本相对正样本会很多。为了保证正负样本尽量平衡,SSD采用了hard negative mining,就是对负样本进行抽样,抽样时按照置信度误差(预测背景的置信度越小,误差越大)进行降序排列,选取误差的较大的top-k作为训练的负样本,以保证正负样本比例接近1:3。

(2)损失函数

损失函数定义为位置误差(locatization loss, loc)与置信度误差(confidence loss, conf)的加权和:
目标检测:SSD Single Shot MultiBox Detector
其中,NN是对一张图像中的目标而言,被匹配的默认框的数量,如果N=0,则损失为0;xijp1,0x_{ij}^p∈{1,0}为指示函数,为1时表示第ii个先验框与第jj个ground truth匹配,且类别为pp,按照前面的匹配策略,有ixijp>1∑_ix_{ij}^p>1cc为类别置信度预测值;aa用于调整confidence loss和location loss之间的比例,默认1;ll为先验框和ground truth的位置修正值,预测的;gg为先验框和ground truth的位置修正值,真实的。

对于位置误差,采用Smooth L1 loss,定义如下:
目标检测:SSD Single Shot MultiBox Detector
对于置信度误差,采用softmax loss,定义如下:
目标检测:SSD Single Shot MultiBox Detector
(3)数据增强
采用数据增强可以提升SSD的性能,主要采用的技术有水平翻转(horizontal flip),随机裁剪加颜色扭曲(random crop & color distortion),随机采集块域(Randomly sample a patch)(获取小目标训练样本),如下图所示:
目标检测:SSD Single Shot MultiBox Detector

2.4 预测过程

对于每个预测框,首先根据类别置信度确定其类别(置信度最大者)与置信度值,并过滤掉属于背景的预测框。然后根据置信度阈值(如0.5)过滤掉阈值较低的预测框。对于留下的预测框进行解码,根据先验框得到其真实的位置参数(解码后一般还需要做clip,防止预测框位置超出图片)。解码之后,一般需要根据置信度进行降序排列,然后仅保留top-k(如400)个预测框。最后就是进行NMS算法,过滤掉那些重叠度较大的预测框。最后剩余的预测框就是检测结果了。

3 实验结果

3.1 在VOC上的效果

下图显示了SSD可以检测高质量的各种对象类别(大白区)。其大部分自信的检测都是正确的。召回率约为85-90%,并且在“弱”(0.1 jaccard重叠)标准下更高。与R-CNN [22]相比,SSD具有较少的定位误差,表明SSD可以更好地定位对象,因为它直接学习回归对象形状并对对象类别进行分类,而不是使用两个解耦步骤。然而,SSD与类似的对象类别(特别是对于动物)有更多的混淆,部分原因是我们共享多个类别的位置。
目标检测:SSD Single Shot MultiBox Detector
下图显示了SSD对边界框大小非常敏感。换句话说,它对于小目标的检测比对大目标的检测效果表现更差。这并不奇怪,因为那些小物体甚至可能在最顶层都没有任何信息。增加输入尺寸(例如从300×300到512×512)可以帮助改进检测小物体,但仍有很大的改进空间。从积极的方面来说,我们可以清楚地看到SSD在大型物体上的表现非常出色。并且它对于不同的对象宽高比非常稳健,因为我们使用每个特征映射位置的各种宽高比的默认框。
目标检测:SSD Single Shot MultiBox Detector

3.2 性能评估

消融实验:为了更好地理解SSD,我们进行了对照实验,以检查每个组件如何影响性能。对于所有实验,除了对设置或组件的指定更改外,我们使用相同的设置和输入大小(300×300)。表中可以得出如下结论:数据扩增技术很重要,对于mAP的提升很大;使用不同长宽比的先验框可以得到更好的结果。
目标检测:SSD Single Shot MultiBox Detector
同样的,从表中看出,采用多尺度的特征图用于检测也是至关重要的
目标检测:SSD Single Shot MultiBox Detector
SSD在VOC2007,VOC2012及COCO数据集上的性能,如下所示。相比之下,SSD512的性能会更好一些。加*的表示使用了数据增强技巧来提升SSD在小目标上的检测效果,所以性能会有所提升。
目标检测:SSD Single Shot MultiBox Detector
SSD与其它检测算法的对比结果(在VOC2007数据集)如下所示,基本可以看到,SSD与Faster R-CNN有同样的准确度,并且与Yolo具有同样较快地检测速度
目标检测:SSD Single Shot MultiBox Detector