SSD精读笔记
我的记录
为什么SSD论文中说它是一个阶段的?
会不会是因为它模型中并没有区分背景类?
Abstract
与需要生成区域建议边界框的目标检测算法相比,SSD比较简单,因为它把所有的计算封装在一个网络中,这也使得SSD易于训练且方便组合在有目标检测任务的网络中。
在实验中,SSD方法同样具有竞争力,并且在训练和预测过程中遵循统一的框架。
本文的代码:https://github.com/weiliu89/caffe/tree/ssd
Introduction
当时先进的目标检测系统基本都是以下方法的修改
- 假设边界框
- 对每个边界框内的特征或者像素进行重采样
- 使用更好的分类器
这些方法在检测效果上一直占有优势,这些方法虽然准确,但对于嵌入式系统来说计算量太大,即使有高端的硬件,对于实时应用来说也过于缓慢。且目前为止,提高速度是以降低检测精度为代价的。
本文提出的方法不以重采样或假设边界框为基础,直接使用深度网络进行实现,显著提高了检测速度,速度提高的根本原因在于没有使用区域建议生成边界框阶段。
作者总结了自己的贡献:
- 搞出了单次检测器(单次检测应该是指不用生成区域建议)SSD,且比YOLO更快更准确
- SSD的核心是在特征图上运用小卷积核,以预测类别分数和预测默认边界框对于真实样本边界框的偏移量
- 在不同的尺度和长宽比下进行预测以提高预测准确率
- 在像素较低的图像上也有比较好的效果,反正就是又快又准
The Single Shot Detector
Model
SSD方法基于生成固定形状和大小的边界框并为所有边界框预测分类分数的前馈卷积神经网络,并在其后使用NMS方法得到最终的目标检测。
整个结构前面的网络基于高质量的图片分类器,作者称其为network1;随后作者在网络中添加辅助结构,以得到包含以下主要特征的检测结果:
-
用于检测的多尺度特征图:在网络后面增加了特征的卷积层,这些层的大小不断减小并且对不同的特征图有不同的预测
-
用于检测的卷积预测器:每个添加的或原有的卷积层可以通过卷积核生成一组固定的检测预测结果,且特征层可以输出对于类别分类的分数,或者是默认生成的边界框对于真实样本的边界框的偏移值。(但是偏移值是由全连接层输出的,而不是由卷积层输出的,这与YOLO比较相像)
-
默认的边界框与长宽比:对于最后得到的多个特征图(可能是由不同的层输出的),
- 模型为每个特征图中的每个单元对应生成一组默认的边界框
- 默认的边框以卷积的方式遍历整个特征图,所以每个边界框的对应单元的位置是固定的
- 在每个特征图的格子中,模型预测这个格子所对应生成的默认边界框对于真实样本边界框的偏移量,同时预测这个方框内类别的分数
- 由于对给定的位置会生成k个边界框,每个边界框中需要计算其在c个类别上各自的分数,还需要得到它的边界框表示方式的4个偏移值,则需要输出(c+4)k个值,这就导致在特征图的每个位置都有这么多个值的输出
- 同时,这里的默认生成的边界框的方式与Faster R-CNN中的方式相似,不过这里是对不同分辨率的多个特征图进行使用
Training
训练SSD和训练使用区域建议的经典目标检测模型最主要的不同在于,区域建议的边界框是否需要专门的输出。
- Matching Strategy:这里最大的不同是将默认生成的边界框与所有满足条件的真实样本的边界框进行匹配,而不是只与其中最高的进行匹配
- Loss Functiion:感觉和Faster R-CNN的损失函数差别不大,不想细看了
- Choosing Scales and Aspect Ratios for Default Boxes:SSD同时使用高层的和低层的特征图来进行目标检测,这部分讲的都是关于默认边界框生成的一些信息,不想细看了太长了
- Hard Negative Mining:在经历边界框匹配阶段后会得到大量的边界框标记是负的(即没有与样本的边界框匹配上),所以作者采用最高置信度损失(哈东西?)来对负标签边界框进行排序,选取最高的出来使得负标签和正标签的比例为3:1,并且作者发现这样模型可以得到更好的优化和更稳定的训练
论文的这部分还提到了使用数据增强来提高模型的泛化能力,基本都是对数据的一些随机水平翻转之类的处理。
Experimental Results
在很多数据集上测试了SSD,都得到了很不错的效果,然后作者使用了控制变量法,分别对比了是否使用数据增强、是否采用某种比例的边界框、不同的卷积层结构等对整个模型的影响,并得到了以下结论:
- 数据增强是关键
- 设置更多的默认边界框形状会得到更好的结果
- 在不同的分辨率下设置不同的输出会得到更好的结果