读论文(3)——SSD

前言

原文名称《SSD:Single Shot MultiBox Detector》,也是一个十分经典的单阶段目标检测方法。从时间上看,这篇论文在YOLO v1之后,YOLO v2之前。因此其实在学完YOLO的三篇论文之后再看这个的顺序其实不太好,因为个人感觉YOLO v2和v3很大程度上SSD的一些东西拿过去又缝补到了YOLO上,这样就没法让我在读SSD时有很惊艳的感觉——因为很多东西感觉似曾相识。但是这样的好处是可以更好地理解这些共同点的有用之处——毕竟在两种方法上都能取得很好的效果。

核心思想

作为单阶段检测算法,SSD也是和YOLO一样同时学习出位置和类别,也是一种回归的思想,但是比起YOLO,SSD本身有三大核心思想:
1.引入多尺度特征图用于目标检测
多尺度检测是SSD的一大特点,但是之前一般的多尺度检测方法大多是先做图像尺度金字塔,然后分别进行检测,最后进行NMS等综合处理。而SSD面对多尺度检测整出了一个新的方法:SSD用不同卷积层的feature map进行综合处理之后也可以实现多尺度检测。SSD这种多尺度检测的思想最后演变成了一种现在非常好用的方法:FPN(特征金字塔),而我们之前读过的YOLO v3也借鉴了SSD的思想,引入了这种方法去做多尺度。这个方法可能乍一看并不感觉十分惊艳,但是其效果非常好。
2.用卷积核进行检测
与YOLO最后采用全连接层输出结果不同,SSD直接采用3×3的卷积核对我们在各个卷积层输出出来的不同的特征图来进行提取检测结果。这样可以更好的综合各个尺度的信息,实现更准确的识别。因此,个人认为,正是“多尺度+小卷积核”这样的组合拳才让SSD面对小目标识别任务比YOLO更为轻松。
3.default box
不同于YOLO的每个cell产生B个bounding box然后任由bounding box野蛮生长,SSD借鉴了R-CNN中的anchor机制,引入了default box。其实default box就是应用于不同特征图、多尺度的anchor。我们可以根据需要检测的目标的特征,认为的对框进行一定的形状约束,这样就可以让整个模型的学习过程变得更快。其实这么看来,YOLO v3基本上把所有的SSD的特色全都缝合进去了。

网络结构

来看一张作者自己在论文中贴出来的SSD和YOLO的网络结构对比图:
在这里插入图片描述
相较于YOLO的以GoogLeNet为蓝本,SSD用的是VGG16做基础模型,然后在VGG16的基础上新增了卷积层来获得更多的特征图以用于检测。从图中也可以很明确的看出SSD用多尺度特征图来做检测。

训练过程

1.标签匹配策略
首先我们需要解决一个问题:怎么将default box和ground truth box匹配起来?
SSD给出的匹配策略是:
先让ground truth box与和其有最大IOU(文章里说的那个指标叫Jaccard overfeat,但是查资料发现就是IOU)的default box配对,然后再将所有与该ground truth box的IOU大于阈值(本文取0.5)的default box与该ground truth box配对。但是需要注意的是,如果一个default box与多个ground truth box都满足阈值配对关系,那么他只和阈值最大的那个ground truth box配对。
一言以蔽之,每个default box最多只与一个IOU最大且满足阈值的ground truth box配对,但每个ground truth box却可以与多个default box配对。
对于上面说的配对成功的default box,我们将其作为是正样本。如果一个default box没有与任何一个ground truth box匹配,那么这个default box我们就叫做负样本。实际上负样本是很多的,因为ground truth box相对于default box的数量还是太少了,尤其是SSD方法还是多尺度的,在一个尺度下可以检测出来的物体在另一个尺度下不一定可以,这种多尺度更造成了负样本数的变多。为了保证正负样本尽量平衡,SSD采用了hard negative mining(难例挖掘),简单概括方法就是:
按照置信度误差(confidence loss)对负样本进行降序排列,选取最大的的num_sel个作为训练的负样本,这样可以通过人为控制num_sel来保证正负样本比例接近1:3。
那么我们怎么衡量置信度误差呢?这就不得不提SSD的损失函数。
SSD将损失函数定义为:
位置误差(locatization loss)与置信度误差(confidence loss)的加权和。
具体写作:
在这里插入图片描述
其中N是是先验框的正样本数量。 α \alpha α是权值,交叉验证后的结果将其设为了1。c为类别置信度预测值。l为先验框的所对应边界框的位置预测值,而g是ground truth的位置参数。我们再把每一项拆开,有:
在这里插入图片描述
在这里插入图片描述
其中 x i j p x_{ij}^{p} xijp取0或1,取1时表示时表示第i个default box与第j个ground truth匹配,且ground truth的类别为p。
可以看出,置信度误差采用softmax loss(可以看这篇:https://blog.youkuaiyun.com/luoxuexiong/article/details/90062937),而定位误差则是采用了Smooth L1 loss(可以看这篇:https://blog.youkuaiyun.com/yang_daxia/article/details/91360606),其公式如下所示:
在这里插入图片描述
注:上文的default box在原文里用的词是prior box。prior box和default box我在这里混用了因为二者意义取别不大,如果硬要区别,可以理解为default box是抽象类,而prior box是具体实例。

2.default box的尺寸
我们现在知道了如何取匹配default box和ground truth box,那么我们应该如何预先设置default box的尺寸来实现更好的匹配呢?
文章给出一个计算公式用来衡量scale(尺度):
在这里插入图片描述在这里,smin是0.2,smax是0.9,意味着最底层是0.2,最高层是0.9,期间所有的层按规律递增。
然后对于aspect ratio(长宽比),文章给出了一个取值范围,注意这里有五种长宽比可以选择:
在这里插入图片描述
然后知道尺度与长宽比我们就可以计算宽高了,计算方法如下:
在这里插入图片描述
在这里插入图片描述
可以看出宽高的乘积就是尺度的平方。当aspect ratio为1时,作者还增加一种scale的default box,定义为:
在这里插入图片描述
因此,对于每个feature map的cell而言,一共可以有6种default box。
确定完宽高后,文章用如下公式确定每个default box的中心:
在这里插入图片描述
其中|fk|是第k个特征图的尺寸,在实际中,为了适应特定的数据集,也可以设置不同尺度与长宽比的默认框,如何最优的设计这些其实也是一个开放的问题。
这种default box的设计思想,在不同的feature层有不同的scale,在同一feature层又有不同的aspect ratio,这样就可以实现基本检测出不同尺度下的目标。

3.数据增广
作者模型分析部分,首先指出:数据增广是关键。数据的增广可以让模型学习出更好的性能。SSD所采用的增广方式主要是采样。
对每一张输入图像,随机选择三种方法中的一个进行处理:
(1)直接输入原始图像
(2)采样一个片段,使得与目标物体的最小的IOU为0.1,0.3,0.5,0.7,0.9之一
(3)随机采样一部分
每个采样部分的大小为原图的[0.1,1],长宽比在1/2和2之间。如果真实标签框的中心位于采样部分内,则保留重叠部分。之后将各部分改成同样大小,然后以0.5的概率进行水平翻转,并做一些颜色扭曲等操作。
经过这样的处理就可以使模型对不同大小、形状、颜色的输入目标更具鲁棒性。

小总结

个人认为SSD最大的贡献就在于这个利用多尺度特征图进行多尺度检测的思想,这个方法为多尺度检测提供了一个全新的思路,并且至今都有很好的活力与生命力。除此之外,SSD也将anchor机制引入了单阶段目标检测方法中,为后来的很多方法提供了参考。不得不说,SSD的全部思想基本上到后面都被YOLO在更新中全盘吸收了,而且就性能上来说,他比v1版本的YOLO更快、更准,这在当时是十分难得的。因此,我们完全可以说,SSD也是目标检测中一个里程碑式的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值