zl程序教程

您现在的位置是:首页 >  其他

当前栏目

《SSD: Single Shot MultiBox Detector》论文笔记

论文笔记 SSD single Shot
2023-09-11 14:22:29 时间

1. 论文思想

SSD从网络中直接预测目标的类别与不同长宽比例的边界框。在这篇论文中提出的方法(SSD)并没有为边界框假设重采样像素或是特征,但是却达到了使用这种方案检测模型的精度。在VOC 2007的测试集上跑到了mAP74.3% 59 FPS(在后来改进数据增广的方法,在VOC 2007数据集上实现了分辨率为 300 ∗ 300 300*300 300300的图片上实现了77.2% mAP,在 512 ∗ 512 512*512 512512的输入图片上达到了79.8% mAP。),都是快于Faster RCNN与YOLO的。速度提升的关键来自于取消了边界框的预测以及后续像素与特征的重采样部分。虽然这篇论文并不是头一个使用这样方案的,但是却取得了极佳的性能提升,这是源自于如下三点:
(1)使用小的卷积核去预测目标的类别与边界框的位置偏移
(2)使用分离的预测器去预测不同长宽比目标
(3)将上面所说的两点在网络的不同feature map上使用获得多尺度的检测效果。
在这里插入图片描述
在上图(a)中首先框定两个GT框,之后SDD网络分别在分辨率为 8 ∗ 8 8*8 88 4 ∗ 4 4*4 44的不同尺度feature map上预测不同长宽比例的默认框,对于每个默认框预测其坐标偏移与分类概率。在训练阶段,首先匹配预测框与GT框,要是匹配上了其它的预测框就会被标注为负类。最后的损失函数是分类误差与定位误差的加权和。

2. SSD模型

SSD方法基于前馈卷积网络,该网络生成一个固定大小的边界框集合,并为这些框中是否存在对象类实例生成概率,然后执行非最大抑制步骤以生成最终检测结果。SDD模型的前部分是分类模型的网络作为其基础网络,之后添加了一些额外的网络结构使得检测具有如下的特征:
(1)使用多尺度检测:在基础网络中feature map是逐渐减小的,这就使得检测模型可以在多尺度上进行检测,不同于YOLO是在最后的feature map上做预测。
(2)用于检测的卷积预测器:每个添加的特征层(或来自基础网络的现有特征层)可以使用一组卷积滤波器生成一组固定的检测预测集合,这些卷积滤波器位于SSD网络的顶端。对于 m ∗ n ∗ p m*n*p mnp的feature map输入(p:通道数)使用 3 ∗ 3 ∗ p 3*3*p 33p的小卷积核去预测目标分类与预测框与相对default box的坐标偏移。
(3)默认框(default boxes)与不同长宽比:在网络中不同分辨率的feature map上使用类似anchor box的机制获得default box。对于一个 m ∗ n m*n mn的输入feature map可以产生 ( c + 4 ) k ∗ m ∗ n (c+4)k*m*n (c+4)kmn的输出, c c c代表分类概率, k k k代表该位置给出的default box的数量。
在这里插入图片描述

3. 模型训练

训练SSD和训练使用region proposal的典型检测器的关键区别在于,在固定的检测器输出集中,需要将GT信息分配给对应的输出。同样的这种机制也被用在了YOLO上,实现了端到端的网络训练。在训练还涉及到default box与比例的选择、数据增广与hard negative mining。

3.1 匹配策略

匹配策略指的是寻找default box与GT之间的最佳对应关系,default box是源自于不同位置、长宽比、尺度的选择。首先将每个ground truth框与默认框进行匹配,使用的是jaccard overlap(就是两个集合的交集除以两个集合的并集)作为距离度量,只要重叠度大于了0.5就认为其匹配,而不是选取最大的那一个。这简化了学习问题,允许网络预测多个与GT重叠较高的默认框,而不是只选择重叠最大的那个。

3.2 训练的目标函数

SSD的目标函数源自于MultiBox的目标函数,SSD在此基础上增加了对于多分类的支持。这里定义 x i j p x_{ij}^{p} xijp,是代表第 i i i个default box与第 j j j个GT框对应,并且被分类为 p p p,其取值规则为:若匹配上值为1,否则为0。因而,基于上面的匹配策略可以得到 ∑ i x i j p ≥ 1 \sum_{i}x_{ij}^{p} \geq 1 ixijp1。因而整个损失函数就可以使用定位误差与分类误差加权和的形式得到:
L ( x , c , l , g ) = 1 N ( L c o n f ( x , c ) + α L l o c ( x , l , g ) ) L(x,c,l,g)=\frac{1}{N}(L_{conf}(x,c)+\alpha L_{loc}(x,l,g)) L(x,c,l,g)=N1(Lconf(x,c)+αLloc(x,l,g))
其中, N N N是匹配到的box的数量,如果 N = 0 N=0 N=0,定义loss为0;定位损失使用Smooth L1计算预测框 l l l与GT框 g g g计算得到的;重量项α通过交叉验证设置为1;与Faster RCNN类似的,这里使用损失函数去回归相对default box ( d ) (d) (d)的中心 ( c x , c y ) (cx,cy) (cx,cy)偏移与长宽 w , h w, h w,h。因而,定位损失函数就可以被描述为:
在这里插入图片描述
对于分类的误差使用softmax loss,则可以被描述为:
在这里插入图片描述

3.3 default box的尺度与长宽比

对于不同尺度的目标的检测任务,可以在同一个网络中使用不同的feature map做检测实现,不用分别在不同的尺度做检测,再将其合在一起。之前的在FCN与U-Net中也是用了低层次的卷积信息,来增加网络的性能,这里也是同样的道理。在本文的第一张图片里面也对其做了示意

已知网络中不同层的特征映射具有不同的(经验的)感受野大小。幸运的是,在SSD框架内,默认边界框不需要对应于每层的实际感受野。我们设计平铺默认边界框,以便特定的特征映射学习响应目标的特定尺度。假设我们要使用 m m m个特征映射进行预测。每个特征映射默认边界框的尺度计算如下:
s k = s min + s max − s min m − 1 ( k − 1 ) , k ∈ [ 1 , m ] s_k = s_\text{min} + \frac{s_\text{max} - s_\text{min}}{m - 1} (k - 1),\quad k\in [1, m] sk=smin+m1smaxsmin(k1),k[1,m]
其中 s min s_\text{min} smin为0.2, s max s_\text{max} smax为0.9,意味着最低层具有0.2的尺度,最高层具有0.9的尺度,并且在它们之间的所有层是规则间隔的。我们为默认边界框添加不同的长宽比,并将它们表示为 a r ∈ 1 , 2 , 3 , 1 2 , 1 3 a_r \in {1, 2, 3, \frac{1}{2}, \frac{1}{3}} ar1,2,3,21,31。我们可以计算每个边界框的宽度( w k a = s k a r w_k^a = s_k\sqrt{a_r} wka=skar )和高度( h k a = s k / a r h_k^a = s_k / \sqrt{a_r} hka=sk/ar )。对于长宽比为1,我们还添加了一个默认边界框,其尺度为 s ’ k = s k s k + 1 s’_k = \sqrt{s_k s_{k+1}} sk=sksk+1 ,在每个特征映射位置得到6个默认边界框。我们将每个默认边界框的中心设置为 ( i + 0.5 ∣ f k ∣ , j + 0.5 ∣ f k ∣ ) (\frac{i+0.5}{|f_k|}, \frac{j+0.5}{|f_k|}) (fki+0.5,fkj+0.5),其中 ∣ f k ∣ |f_k| fk是第 k k k个平方特征映射的大小, i , j ∈ [ 0 , ∣ f k ∣ ) i, j\in [0, |f_k|) i,j[0,fk)。在实践中,也可以设计默认边界框的分布以最适合特定的数据集。如何设计最佳平铺也是一个悬而未决的问题。

通过将所有默认边界框的预测与许多特征映射所有位置的不同尺度和高宽比相结合,我们有不同的预测集合,涵盖各种输入目标大小和形状。例如,在图1中,狗被匹配到4×4特征映射中的默认边界框,而不是8×8特征映射中的任何默认框。这是因为那些边界框有不同的尺度,不匹配狗的边界框,因此在训练期间被认为是负例。

3.4 难例挖掘(Hard negative mining)

在匹配步骤之后,大多数默认边界框为负例,尤其是当可能的默认边界框数量较多时。这在正的训练实例和负的训练实例之间引入了显著的不平衡。我们不使用所有负例,而是使用每个默认边界框的最高置信度损失来排序它们,并挑选最高的置信度,以便负例和正例之间的比例至多为3:1。我们发现这会导致更快的优化和更稳定的训练。

3.5 数据增强

为了使模型对各种输入目标大小和形状更鲁棒,每张训练图像都是通过以下选项之一进行随机采样的:
(1)使用整个原始输入图像。
(2)采样一个图像块,使得与目标之间的最小Jaccard重叠为0.1,0.3,0.5,0.7或0.9。
(3)随机采样一个图像块。
每个采样图像块的大小是原始图像大小的[0.1,1],长宽比在 1 2 \frac {1} {2} 21和2之间。如果实际边界框的中心在采用的图像块中,我们保留实际边界框与采样图像块的重叠部分。在上述采样步骤之后,除了应用类似于光度变形之外,将每个采样图像块调整到固定尺寸并以0.5的概率进行水平翻转。

4. PS

总的来说这篇文章的思想不难理解,但是在实际中它的代码实现还是值得研究的,SSD的Caffe实现版本中添加了一些层,诸如:prior_box_layer、multibox_loss_layer、detection_output_layer以及bbox_util都是值得一看的,其中能了解到它很多内部实现的原理。