ssd : Single Shot MultiBox Detector

作者:18届 cyl

日期:2021-08-08

论文:《Single Shot MultiBox Detector》

期刊:ECCV

一、主要问题

1.SSD的检测结构(网络结构与简单的检测过程)
2.SSD如何检测目标(具体的检测过程)
3.SSD的训练过程

二、背景

1.目标检测近年来已经取得了很重要的进展,主流的算法主要分为两个类型:
(1)two-stage方法:以R-CNN系列框架为代表,其主要思路是先通过启发式方法(selective search)或者CNN网络产生一系列候选框,然后对这些候选框进行分类与回归,two-stage方法的优势是准确度高,但是在速度方面离实时效果还比较远。
(2)one-stage方法:以YOLO框架为代表,其主要思路是均匀地在图片的不同位置进行抽样(滑动窗口),然后利用CNN提取特征后直接进行分类与回归,整个过程只需要一步,所以其优势是速度快,但缺陷是每个网格只能预测一个物体,容易造成漏检;且对于物体的尺度相对比较敏感,面对尺度变化较大的物体时泛化能力较差,同时检测精度上不来。
总结来说就是现在流行的目标检测系统大致都是如下步骤:先生成一些假设的 bounding boxes,然后在这些 bounding boxes 中提取特征,之后再经过一个分类器,来判断里面是不是物体,是什么物体(two-stage方法)。但这类方法有一个缺陷,就是所需要的计算时间太久了,不足以进行实时的检测。当然也有很多工作是朝着实时检测的目标迈进,但目前为止,都是牺牲检测精度来换取时间(one-stage方法)。
2.基于上述情况,在提高检测精度的同时兼顾检测速度逐渐成为神经网络目标检测领域的未来趋势,在这个趋势下,SSD成为了继YOLO之后又一个引人注目的目标检测框架,它沿用了YOLO中直接回归Bounding Box和分类概率的方法,同时又参考了Faster RCNN,大量使用anchor来提升识别准确度。通过把这两种结构相结合,SSD保持了很高的识别速度,还能把mAP(平均精度)提升到较高的水平。
在这里插入图片描述

三、检测结构

要了解SSD的目标检测结构,首先得来看一下SSD的网络结构图:
在这里插入图片描述
输入: 300x300的彩色图像。上面的网络一般被称为SSD300,顾名思义就是该网络的输入原图尺寸是300x300的彩色图像。
特征提取部分: 这一部分以VGG16作为基础网络,并将VGG16的两个全连接层换成了普通的卷积层(图中conv6和conv7),之后又接了多个卷积层(conv8_2,conv9_2,conv10_2)以获得更多的特征图用于检测。
输出: 经过最后一层池化之后,会输出8732个预测框(文中称为Default box,与Faster RCNN中的anchor概念是一样的),然后网络会用一组小卷积滤波器对这些预测框进行对象类别和位置偏移的预测(分类和定位),经过NMS(非极大值抑制)算法之后输出检测结果.
这里引出SSD的核心思想->多尺度特征图检测:从网络结构图中可以看到,SSD并不是像yolo那样只使用最后一层输出的结果用于预测,而是将conv4_3、conv7、conv8_2、conv9_2、conv10_2、conv11_2都连接到了最后的检测分类层并输出8732个预测框做预测,原因是通过结合不同层、不同尺寸的feature map来做预测能提高对不同尺度目标的检测准确率。

在这里插入图片描述
上图是多尺度特征图检测的基本过程:
1.首先将一副 300x300 的彩色图像输入到预训练好的分类网络(改进的传统的VGG16 网络)中来获得不同大小的特征图;
2.然后抽取 Conv4_3、Conv7、Conv8_2、Conv9_2、Conv10_2、Conv11_2 层的 feature map ,分别在这些 feature map 上面的每一个单元( feature map cell )构造4个或6个不同尺度的 Default boxes ,这些默认框在每个不同特征图中有着不同的长宽比和尺寸,最后网络对这些默认框进行对象类别和位置偏移的预测。(和 yolo 基本相同)
在这里插入图片描述
3、将不同feature map 获得的Default boxes 结合起来,经过NMS (非极大值抑制)方法来抑制掉一部分重叠或者不正确的Default boxes ,生成最终的Default boxes 集合(即检测结果)。

四、SSD如何检测目标

1.抽取多个卷积层的特征图并同时做分类和位置回归
在这里插入图片描述
上面这张图是Yolo检测目标的经典理解,将一张图片划分为49个格子,每个格子生成2bounding box用于预测。SSD也沿用了这个方法,只不过它是对多张不同尺寸的特征图生成多个默认框(用于生成bounding box)做预测。以下面这张图为例,可以看到,在进行卷积处理时,对不同尺度(这里以8x84x4为例)的特征图的每个单元都设置了4个不同长宽比和尺度的default box,对于每个default box,我们预测对所有对象类别((c 1,c 2,…,c p))相对于真实框的相对位置偏移和置信度(分类和定位)。
在这里插入图片描述
这里简单说一下抽取多个卷积层的特征图同时用于检测目标的好处是浅层的特征图尺寸大,可以划分更多的单元,适合识别尺寸较小的目标,深层的特征图尺寸小,但每个单元产生的box大,适合识别较大的目标。因此,如果我们同时在不同的feature map上面进行目标检测,理论上应该会获得更好的检测效果。
在这里插入图片描述
SSD检测图(a)为例,浅层网络特征图很适合用来识别猫这一目标(蓝色方框),但面对狗这一目标,选框尺寸显得太小无法很好地将目标检测到。而到了深层网络,由于特征图经过池化层后尺寸减小,感受野变大,因此,红色选框可以较准确地识别到狗。
在这里插入图片描述
Default box尺寸的确定
我们刚才说过,不同特征图的每个单元上的default box尺度和长宽比不同,而这部分参数也是人为设定的,文中遵循的原则是:随着特征图大小降低,先验框尺度线性增加 。根据这个原则,default box的尺度计算公式如下:
在这里插入图片描述
这里smin0.2,表示最底层的scale0.2,;smax0.9,表示最高层的scale0.9。(m为特征图的数量)
至于长宽比,论文中用ar表示,共选取了五种长宽比:
在这里插入图片描述
因此每个default box的宽的计算公式为:
在这里插入图片描述
高的计算公式为: (很容易理解宽和高的乘积是scale的平方)
在这里插入图片描述
另外当aspect ratio1时,作者还增加一种scaledefault box
在这里插入图片描述
因此,对于每个feature map cell而言,一共有6default box(有些是4个,没有生成尺度为31/3的框)。
SSD300一共可以预测的default box个数为:
在这里插入图片描述

总结: 可以看出这种default box在不同的特征层有不同的尺度(scale)在同一个特征图层又有不同的长宽比(aspect ratio),因此基本上可以覆盖输入图像中的各种形状和大小的目标。
到这里就完成了SSD检测的第一步,对所有用于检测的特征图生成了各个尺度和长宽比的预测框,接下来就是对这些框进行对象概率预测以及位置回归。
2.用卷积进行检测
yolo是使用全连接提取检测结果(输出7x7x30的张量),而SSD则是采用卷积对不同的特征图提取检测结果。
在这里插入图片描述

可以看到,SSD的检测过程并不复杂,唯一和yolo不同的是SSD对每一层特征图分别采用两个3x3的卷积滤波器进行卷积,这两个滤波器一个输出位置回归用的localization(如果某一层的default box6个,那么就有6x4=24个卷积核,卷积后map的大小和卷积前一样,因为pad=1), 每个default box生成4个坐标值(x,y,w,h)。 另一个输出分类用的confidence,每个default box生成21个confidence(这是针对VOC数据集包含20个对象类别而言的,另外一个是背景的分类)。
在这里插入图片描述
举个例子来说,就是对于在给定位置的k个框中,对每个框我们计算c个类别(包括背景)的置信度和相对于原始默认框的4个偏移量(x,y,w,h)。这使得在特征图中的每个位置需要总共(c+4)k个滤波器,对于m×n特征图产生*(c+4) k * m n**个输出。
**最终的预测输出:m
m
k*(n_label+4)**向量

在这里插入图片描述
(1)n_label个对象分类的概率
这里n_label是指数据集中所有对象的类别数目,SSD与Yolo一样都为20, 所以这里有21个值表示该网格位置存在任一种对象的概率(背景算作一类)。
(2)k个anchor的位置
每个anchor需要4个数值来表示其位置(x,y,w,h), k个anchor共需要4k个数值来表示其位置。这里拆分成了k个单独输出,因此每个输出包括类别(n_label)+4个anchor坐标,即(n_label+4)。每一个这样的单独输出都与一个anchor对应, 即与输入的一个固定的矩形区域对应. 如图所示, 每一个输出, 都对应输入图像的一个anchor.

五、SSD的训练过程

在这里插入图片描述
1.default box匹配
首先,在训练过程中,要确定训练图片中的真实目标(ground truth)与哪个默认框来进行匹配,与之匹配的默认框则负责预测这个对象。在YOLO中,ground truth的中心落在哪个单元格,该单元格中与其IOU最大的边界框负责预测它。但是在SSD 中却完全不一样,SSD的默认框与ground truth的匹配原则主要有两点:
(1)首先,从ground truth出发,寻找与每一个ground truth box有最大IoU的default box,这样能保证每一个ground truth至少能与一个default box对应起来,与guround truth匹配的被称作正样本。反之,若一个默认框没有与任何ground truth进行匹配,那么它只能与背景匹配,被称作负样本。而一个图片中ground truth是非常少的,但default box却很多,如果仅按第一个原则匹配,很多default box会是负样本,正负样本极其不平衡,所以需要第二个原则。
(2)从default box出发,将剩余还没有配对的default box与任意一个ground truth尝试配对,只要两者之间的IoU大于阈值,就进行匹配(SSD 300 阈值为0.5)。这意味着某个ground truth可能与多个default box匹配,这是可以的。但是反过来却不可以,因为一个default box只能匹配一个ground truth,如果多个ground truth与某个default box的 IOU 大于阈值,那么default box只与IOU最大的那个ground truth进行匹配。注意:第二个原则一定在第一个原则之后进行,仔细考虑一下这种情况,如果某个ground truth所对应最大 IOU小于阈值,并且所匹配的default box却与另外一个ground truth的 IOU大于阈值,那么该default box应该匹配谁,答案应该是前者,首先要确保某个ground truth一定有一个default box与之匹配。但是,这种情况基本上是不存在的,由于default box很多,某个ground truth的最大 IOU 肯定大于阈值,所以可能只实施第二个原则就可以了。
到这里,基本就已经完成了正样本和负样本的分类,配对到ground truth的default box就是正样本,没有配对到ground trurh的default box就是负样本,只有正样本才会参与loss的计算。
在这里插入图片描述
2.Hard negative mining:
值得注意的是,一般情况下负样本的数量会远远大于正样本的数量,若是直接训练会导致网络过于重视负样本,从而导致loss不稳定。为了保证正负样本尽量平衡,SSD在训练时采用了hard negative mining方法,即依据confidience loss对default box进行排序,挑选其中confidience loss高的box进行训练,将正负样本的比例控制在positive:negative=1:3。显而易见,用来训练网络的负样本为提取的负样本的子集,那么,我们当然选择负样本中容易被分错类的困难负样本来进行网络训练这样会取得更好的效果。
总结:hard negative mining就是对负样本进行抽样,抽样时按照置信度误差(预测背景的置信度越小,误差越大)进行降序排列,选取误差的较大的top-k作为训练的负样本,以保证正负样本比例接近1:3。
3.loss函数
总体目标损失函数是定位损失(loc)和置信度损失(conf)的加权和:
在这里插入图片描述
可以看到SSD的损失函数与一般的目标检测模型没什么区别,分为两部分: 计算相应的default box与目标类别的confidence loss以及相应的location loss(位置回归)。 其中N是匹配到ground truth的default box数量(正样本),如果N=0,就将损失设为0。 而 α 用于调整confidence loss和location loss之间的比例,默认 α=1。
对于位置误差,采用Smooth L1 loss(与Faster RCNN用的一样),对于置信度误差,其采用softmax loss。
在这里插入图片描述
采用Smooth L1 loss的原因主要是为了从两个方面限制梯度:
(1)当预测框与 ground truth 差别过大时,梯度值不至于过大;
(2)当预测框与 ground truth 差别很小时,梯度值足够小。
softmax损失的特点主要是可以让数值计算更加稳定,因为正指数概率可能会有非常大的值。
在这里插入图片描述
4.数据增强
SSD算法使用了多种数据增强的方法,包括水平翻转、裁剪、放大和缩小等。论文明确指出,数据增强可以明显的提高算法的性能(有实验证明)。主要的目的是为了使得该算法对输入的不同大小和不同形状的目标具有更好的鲁棒性。直观的理解是通过这个数据增强操作可以增加训练样本的个数,同时构造出更多的不同形状和大小的目标,将其输入到网络中,可以使得网络学习到更加鲁棒的特征。
在这里插入图片描述
检测结果对比:
在这里插入图片描述
SSD的优点:
因为同为one-stage方法(单网络),运行速度可以和YOLO媲美,同时对于不同横纵比的object的检测都有效,这是因为算法对于每个feature map cell都使用多种横纵比和不同尺寸的default boxes,这也是本文算法的核心。
SSD的缺点:
1.需要人工设置default boxes的初始尺度和长宽比的值。网络中default boxes的基础大小和形状不能直接通过学习获得,而是需要手工设置。而网络中每一层 feature使用的default box大小和形状恰好都不一样,导致调试过程非常依赖经验。
2.对小尺寸的目标识别仍比较差,还达不到 Faster R-CNN 的水准。这主要是因为小尺寸的目标多用较低层级的特征来训练(因为小尺寸目标在较低层级IOU较大),较低层级的特征非线性程度不够,无法训练到足够的精确度。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

中南大学苹果实验室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值