首发于机器之眼
SSD论文笔记

SSD论文笔记

论文地址:(ECCV 2016 oral)

笔者读论文的学习笔记,本人水平有限,如有错误,请指出。

码字不易,如果您觉得写得不错,请点个赞,谢谢。


SSD关键点:

  1. one-stage,可以end-to-end训练
  2. 比YOLOv1快且精准度高,比Faster R-CNN精度略低
  3. 多尺度:多个feature map上生成多个不同的default box
  4. 和YOLO一样不同类别之间共享回归器,所以易混淆相似的类别
  5. 对小物体的检测相对于YOLO好一点

一、背景介绍

主流的目标检测算法分为两种,一种是之前介绍的R-CNN系列(论文笔记地址:zhuanlan.zhihu.com/p/57),主要思路是先使用启发式方法(Selective Search)或CNN网络(RPN)生成region proposal,然后在此proposal上生成特征输入到分类和定位网络中,所以这类方法是two-stage的,特点是精度高、速度略慢、训练较复杂;第二种是one-stage方法,如之前介绍的YOLO(论文笔记地址:zhuanlan.zhihu.com/p/58)和这篇笔记所要介绍的SSD,它们的思路是均匀地在图片的不同位置进行密集抽样,抽样时可以采用不同的尺度和长宽比,然后利用CNN提取特征后直接进行分类和回归,整个过程只需要一步,所以它们的优势是速度快。但是均匀的密集采样有一个缺点就是正样本和负样本分布极不均衡,这会导致训练困难,导致模型准确度稍低。(可以通过FocalLoss缓解这个问题)

二、网络结构

以VGG-16为backbone,SSD网络结构如图1所示:

图1、SSD网络结构(注意此图中第三个数字都代表卷积核个数,而不是channel数)

图1中网络的输入是300 x 300,称为SSD300;除此之外还有输入为500 x 500的SSD500,它在SSD300的基础上又加了一层conv11_2用于检测。

SSD将VGG-16的全连接层fc6和fc7转换成3 x 3的卷积层Conv6和1 x 1的卷积层Conv7,并将pool5从2 x 2 - s2转换成3 x 3 - s1。第一个用于检测的feature map是Conv4_3,由于位置靠前,为了避免与后面的检测层差异太大,所以在Conv4_3后面使用L2 normalization,即仅对每个像素点在channel维度上进行归一化。

  • 在多个尺度的feature map上进行检测

在Conv4_3、Conv6、Conv7、Conv8_2、Conv9_2、Conv10_2、Pool 11的feature map上都会进行检测

  • feature map上每个像素都会生成多个default box

如图2所示,在8 x 8和4 x 4的feature map上生成用于检测的default box,它们可以对应不同尺度的检测框,这样可以更好地拟合ground truth。比如图2中狗的ground truth和4 x 4 feature map中default box匹配,但和8 x 8 feature map的任何一个default box都不匹配,所以SSD相对于RPN考虑更周到

图2
  • 使用CNN进行检测

和RPN有些类似,对于feature map先使用3 x 3卷积(为了综合利用周围信息),卷积后的结果代表feature map上每个像素代表的default box的信息,如类别概率或位置信息。以图1中的Conv4_3为例,feature map尺寸为38 x 38 x 512,用3 x 3 x 512 x (3 x (Classes + 4))卷积,可以得到38 x 38 x (3 x (Classes + 4)),所以feature map的每个像素都可以得到3 x (Classes + 4)个信息:3代表每个像素有3个不同尺度和长宽比的default box(由于Conv4_3尺寸太大所以只用了3个,后面还会再详细介绍),Classes代表所要预测的类别数(注意这里还包括背景这个类别,YOLO不包括,Faster R-CNN也包括),4代表预测出的bounding box的参数化后的偏移量(这个和RPN一样,但和YOLO不一样,YOLO是直接拟合ground truth)

三、训练细节

  • 如何选择default box的尺度和长宽比?

这里和RPN的anchor box选择很类似,针对不同数据集可以采用不同尺度和长宽比的default box。SSD在每个feature map上都可以选择不同的default box,下面假设共有 m 个feature map,当前feature map序号记为 k ,default box相对于原图的比例记为 s_k ,则:

图3、default box尺度

其中 s_{min} 为最小尺度0.2, s_{max} 为最大尺度0.95。长宽比 a_r\in\{1,2,3,\frac1 2,\frac1 3\} ,于是default box的宽和高可以通过 w_k^a=s_k\sqrt{a_r}h_k^a=s_k/\sqrt{a_r} 计算,除此之外,还增加一个长宽比为1,尺度为 s_k'=\sqrt{s_ks_{k+1}} 的default box,所以feature map上每个像素都有6个default box,注意这里得到的结果都是相对于原图的比例。default box中心的坐标就是像素的中心。


  • default box与ground truth匹配规则

在训练过程中,要将ground truth与default box进行匹配,与之匹配的default box将负责拟合这个ground truth。和MultiBox不一样,SSD每个ground truth可以与多个default box匹配。SSD的匹配规则和RPN类似,分为两步:首先对于每个ground truth,找到一个与其IoU最大的default box匹配,这个default box对应的预测框就作为正样本,其余都作为负样本。但这样做会导致负样本过多,正负样本分布极其不均衡,所以还会采取第二步:对于每个ground truth,将与其IoU大于某一阈值(比如0.5)的default box都进行匹配。从上面讨论可以知道,每个ground truth都会有多个default box与其匹配。


  • 损失函数

损失函数分为置信度损失(即分类损失,conf)和定位损失(loc):

图4、损失函数

N 为匹配成功的default box个数; \alpha 是为了权衡两者损失而设置,通过交叉验证发现设置为1更好;第一项是置信度的Softmax损失,注意还包括背景这个类别;第二项是参数化后的bounding box中心坐标、长和宽的Smooth L1损失


  • Hard negative mining

在训练阶段,负样本过多,如果让所有负样本都参与训练,会导致正负样本不均衡、训练困难,所以SSD采用了hard negative mining:将负样本根据confidence进行排序,从高到低选取负样本使正负样本比例至少为1:3,只有被选取的样本才能计算损失函数参与训练。作者发现这样做之后模型优化更快且训练更稳定了


  • 数据增强

为了获取小目标训练样本,每张训练图片都会随机选择下面三个选项中的一个:

  1. 使用整张图片
  2. 采样一个patch,使其与物体的最小IoU为0.1、0.3、0.5、0.7或0.9
  3. 随机选取一个patch

在得到patch之后再resize到固定尺寸,并以0.5的概率将其水平翻转

四、实验细节

具体实验配置不再详述,下面提几个关键点:

  1. SSD和YOLO一样,不同类别共享位置,所以易混淆相似的类别
  2. 对结果有提升的设置:数据增强、使用更多的feature map如Conv4_3、使用更多不同尺度和长宽比的default box、使用空洞卷积
  3. 由于MS COCO数据集的物体都较小,所以使用SSD500检测小物体效果更好
  4. inference阶段由于生成的bounding box较多,所以还要使用NMS进行筛选


Reference:

发布于 2019-03-09 21:29