SSD目标检测算法精讲

写在前面:大家好!我是【AI 菌】。我热爱AI、热爱分享、热爱开源! 这博客是我对学习的一点总结与思考。如果您也对 深度学习、机器视觉、算法、Python、C++ 感兴趣,可以关注我的动态,我们一起学习,一起进步~
我的博客地址为:【AI 菌】的博客
我的Github项目地址是:【AI 菌】的Github

一、SSD简介

2016年,Wei Liu等人提出了SSD算法,它是继YOLOv1算法提出后的又一单阶段目标检测算法。在当时,单阶段算法相比于以R-CNN系列为主的双阶段算法更快,所以被学术界和工业界所青睐。为了提高检测的精度,SSD创造性地提出了多尺度预测的目标检测算法,使得网络更容易适应对不同大小物体的检测。

开源代码: https://github.com/weiliu89/caffe/tree/ssd
在这里插入图片描述

实验表明,SSD在VOC2007数据集上的表现,比当时一流的Faster R-CNN算法更佳。

  • 当300x300大小的图像作为输入,SSD算法在Nvidia Titan X上的推理速度能达到46 FPS,检测精确度达到 77.2%;
  • 当512x512大小的图像作为输入,SSD算法在Nvidia Titan X上的推理速度能达到19 FPS,检测精确度达到 79.8% 。

SSD的提出主要有以下5大贡献:

  • 这是一种适用于多种类别的单阶段目标检测器,其速度比之前的最新的单阶段目标检测器YOLOv1更快,精度更高。并且相比基于候选区域的双阶段目标检测器Faster R-CNN精度不相上下,而速度更快。
  • 使用锚框的思想,通过应用于特征图的小型卷积核来预测一组固定的锚框的类别得分和框偏移,从而得到预测框的类别和位置。
  • 为了获得较高的检测精度,作者从不同大小的特征图中生成了不同比例和不同宽高比的锚框来预测目标。
  • 即使在低分辨率输入图像上也可以轻松地实现的端到端训练和不错的精度,进一步提高了速度与精度之间的权衡。
  • 做了大量实验,包括在PASCAL VOC,COCO和ILSVRC等数据集上评估了具有可变输入大小的SSD模型的速度和精度,并将其与一系列最新技术进行了比较。

二、SSD网络结构

2.1 核心思想

大家都知道,在深度学习中,衡量目标检测算法优劣的唯二标准是:速度和精度。提出一种速度快,精度佳的算法成为专家学者的一致目标。SSD算法摒弃了RPN的思想,是一种单阶段的目标检测器,速度上比Faster R-CNN快很多。于此同时,提出了多尺度预测的想法。这种多尺度,不仅在于多个尺度的Anchors,更在于选取了不同大小的特征图做预测,使得SSD算法的目标检测精度更好,胜于当时最新的YOLOv1。

在这里插入图片描述
对于目标检测算法而言,目标框的生成过程是大家最关心的问题之一。在SSD中,这一过程仍然采用的是Anchors机制。这一方法自从在R-CNN系列中提出以来,就应用到了大量的目标检测网络中,比如经典的YOLO系列等。

所谓Anchors,也就是提前设置的锚框,可以理解成预选框,和Faster R-CNN中的候选区域类似。在特征图中的每一个格子中,都会设置n个不同的尺寸和大小的锚框。在训练过程中,会将这些锚框和真实的标签框(ground truth)进行匹配。通常会以交并比IOU作为评价指标,判断锚框是否与目标匹配。如果匹配,则会进一步根据定位损失、置信度损失和类别损失函数进行迭代计算,来预测所有目标类别(c1,c2,···,, cp)的偏移和置信度。

2.2 多尺度预测

(1) 多尺度特征图

相比于Overfeat和YOLO算法采用一个尺度的特征图进行预测不同,SSD采用了多个不同尺度的特征图对目标进行预测。

作者将卷积特征层添加到骨干网络的末尾。这些层的特征图大小逐渐减小,并可以预测多个尺度的目标。每个特征层用于预测检测结果的卷积模型不同。

(2) 多尺度默认框

这里的默认框与Faster R-CNN中使用的Anchors相似,但是在SSD算法中,作者将Anchors应用于多个不同分别率的特征图,并且在每个不同大小的特征图中允许使用形状不同的Anchors(比如采用长宽分别比为1:1,1:2,2:1的Anchors)。

具体来说,对于给定m×n特征图中的每个格子,需要预测k个边界框。对于每个边界框,我们要计算c类得分和相对于Anchors的4个位置偏移量。这将使得一共需要(c + 4)* k个卷积应用在特征图中的每个位置,从而网络输出的特征图大小为(c + 4)* k * m * n。

2.3 卷积网络结构

在这里插入图片描述
上图是两种单阶段目标检测器的网路整体结构图:SSD和YOLOv1

整体结构上,SSD采用了VGG-16作为骨干网络提取特征。在骨干网络末尾添加了若干个特征层,特征层与特征层之间使用1x1和3x3的卷积核计算特征和降采样,并从中选择了6个不同大小的特征层来预测目标。

需要注意的是,用来预测目标的每一个特征层上预设的Anchors数量不一定是相同的。比如对于38x38的特征层,每个格子预设4个不同比例的Anchors;对于19x19的特征层,每个格子预设了6个不同比例的Anchors。

三、目标损失函数

每一个目标检测网络都具有其独特的目标损失函数,它决定着网络训练迭代的方向,因此研究损失函数的意义也是学习SSD算法过程中必不可少的一步。

根据目标检测网络的一般定义,我们知道总损失函数一般由两部分组成:定位损失和置信度损失。

在这里插入图片描述
其中,定位损失计算公式为:

在这里插入图片描述
定位损失函数借鉴了Faster R-CNN中的 S m o o t h L 1 Smooth_{L1} SmoothL1函数,用来计算预测边界框 l l l 和真实边界框 g g g 之间的损失误差。其中,m是代表边界框位置信息的集合{cx,cy,w,h}。

真实边界框(标签)的计算公式:

在这里插入图片描述
容易看出,SSD没有直接将目标的中心位置、长宽作为真实标签。而是采取真实框与预选框Anchors的偏移作为真实标签。那么在学习的过程中,也会去主动预测偏移值,这样更有利于网络的训练,避免在训练初期产生较大的振荡。

置信度损失函数是在多个类别置信度c上的softmax损失:
在这里插入图片描述

四、一些改进技巧

4.1 多尺度多比例默认框

前面已经提到,SSD算法中采用了类似于Faster R-CNN中的Anchors机制用于目标框的回归。值得一提的是,SSD采用的Anchors方法更为灵活,不仅在每一个特征层设置了不同大小和比例的预选框,而且针对于不同的特征层,也设计了相应的大小的预选框。

每个feature map对应预选框的min_size和max_size计算公式如下:

在这里插入图片描述
其中,m是指进行预测时使用feature map的数量,如SSD300使用了包括conv4-3在内的6个feature maps进行预测,所以 m=6。同时原文设定: S m i n = 0.2 , S m a x = 0.9 S_{min}=0.2, S_{max}=0.9 Smin=0.2,Smax=0.9

于是,每一个用于预测的特征层对应预选框的min_size和max_size可以算得:

  • 对于conv4-3: K=1,min_size = s1 * 300,max_size = s2 * 300
  • 对于conv-7:K=2,min_size = s2 * 300,max_size = s3 * 300
  • 依次类推

经过计算可知,对于越深的特征层(尺寸越小),设置的预选框尺寸越大。这是因为,尺寸越小的特征层,感受野越大。SSD的目的就是:要让感受野小的特征层检测小目标,使用感受野大的特征层检测更大的目标。

4.2 负样本均衡

在训练过程中,大部分的预选框Anchors并不能和真实框匹配上,因此负样本很多,而正样本却很少,正负样本数量严重失衡,不利于训练。

考虑到这个问题,SSD在训练过程中,没有选取所有的负样本。而是先将负样本的置信度损失进行排序,仅选取置信度高的一些负样本,使得负样本数与正样本数之间的比率最大不超过3:1。作者认为,这样使得训练更稳定更快。

4.3 数据增强

数据增强又叫数据增广,是扩大数据集的一种方式,经常用于深度学习中来防止过拟合。在SSD算法中,也使用了一些数据增强的技巧。采用数据增强后,目标检测性能也得到了明显的提升,具体实验结果如下:
在这里插入图片描述
想具体了解数据增强的过程,推可以参考这篇博文:https://blog.csdn.net/mzpmzk/article/details/100161187

五、性能比较

5.1 在VOC2007测试集上的检测性能

作者在VOC2007测试数据集上,对不同的目标检测算法性能进行了对比。实验结果如下:

在这里插入图片描述
分析上表,容易得出结论:

  • 对比检测精度可知,SSD算法的性能整体上优于Fast R-CN 和 Faster R-CNN算法。
  • 对比SSD300和SSD512可知,图像输入尺寸为512x512的SSD算法比输入尺寸为300x300的SSD算法检测性能更好。
  • 对比07、 07+12、07+12+COCO可知,训练集的扩充有助于检测性能的提升。

注:表格名词解释(下同):

  • 07:表示网络模型仅在VOC2007数据集上进行训练
  • 07+12:表示网络模型同时在VOC2007和VOC2012数据集上进行训练
  • 07+12+COCO:表示网络模型先在COCO数据集上进行训练,再在VOC2007和VOC2012数据集上进行微调。

5.2 在VOC2012测试集上的检测性能

作者在VOC2012测试数据集上,对不同的目标检测算法性能进行了对比。实验结果如下:
在这里插入图片描述
分析上表,容易得出以下结论:

  • 在VOC2012测试数据集上,整体的检测精度表现:SSD512>SSD300>Faster R-CNN>Fast R-CNN>YOLOv1
  • 对比SSD300和SSD512可知,较大尺寸的图像输入,对SSD的检测精度更有利。
  • 对比07+12、07+12+COCO可知,训练集的扩充有助于检测性能的提升。

5.3 在COCO测试集上的检测性能

为了进一步验证SSD框架,作者在在COCO数据集上训练了SSD300和SSD512。并且在COCO测试数据集上,对不同的目标检测算法性能进行了对比。实验结果如下:

在这里插入图片描述
分析上表,容易得出以下结论:

  • 比较不同的网络,发现SSD512的平均精确度和平均召回率最高,检测性能最佳,且对小目标的检测效果较好。
  • SSD300的平均精确度与Faster R-CNN相当,但是平均召回率明显低于Faster R-CNN。

六、总结

SSD是一种适用于多种类别的单阶段目标检测器,检测速度比Faster R-CNN更快,检测精度比YOLOv1更高。经典的SSD算法分为SSD300和SSD512两种,分别代表网络输入的图像大小为:300x300和512x512。SSD512的检测精度要优于SSD300,同时对小目标的检测性能更好;SSD300的检测速度比SSD512更快,同时它的检测精度也比同期的其他检测器要好。

SSD的整体网络结构,其实很容易理解。可以简单的看做是YOLOv1和特征金字塔的融合,即主干网络采用了与YOLOv1类似的VGG16,与YOLOv1不同的是,SSD采用多个不同的特征层用来预测,这些不同的特征层其实就可以看做是特征金字塔。因此,SSD在不失速度的情况下,检测精度仍然更够保持很好。

在这里插入图片描述
由于水平有限,博客中难免会有一些错误,有纰漏之处恳请各位大佬不吝赐教!

AI 菌 CSDN认证博客专家 博客专家 CSDN合作伙伴 算法实习僧
研究僧一枚,CSDN博客专家,公众号【AI 修炼之路】作者。专注于无人驾驶(环境感知方向),热衷于分享AI、CV、DL、ML、OpenCV、Python、C++等相关技术文章。
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 猿与汪的秘密 设计师:白松林 返回首页
实付 19.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值