SSD论文笔记

论文地址:https://arxiv.org/abs/1512.02325
code地址:https://github.com/weiliu89/caffe/tree/ssd
文章的主要贡献:
We summarize our contributions as follows:
  – We introduce SSD, a single-shot detector for multiple categories that is faster than the previous state-of-the-art for single shot detectors (YOLO), and significantly more accurate, in fact as accurate as slower techniques that perform explicit region proposals and pooling (including Faster R-CNN).
  – The core of SSD is predicting category scores and box offsets for a fixed set of default bounding boxes using small convolutional filters applied to feature maps.
  – To achieve high detection accuracy we produce predictions of different scales from feature maps of different scales, and explicitly separate predictions by aspect ratio.
  – These design features lead to simple end-to-end training and high accuracy, even on low resolution input images, further improving the speed vs accuracy trade-off.
  – Experiments include timing and accuracy analysis on models with varying input size evaluated on PASCAL VOC, COCO, and ILSVRC and are compared to a range of recent state-of-the-art approaches.

  1. 提出SSD算法,一种针对多类别的单次检测器,速度比目前主流的YOLO要快,准确率要高,和目前速度较慢的采用区域提议以及池化技术的网络精度差不多(包括Faster R-CNN)
  2. SSD的核心是使用小的卷积滤波器到特征图上预测类别以及边界框的偏移量
  3. 根据不同尺度的特征图产生不同尺度的预测,并采用不同的纵横比将预测结果分离开
  4. 在PASCAL VOC, COCO, 以及ILSVRC数据集上针对不同尺寸的输入进行时间和精度的分析,并于目前最主流的一系列方法进行比较

网络的核心点:

  1. Multi-scale feature maps for detection
    采用多个特征图进行检测,在基础网络(VGG16)后面加上了若干用于预测的卷积特征层,这些特征层的尺寸逐渐缩小,并且针对每一个特征层用于预测的卷积模型是不一样的
  2. Convolutional predictors for detection
    针对用于预测的特征图使用一系列卷积过滤器能够生成一系列固定的预测结果,对于m x n尺寸的特征图,将filter应用到m x n个位置,它能够产生一个输出值,这个输出值包括该边界框包含某一类目标的score(比如共有c类目标,会得出c+1个score,SSD是要计算背景的得分)以及边界框相对于默认框的位置偏移量,不同于YOLO采用全连接层预测类别分数以及框的位置
    在这里插入图片描述
  3. Default boxes and aspect ratios
    设置不同比率的先验框,在Yolo中,每个单元预测多个边界框,但是其都是相对这个单元本身(正方块),但是真实目标的形状是多变的,Yolo需要在训练过程中自适应目标的形状。而SSD借鉴了Faster R-CNN中anchor的理念,每个单元设置尺度或者长宽比不同的先验框,预测的边界框(bounding boxes)是以这些先验框为基准的,在一定程度上减少训练难度。一般情况下,每个单元会设置多个先验框,其尺度和长宽比存在差异。如图下图所示,可以看到每个单元使用了4个不同的先验框,图片中猫和狗分别采用最适合它们形状的先验框来进行训练
    在这里插入图片描述

网络结构:
如下图为SSD300网络模型图,可以看到ssd是以vgg16作为基础网络的,以conv4_3, conv7, conv8_2, conv9_2, conv10_2, conv11_2作为网络的特征层用来预测目标的的位置以及置信度,对于特征层的每一个位置预测K个bounding boxes, 对于每一个bb预测c个类别置信度以及4个相对于先验框的偏移量,因此对于一个m*n的特征层,总共要预测 m ∗ n ∗ k 个 b b m*n*k个bb mnkbb,以及 m ∗ n ∗ k ∗ ( c + 4 ) m*n*k*(c+4) mnk(c+4)个预测值
在这里插入图片描述
训练过程:

  1. 匹配策略
    在训练过程中,首先要确定训练图片中的ground truth(真实目标)与哪个先验框来进行匹配,与之匹配的先验框所对应的边界框将负责预测它。在Yolo中,ground truth的中心落在哪个单元格,该单元格中与其IOU最大的边界框负责预测它。但是在SSD中却完全不一样,SSD的先验框与ground truth的匹配原则主要有两点。首先,对于图片中每个ground truth,找到与其IOU最大的先验框,该先验框与其匹配,这样,可以保证每个ground truth一定与某个先验框匹配。通常称与ground truth匹配的先验框为正样本(其实应该是先验框对应的预测box,不过由于是一一对应的就这样称呼了),反之,若一个先验框没有与任何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 肯定大于阈值,所以可能只实施第二个原则既可以了,这里的TensorFlow版本就是只实施了第二个原则,但是这里的Pytorch两个原则都实施了
  2. 损失函数
    总损失是置信度损失和位置损失的加权和
      在这里插入图片描述
    位置损失计算:
    在这里插入图片描述
    其中 x i j k x_{ij}^k xijk = {1, 0}作为一个指示器,表明对于类别 k k k i i i个先验框与第 j j j个真实框相匹配,有 ∑ i x i j p ≥ 1 \sum_ix_{ij}^p \geq 1 ixijp1,与Faster R-CNN相同的是,位置损失回归的是先验框的位置偏移量,采用的是Smooth L1损失。 l l l表示的是预测框, g g g表示的是真实框, d d d表示的是先验框

置信度损失采用的是softmax损失函数
在这里插入图片描述
根据交叉验证,权重 α \alpha α的取值为1

  1. 选择合适尺寸和比率的先验框
    先验框的设置,包括尺度(或者说大小)和长宽比两个方面。对于先验框的尺度,其遵守一个线性递增规则:随着特征图大小降低,先验框尺度线性增加:
                  s k = s m i n + s m a x − s m i n m − 1 ( k − 1 ) , k ∈ [ 1 , m ] s_k = s_{min} + \frac{s_{max} - s_{min}}{m-1}(k-1), k\in[1,m] sk=smin+m1smaxsmin(k1),k[1,m]
    其中 m 指的特征图个数,但却是 5 ,因为第一层(Conv4_3层)是单独设置的, s k s_k sk 表示先验框大小相对于图片的比例,而 s m i n 和 s m a x s_{min} 和 s_{max} sminsmax 表示比例的最小值与最大值,paper里面取0.2和0.9。对于第一个特征图,其先验框的尺度比例一般设置为 s m i n / 2 = 0.1 s_{min}/2=0.1 smin/2=0.1 ,那么尺度为 300 × 0.1 = 30 300\times 0.1=30 300×0.1=30 。对于后面的特征图,先验框尺度按照上面公式线性增加,但是先将尺度比例先扩大100倍,此时增长步长为 ⌊ ⌊ s m a x × 100 ⌋ − ⌊ s m i n × 100 ⌋ m − 1 ⌋ = 17 \lfloor \frac{\lfloor s_{max}\times 100\rfloor - \lfloor s_{min}\times 100\rfloor}{m-1}\rfloor=17 m1smax×100smin×100=17 ,这样各个特征图的 s k s_k sk 为 20, 37, 54, 71, 88 ,将这些比例除以100,然后再乘以图片大小,可以得到各个特征图的尺度为 60,111, 162,213,264 ,这种计算方式是参考SSD的Caffe源码。综上,可以得到各个特征图的先验框尺度 30,60,111, 162,213,264 。对于长宽比,一般选取 a r ∈ { 1 , 2 , 3 , 1 2 , 1 3 } a_r\in \{1,2,3,\frac{1}{2},\frac{1}{3}\} ar{1,2,3,21,31} ,对于特定的长宽比,按如下公式计算先验框的宽度与高度(后面的 s k s_k sk 均指的是先验框实际尺度,而不是尺度比例):
                     w k a = s k a r ,   h k a = s k / a r w^a_{k}=s_k\sqrt{a_r},\space h^a_{k}=s_k/\sqrt{a_r} wka=skar , hka=sk/ar
    默认情况下,每个特征图会有一个 a r = 1 a_r=1 ar=1 且尺度为 s k s_k sk 的先验框,除此之外,还会设置一个尺度为 s k ′ = s k s k + 1 s'_{k}=\sqrt{s_k s_{k+1}} sk=sksk+1 a r = 1 a_r=1 ar=1 的先验框,这样每个特征图都设置了两个长宽比为1但大小不同的正方形先验框。注意最后一个特征图需要参考一个虚拟 s m + 1 = 300 × 105 / 100 = 315 s_{m+1}=300\times105/100=315 sm+1=300×105/100=315 来计算 s m ′ s'_{m} sm 。因此,每个特征图一共有 6 个先验框 { 1 , 2 , 3 , 1 2 , 1 3 , 1 ′ } \{1,2,3,\frac{1}{2},\frac{1}{3},1'\} {1,2,3,21,31,1} ,但是在实现时,Conv4_3,Conv10_2和Conv11_2层仅使用4个先验框,它们不使用长宽比为 3 , 1 3 3,\frac{1}{3} 3,31 的先验框。每个单元的先验框的中心点分布在各个单元的中心,即 ( i + 0.5 ∣ f k ∣ , j + 0.5 ∣ f k ∣ ) , i , j ∈ [ 0 , ∣ f k ∣ ) (\frac{i+0.5}{|f_k|},\frac{j+0.5}{|f_k|}),i,j\in[0, |f_k|) (fki+0.5,fkj+0.5),i,j[0,fk) ,其中 ∣ f k ∣ |f_k| fk 为特征图的大小。

  2. Hard negative mining
    尽管文章在前面将与目标框IOU大于0.5的框均设置为正例,一定程度上增加了正例样本的数量,但正负样本差距还是很大,因此,作者采用对负例样本抽样的方法,对置信度误差进行降序排序,选择误差大的那些作为负样本(即预测背景的置信度低),使得正负样本的比率为1:3。

  3. 数据增强
    主要技术要随机水平翻转,随机裁剪,随机采集块域等

模型性能分析:

  1. 与其它方法对比,可以看到SSD300是唯一准确率达到百分之70以上的实时检测方法
    在这里插入图片描述
  2. SSD在不同数据集上的表现
    在这里插入图片描述
  3. 性能提升关键点分析
    Data augmentation is crucial:数据增强是起到了性能提升的关键作用,使用数据增强与不使用性能相差9个百分点
    在这里插入图片描述
    More default box shapes is better:从Tabel2中也可以看出使用更多的先验框能提高性能
    Atrous is faster: 相对于使用整个VGG16网络,使用Atrous方法能提速20%
    Multiple output layers at different resolutions is better:不同分辨率的多个输出层能提高模型的准确率,下图展示了不同特征层对模型性能的影响程度
    在这里插入图片描述
  4. 优缺点
    优点:速度远超Faster R-CNN准确率远超YOLO,速度的提升可以理解为不同与Fasrer R-CNN的双阶段网络,SSD只使用了单一阶段网络,而且不同于YOLO采用全连接层进行预测,SSD使用的是卷积层,其次使用了Atrous算法进一步提速(作者指出,SSD的前馈时间80%花在了基础网络即VGG16网络上,如果使用更快的基础网络可以进一步提高速度)。
    缺点:尽管采用多特征层进行网络的输出,底层预测小目标,高层预测大目标,但是相对于Faster R-CNN来说,SSD对于小目标的检测效果依旧不是很好(可以通过数据增强相应改善),除此之外,SSD需要人为设置先验框,这些都需要调参优化,增加人为工作量。

参考文献
https://arxiv.org/pdf/1611.10012.pdf
https://zhuanlan.zhihu.com/p/33544892

  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值