论文地址:https://arxiv.org/abs/1512.02325
代码地址:https://github.com/weiliu89/caffe/tree/ssd
一 为什么读这篇
大名鼎鼎的SSD,做目标检测的不得不读,属于一阶段法中除YOLO系列外的另一代表方法,后续有不少paper都受到过SSD的启发。
二 截止阅读时这篇论文的引用次数
2019.3.23 3231次。是Faster R-CNN的一半,和YOLO v1差不多。
三 相关背景介绍
15年12月挂到arXiv上,中了16年的ECCV。一作刘伟是北卡罗来纳大学教堂山分校的PHD,也是GoogLeNet的的二作。其他几个作者都有Google背景,包括Szegedy大神,所以SSD差不多算是Google系的。本篇提出时间比Faster R-CNN和YOLO v1晚半年。
四 关键词
SSD
五 论文的主要贡献
1 提出的SSD在准确率上媲美Faster R-CNN,速度上却快了很多
2 引入了在多尺度特征图上进行检测的思想
六 详细解读
0 摘要
本文提出的SSD方法可以将bbox的输出空间离散化为一组box,这些box在每个特征图点位上有不同的纵横比和尺度。在预测阶段,网络对每个默认box中的所有目标类别生成分数,并调整box以匹配目标形状。此外,网络将来自不同分辨率的多个特征图的预测组合在一起以自然地处理各种大小的目标。300x300的输入,在VOC2007上的mAP为74.3%,512x512的输入,mAP为76.9%。
1 介绍
本文提出第一个又准又快的检测器。在VOC2007上
SSD 59FPS 74.3% mAP
Faster R-CNN 7FPS 73.2% mAP
YOLO 45FPS 63.4% mAP
速度的根本改进源自消除候选bbox以及随后的像素或特征重采样阶段。本文的改进包括使用小卷积滤波器来预测bbox位置中目标类别和偏移,使用分离的滤波器用于不同的纵横比检测,并将这些滤波器应用于网络后面阶段的多个特征图以执行多尺度检测。这些改进中,特别是使用多个层进行不同尺度的预测,实现了用相对较低分辨率输入得到较高准确率,并进一步提升了检测速度。本文贡献如下:
1 提出SSD,比之前的SOTA YOLO还快,而且明显更准。
2 SSD的核心是用应用于特征图的小卷积滤波器,来预测固定的一组默认bbox的类别得分和box偏移。
3 为了实现更高的检测准确率,SSD从不同尺度的特征图生成不同尺度的预测,并通过纵横比显式地分开预测。
4 训练过程是简单的端到端训练。即使输入分辨率不高,也有很高的准确率。
2 The Single Shot Detector(SSD)
2.1 模型
用VGG-16做base网络,并将辅助结构添加到网络以生成具有如下关键特征的检测:
用于检测的多尺度特征图
将卷积特征层添加到截断的base网络的末尾,这些层的尺寸逐渐减小,并允许在多个尺度上预测检测。用于预测检测的卷积模型对于每个特征层是不同的(Overfeat和YOLO都是在单一尺度的特征图上运算)。
用于检测的卷积预测器
每个添加的特征层(或直接用base网络的)可以使用一组卷积滤波器生成一组固定的检测预测。
对于尺寸为m x n,通道数为p的特征层来说,用于预测参数的基本元素是3 x 3 x p的小卷积核,在卷积核应用的每个m x n点位上,生成一个输出值。bbox偏移输出值是用相对于每个特征图点位的默认box位置来衡量的(与YOLO相比,其是用中间全连接层而不是卷积滤波器完成这一步)。
默认box和纵横比
这里的默认box类似于Faster R-CNN的anchor,不同的是将其应用于不同分辨率的多个特征图上。举个具体的例子,对于每个点位上有k个box,在box上计算c个了别分数和4个相对于原始默认box形状的偏移值,这样在特征图上的每个点位上用(c + 4)k个滤波器,对于m x n的特征图生成 (c + 4)kmn的输出。
2.2 训练
SSD与使用候选区域的检测器的关键不同在于需要将ground truth信息分配给固定检测器输出组中的特定输出。确定此分配后,端到端的应用损失函数和反向传播。
匹配策略
对于每个ground truth box,选择在不同位置上,不同纵横比和尺度的默认boxes与之对应。像MultiBox一样,用最佳jaccard重叠来匹配ground truth box和默认box。与MultiBox不同的是,将默认box与所有jaccard重叠大于0.5的ground truth box匹配。这样有助于简化学习问题,允许网络预测多个重叠的默认box的高分数,而无需仅仅选择一个最大的重叠。
训练目标
SSD训练目标继承自MultiBox,但是可以扩展为处理多个目标类别。令表示类别p的第i个默认box和第j个groun truth box,用如上的匹配策略,得到。整个目标损失函数由位置损失(loc)和置信度损失(conf)的权重和组成。
其中N为匹配的默认box个数,位置损失是预测box(l)和ground truth box(g)的平滑L1损失。与Faster R-CNN类似,回归的偏移是默认bbox(d)的中心(cx, cy)及其宽高(w, h)。
置信度损失是多个类的softmax损失
通过交叉验证将权重参数设置为1。
选择默认box的尺度和纵横比
FCN和Hypercolumns说明利用低层的特征图可以提升效果。受类似方法的启发,本文同时使用低层和高层特征图来检测。如图1所示。
网络中不同层级的特征图拥有不同的感受野大小。假设使用m个特征图用于预测,用于每个特征图的默认box的尺度如下计算:
其中为0.2,为0.9意味着最低层的尺度是0.2,最高层的尺度是0.9,两者之间所有层都是规律间隔的。给默认boxes定义不同的纵横比,定义它们为,可以计算每个默认box的宽为,高为。对于纵横比为1的情况,还可以增加一个尺度为的默认box。这样在每个特征图每个点位上就有6个默认box。
通过结合来自许多特征图的所有点位的具有不同尺度和纵横比的所有默认box的预测,所得预测涵盖了各种输入目标的大小和形状。如图1狗的例子。除了红框的box匹配到了,其他的都作为负样本。
困难负样本挖掘
执行完匹配这一步后,绝大多数默认box都视为负样本,这引入了不平衡正负训练样本问题。本文没有使用所有负样本,而是根据每个默认box的最高置信度损失排序,选择其中最高的以使正负样本比为1:3,这个操作使优化更快,训练更稳定。
数据增强
每张图像从如下策略中随机选择一个:
- 使用整个原始输入图像
- 采样patch以便同目标的最小jaccard重叠为0.1, 0.3, 0.5, 0.7, 0.9
- 随机采样patch
采样的patch的大小在原始图像大小的[0.1, 1]之间,纵横比在1/2和2之间。
采样之后,将每个patch重新resize到固定大小,并用0.5的概率进行水平翻转,同时使用类似Howard论文里提到的一些增强策略。
3 实验结果
Base网络:基于VGG16,将fc6和fc7转为卷积层,去掉dropout和fc8。
3.1 PASCAL VOC2007
这一节有很多对模型细节的描述。
用《 Diagnosing error in object detectors》的工具得到图3的结果。
SSD有个问题是对于相似目标类别(特别是动物类)的区分较差,部分原因是多个类别共享位置。图4说明SSD对bbox的大小很敏感,换句话说,SSD对小目标的检测比大目标要差,这是因为小目标在最上面的层也许可能没有任何信息。增加输入大小有助于检测小目标。
3.2 模型分析
数据增强是至关重要的
8.8%的mAP提升
更多形状的默认box更好
Atrous更快
来自DeepLab的atrous,不用它的话慢20%。
不同分辨率的多个输出层更好
SSD的主要贡献就是用不同输出层上不同尺度的默认box(这点已经强调了很多次了)。
3.3 PASCAL VOC2012
3.4 COCO
因为COCO比VOC有更多的小目标,所以也用更小的默认box。
3.5 初步的ILSVRC结果
这里只有SSD300的模型,没有比较表格。
3.6 用于小目标准确率的数据增强
2.2节的数据增强极大的提升了性能,特别是像在PASCAL VOC这种小数据集上。随机裁剪可被视为放大(zoom in)操作,可以生成更大的训练样本。为了实现缩小(zoom out)操作来创建更多的小样本,在进行任何随机裁剪操作之前,首先将图像随机地放置在填充为平均值的比原始图像大16倍的画布上。这个针对小目标的数据增强技术神奇了,效果可见表6和图6。
3.7 推理时间
考虑到SSD生成的大量的box,推理期间的nms效率至关重要。通过设置阈值为0.01,能过滤掉大多数box。然后用每个类上jaccard重叠为0.45的nms,保持每张图上最多200个检测。
看表7,YOLO不准跟box个数太少也有很大关系。
4 相关工作
SSD和Faster R-CNN中的RPN很像,用于预测的一组固定默认box和RPN中的anchor也很像。与之不同的是直接在每个box上生成每个目标类别的分数。
如果在最后特征图上的每个点位上只用一个默认box,SSD就类似于OverFeat。如果使用整个最后特征图,并增加一个全连接层而不是卷积用于预测,同时不用显示的考虑多种纵横比,那么SSD就接近于YOLO。
七 小结
ECCV还是很另类的,相关工作放在最后介绍。感觉SSD就是YOLO,最核心的就是用了多尺度特征图。不过论文里SSD pk的对手一直是Faster R-CNN,YOLO只是拿来顺便比较的。SSD整个感觉还真是炼丹,各种细致的参数设置,针对不同数据集的调整,针对不同问题的调整,有太多trick了。
素质四连
要解决什么问题
目标检测中怎么在快的前提下更准
用了什么方法解决
多尺度特征图检测
效果如何
准确率比Faster R-CNN好一点,速度上快很多
还存在什么问题
对于小目标的检测不好,作者论文里自己也多次指出,并提出一些解决办法(如加大输入分辨率;图像扩展数据增强)