SSD与yolov1的对比

yolo系列和ssd发表的时间顺序是yolov1,ssd,yolov2,yolov3,当然现在yolov4也出现了。这个是我之前在看完yolov1之后阅读ssd论文的时候记录的笔记,因此会涉及到很多和yolov1实现的对比。

一、简单的介绍

fast rcnn系列的模型的套路:
1.使用事先设定的bounding boxes,

  1. 对每个boxes重新采样像素或者特征,
  2. 应用一个高质量的分类器。
    缺失是太慢了。想要提高速度就必然需要降低准确率。


    1.png

    SSD是一种不需要对每个假定的bounding boxes重新采样像素或者特征同时可以保证准确率的方法。
    Our improvements include using a small convolutional filter to predict object categories and offsets in bounding box locations, using separate predictors (filters) for different aspect ratio detections, and applying these filters to multiple feature maps from the later stages of a network in order to perform detection at multiple scales. With these modifications—especially using multiple layers for prediction at different scales—we can achieve high-accuracy using relatively low resolution input, further increasing detection speed.
    ssd对低分辨率图像也可以有一个比较好的识别效果,提供了一个速度和准确率的trade-off。

和fasterRCNN区别是没有使用RPN和Pooling操作

论文的贡献:
1. 引入了一种单阶段的检测器,比以前的算法YOLOv1更准更快,并没有使用RPN和Pooling操作;
2. 使用一个小的卷积滤波器应用在不同的feature map层从而预测BB的类别的BB偏差;
3. 可以在更小的输入图片中得到更好的检测效果(相比Faster-rcnn);
4. 在多个数据集(PASCAL、VOC、COCO、ILSVRC)上面的测试结果表明,它可以获得更高的mAp值;

二、SSD的模型

整个是一个基于前向反馈的卷积网络,SSD模型最终提供一个固定大小的bounding boxes集合以及这些bounding boxes是否存在分类物品的得分的集合,通常在模型之后,添加了一个非极大抑制步骤来提供最终的检测结果。


ssd2.png

主干网络backbone network
主干网络是基于VGG的, 是一个高质量的分类网络,把这个基础模型作为ssd的前面层,用于给后面的层提供高质量的图片分类,我们称这个层为基础网络,注意这个基础模型在使用的时候,需要截去最后面的分类层。在这里使用的VGG16网络。然后添加辅助的结构来 提供最终的检测功能。

主干网对VGG16的修改:
1. 将VGG16的FC6和FC7层转化为卷积层,如图1上的Conv6和Conv7;
2. 去掉所有的Dropout层和FC8层;
3. 添加了Atrous算法(hole算法),参考该链接;
4. 将Pool5从2x2-S2变换到3x3-S1;


ssd1.png

最终的检测功能的实现依赖于下面提到的关键技术:

1. 多尺度的特征图Multi-scale feature maps for detection。

在基础网络之后,添加了很多个卷积层,卷积层不断的减小特征图的宽高尺寸,比如从88经过一层卷积之后就变成44了。然后在这些特征图上都应用目标检测算法。正如上面那张图所示,对于前面一层来说,相当于是在一个比较小的88的尺度上,对每个位置检测4个固定横纵比的bounding box,而对于后面一层来说,就是在一个相对较大的44尺寸上对每个位置检测4个固定横纵比的bounding box。这样就实现了在多尺度特征图上检测的目的。

2.png

图中的所有信道的对应位置的像素点集合被认为是一个anchor,那么对于每个anchor就会有N个比率的bounding box,需要注意的是,每一层的bounding box数量不一定是一样的。

2. 检测目标的卷积预测器Convolutional predictors for detection

我们从feature layer或者说feature map上抽取特征。feature layer可能是基础网络上面的某一层,也可以是在基础网络后面添加的卷积层。对于一个 m x nxc的feature layer,使用一个3x3xp的核过滤器(small kernel),那么对于每一个输出的pixel,都可以得到一个channel数为p大小的检测结果,一般p=4(|Classes|+4)大小,最终可以得到mnp大小的检测结果。这个检测结果中包含了每个位置的分类物品出现的置信度以及四个表示位置和偏移的(cx,cy,w,h)。因为设置了bounding box的数量为4,所以结果是4(|Classes|+4).
需要注意到这里使用的卷积预测器而不是全连接层(yolov1使用的是全连接层)。

默认的boxes和横纵比Default boxes and aspect ratios

这里的bounding box的概念类似于Faster R-CNN中的anchor boxes.但是这里不同的feature map层可以安排不同形状和数量的bounding box。,这样可以有效的离散化可能的输出box的空间(想象一下,如果每个feature map的bounding box长的差不多,那么得到的可能差异只在大小上,我们需要的是不同大小和形状的box来拟合真实的物品的坐标,因此box越多样越好。


3.png

三、训练

The key difference between training SSD and training a typical detector that uses region proposals, is that ground truth information needs to be assigned to specific outputs in the fixed set of detector outputs.

把真实的物品坐标框称为ground truth,对于一张图片,在经过SSD模型的各层检测,会有8732个prior box(也就是检测结果),需要标记这些检测结果中,哪些是正样本,那些是负样本。 这些标记过程都是在训练之前做好的;不同层的default box的数量和大小也是在训练钱都确定好的;还需要准备好难负例挖掘的策略。

1. 匹配策略 matching strategy:

对于打标的真实框GT,需要选择哪个预测框是与真实框对应的。这里选择是jaccard overlap>0.5的所有默认框。这样正负样本就不会很悬殊。Multibox论文中则只会选择jaccard overlap最高的一个框框。

个人理解中,这里的预测框是指没有偏移变化的预测框prior box,也叫先验框(prior box)。在GT确定、输入图像尺寸固定、prior box确定之后,就可以得到jaccard overlap>0.5的所有先验框。然后学习的时候,这些正例需要根据ground truth进行偏移和长宽比缩放的学习。而其他负例则不需要学习位置参数。

jaccard overlap

为图像的面积的交并比.


4.png

下面是来自参考文献的关于匹配策略的叙述:

在训练过程中,首先要确定训练图片中的ground truth(真实目标)与哪个先验框来进行匹配,与之匹配的先验框所对应的边界框将负责预测它。

在Yolov1中,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一定有一个先验框与之匹配。

2. 训练目标,也就是损失函数的定义

损失函数是回归损失和置信度损失的加权平均


5.png

下面是位置回归损失函数的介绍,看着就很晕。


6.png

N表示匹配的框,应该可以理解为正样本框。首先g表示是ground truth box的各个指标,d是先验框的各个指标,l是预测结果的各个指标。g^ 这个是根据g和d得到的可以和预测结果匹配计算损失函数的指标。比如g^cx 这个指标,是归一化的横坐标偏移指标,因为先验框的中心不会完全和ground truth的中心重合,因此计算实际的偏移量。这个值就是我们希望模型学习到的值。同理,先验框的宽度也不会完全重合ground truth的宽度,我们用log函数来计算g^w,这也意味着我们希望学习到的宽度也是这种变换的。

smoothL1损失函数长这样:


7.png

分类的置信度损失函数如下,正样本的softmax loss函数以及负样本的背景置信度损失.


8.png

选择默认的bounding box的缩放尺度和角度比率

在某些论文的方法中,为了获得不同缩放的图片的结果,通过现将图片缩放在不同的尺度然后在最后将每个缩放尺度的结果组合起来。而在这篇论文中使用的方式是使用同一个网络中的不同层上抽取的feature map来获得和上面的缩放效果一样的结果。

我觉得这个idea真的很赞,超级赞。这样不仅仅可以利用参数共享,而且很方便。已经有研究表明使用前面层的feature map可以优化语义分段质量semantic segmentation quality,因为前面的层可以获得更多的细节的优质的关于输入的信息。


10.png

这张图上有两个feature map。我们知道网络的不同层有不同的感受野。在SSD中,bounding box的大小不需要匹配对应层的感受野。我们设计了bounding box的尺寸规则,这样每个feature map就可以自己计算。
如果我们使用m个feature map,其中1表示较低层,m表示叫高层。bounding box的默认尺度按照如下的计算公式计算


11.png

bounding box的横纵比尺度为


12.png

这里的bounding box的横纵比是固定的,作者提到也可以设计特定的bounding box的横纵比分布来更好的适应数据集,这不就是yolov2做的事情吗?yolov2使用聚类的方式得到了5个适应数据的横纵比尺寸,然后发现5个bounding box的平均IOU已经和9个anchor box的IOU值接近了。

4. hard negative mining

什么是hard negative mining:
【1】对于目标检测中我们会事先标记处ground truth,然后再算法中会生成一系列proposal,这些proposal有跟标记的ground truth重合的也有没重合的,那么重合度(IOU)超过一定阈值(通常0.5)的则认定为是正样本,以下的则是负样本。
【2】然后扔进网络中训练。However,这也许会出现一个问题那就是正样本的数量远远小于负样本,这样训练出来的分类器的效果总是有限的,会出现许多false positive,把其中得分较高的这些false positive当做所谓的Hard negative,既然mining出了这些Hard negative,就把这些扔进网络得到类别的损失函数,将这些难负样本的损失函数作为背景损失函数,从而加强分类器判别假阳性的能力。

绝大部分的bounding box最后匹配出来是没有物品的,这样会导致负样本和正样本严重失衡。SSD这里没有使用全部的负样本,而是对每个负样本的bounding box根据其confidence loss排序,然后选择最大的一批作为负样本,这样是的负样本和正样本的比率稳定在3:1。实践证明,这样的方式是的优化的碎度更快,训练也更加稳定。

5. 数据的扩充策略

数据的扩充策略中数据来自于以下三种之一

  1. Use the entire original input image.
  2. Sample a patch so that the minimum jaccard overlap with the objects is 0.1, 0.3,
    0.5, 0.7, or 0.9.
  3. Randomly sample a patch.
    采样的图片大小占原始尺寸的(0.1,1)之间,横纵比在(0.5,2)之间。如果物体的中心在采样图片中,那么会保持物品框的覆盖范围。

实验结果

1. 简单概述

base netowrk是VGG16。SSD300的模型就是上面那张结构图所示。新的层的初始化使用xavier方式(https://zhuanlan.zhihu.com/p/22028079, https://zhuanlan.zhihu.com/p/22044472)。实验认为和RCNN相比,SSD在定位localization上更加优秀,因为在神经网络模型中直接学习回归了物品的形状。但是SSD很容易有分类错误问题,尤其是类似的类别(比如动物)。SSD对bounding box的大小很敏感,也就是说,小物体的表现不如大物体。结合模型来看,因为小物体的预测使用的是网络的前面的层,而前面的层并没有很多的信息。虽然存在上面的问题,但是SSD在大物体上的表现很好,二千对于不同横纵比的物体的性能鲁棒。

模型分析

下面这张图展示了ssd中的哪些技术使得性能得到了提升。


13.png

性能提升的贡献:

  1. 扩充数据,这点yolov1也受益其中.

  2. 使用更多的box的形状,[1/2,2]和[1/3, 3]box可以在一定程度上提升算法的性能

  3. 使用了atrous方法:其实就是conv6采用扩展卷积或带孔卷积(Dilation Conv),其在不增加参数与模型复杂度的条件下指数级扩大卷积的视野,其使用扩张率(dilation rate)参数,来表示扩张的大小,如下图6所示,(a)是普通的 3\times3 卷积,其视野就是 3\times3 ,(b)是扩张率为2,此时视野变成 7\times7 ,(c)扩张率为4时,视野扩大为 15\times15 ,但是视野的特征更稀疏了。Conv6采用 3\times3 大小但dilation rate=6的扩展卷积。


    14.png

    atrous算法可以轻微提升算法性能,但是其主要的作用是用来提速,论文中表明它可以提速20%。主要的原因可能是虽然该算法可以获得更大的feature map和接收场,但是由于SSD本身利用了多个feature map来获取BB,BB的多样性已经足够,由于feature map扩大而多得到的BB可能是一些重复的,并没有起到提升检测性能的作用。

  4. 使用了不同分辨率的feature maps,并且关注边界上的框框。


    15.png

SSD是如何提升小物体的检测准确率的:通过数据扩充


16.png

SSD为什么速度快?

SSD用的是VGG16(但去掉了fc层加速)而YOLO普通版有24个卷积层。
SSD的输入尺寸较小(300300),而YOLO是448448,即使网络结构类似计算量差距还是挺明显的,速度快一点正常。
ssd全靠卷积完成,而yolo里还有全连接,用上gpu的话肯定是ssd快

与yolov1的比较

  1. yolov1和fastrcnn都是在一个固定的最终的feature map上检测bounding boxes的。而SSD使用卷积层,在多个尺度上面检测了bouding boxes.这样就解释了为什么对于同一张图中有不同尺寸的物品都可以很好的检测的原因。
  2. yolov1使用googlenet网络作为基础网络,而ssd使用vgg作为基础网络。按照时间,vgg要早于googlenet出现。两者的区别是
  3. boudning box,在ssd中,bounding box的数量是4或者6.而yolov1只有2.
  4. 正负样本的选择。在yolo v1中,中心点落在哪个网格中,则该网格负责该物品检测。在训练的时候,在一个网格中会有多个bounding box,那么每个预测的bounding box的IOU和真实框框较大的为正样本。在调节正负样本比率对损失函数的影响的时候,yolov1通过将负样本设置一个比较小的平方损失系数实现。


    17.png

在ssd中,首先每个真实物品都先选择一个负责它的bounding box,在没有训练指之前,因为prior bounding box的位置都是确定的,所以选择IOU最大的为正样本。为平衡正负样本的比率,将IOU大于0.5的prior bounding box都设置为正样本。这样模型就更加稳定了。

  1. ssd全部使用卷积层,因此对于输入的图片大小没有限制。yolo因为后面有全连接层,因此输入的图片大小有限制。
  2. 损失函数的不同,yolov1全部使用均方损失函数,而ssd对位置损失使用的是smoothL1损失,对于置信度损失,使用的是softmax损失。
    7 在yolov1中,预测x,y,w,h这几个位置参数得时候,x,y是相对于网格(一共有7x7个网格)的左上角的偏移量,w,h是相对于这个图像的大小占比。这两个参数的范围都是0-1之间。 在ssd中,x,y是实际中心和boudning box的差值/bounding box的宽度(或者高度);w,h是log(真实宽度/bounding box的宽度)。这两个参数是不同的。

参考资料

SSD算法思想和结构详解: https://www.baidu.com/link?url=dG930Wgj8gRWERgRMXzzoM8EKfvzNpMH9s51FFnU7YBlKAdKVZz1H44RGeIBSO8hJqdai12XF6E5J1_qxJuzgq&wd=&eqid=8d70dd720001f291000000045dc1379d

SSD详解 https://blog.csdn.net/WZZ18191171661/article/details/79444217

https://zhuanlan.zhihu.com/p/57440670

你可能感兴趣的:(SSD与yolov1的对比)