computer vision笔记:SSD和DSSD

最近看了目标检测中比较经典的SSD,觉得有不少挺好的创新。之前的文章中也提到过,由于one-stage的检测方法和two-stage的检测方法都存在着速度与精度平衡的问题,所以SSD在借鉴YOLO的网络架构和Faster RCNN中的anchor box实现多尺度的思想的基础上,设计出了效果更好的算法。而DSSD是SSD众多改进版本中比较突出的一支,主要是牺牲了fps来换取精度。本篇文章我就不花时间去写两个模型的流程了,主要是记录一些我觉得比较好的点。

References

电子文献:
https://zhuanlan.zhihu.com/p/33544892
https://www.cnblogs.com/edbean/p/11335139.html
https://www.zhihu.com/question/58200555


SSD和DSSD

背景

在SSD之前,目标检测主要有两种思路,一种是以YOLO为代表的基于一体化卷积网络的检测,即使用端到端的one-stage检测方法,其主要思路是均匀地在图片的不同位置进行密集抽样,抽样时可以采用不同尺度和长宽比,然后利用CNN提取特征后直接进行分类与回归,整个过程只需要一步,可参考deep-learning笔记:端到端学习;另一种思路是以RCNN系列为代表的先提取候选区域再进行分类与回归的two-stage检测方法,详见computer-vision笔记:RPN与Faster RCNN。前者的优势在速度,但是均匀的密集采样的一个重要缺点是训练比较困难,这主要是因为正样本与负样本(背景)极其不均衡,导致模型准确度稍低;后者的优势在精度,但总是无法取得平衡且更好的效果。

SSD

本文要介绍的SSD算法,其英文全名是Single Shot MultiBox Detector,其中Single shot指明了SSD算法属于one-stage方法,MultiBox指明了SSD使用了多框预测。

上图是几种方法的基本框架对比图,对于Faster RCNN,其先通过CNN得到候选框,然后再进行分类与回归,而YOLO与SSD可以一步到位完成检测。
相比YOLO,SSD采用CNN来直接进行检测,而不是像YOLO那样在全连接层之后做检测,这是SSD相比YOLO的其中一个不同点。另外还有两个重要的改变:一是SSD提取了不同尺度的特征图来做检测,大尺度特征图(较靠前的特征图)可以用来检测小物体,而小尺度特征图(较靠后的特征图)用来检测大物体(见下图);二是SSD采用了不同尺度和长宽比的先验框(Prior boxes,Default boxes,在Faster RCNN中叫做锚,Anchors)。YOLO算法缺点是难以检测小目标,而且定位不准,而上面这几点重要的改进使得SSD在一定程度上克服这些缺点。

DSSD

DSSD其实就是D加SSD。其中D代表反卷积,其重要意义就是可以提升分辨率,而提升分辨率的重要效果就是小物体检测性能提升;SSD代表其使用的backbone,这部分的与SSD的结构上无较大差异,主要是将VGG换为了更深的ResNet-101来获得更高的准确度,并在其后加入数个卷积层。单纯加卷积层并不能直接提升精度,但是在这之后加入后文提到的prediction module后就能极大地提升精度。
由于利用single-scale输出预测multi-scale物体在精度方面具有一定劣势,因此SSD利用各层的feature map的输出感受野各不相同的特性,用大的感受野检测大型物体,用小的感受野检测小型物体。但是若直接利用浅层的输出检测小型物体,由于浅层网络提取的语义信息较少(含有较多的背景和噪声),不够鲁棒,所以最终表现还不是很好。
这里我想介绍一下稍早于DSSD的FPN,它先还是一如既往地使用bottom-up的深度网络,然后又构建top-down网络进行上采样操作,这不仅使得它可以利用经过top-down模型后的那些上下文信息即高层语义信息,也可以在更大的feature map上面进行操作,提高了分辨率,可以获得更多关于小目标的有用信息。此外,不同于许多算法(SSD等)采用多尺度特征融合之后再做预测的方式,FPN的预测是在不同的特征层独立进行的。
于是DSSD从中得到启发,利用FPN的思想来改进SSD,它使用反卷积和skip connection扩大图像,这样除了能提升分辨率,还能保证语义信息充足。关于反卷积的实现,可参考computer-vision笔记:上采样和下采样
这样就形成了一个“宽-窄-宽”沙漏型的结构,其中网络的中间层用于编码(encode)输入图像的信息,然后再逐渐用更大的层来自上而下地解码(decode)在这整个图像上的图。要注意的是,这里的反卷积并不能复原原来的图像。类似的思想可以看一下我整理的computer-vision笔记:图像金字塔与高斯滤波器


空洞卷积(atrous convolutions)

在SSD中,作者采用了一种名为空洞卷积(atrous convolutions,又名扩张卷积(dilated convolutions))的卷积方式,向卷积层引入一个称为“扩张率(dilation rate)”的新参数,该参数定义了卷积核处理数据时选取各值之间的间距。

空洞卷积的有效性基于一个假设,即紧密相邻的像素几乎相同,全部纳入会产生冗余,不如每隔H(hole size)个选取一个。
在相同的计算条件下,空洞卷积提供了更大的感受野。它经常用在实时图像分割中。当网络层需要较大的感受野,但计算资源有限而无法提高卷积核数量或大小时,可以考虑使用空洞卷积。

值得注意的是,空洞卷积在增大感受野的情况下也维持了分辨率(也就是说在相同感受野下分辨率更高),这在语义分割等问题中是比较实用的。此外,用步长为2的卷积操作代替池化也可以有效地减少分辨率的损失。


难例挖掘(hard negative mining)

首先介绍一下什么是难例。
根据IoU我们可以把采样获得的正负样本分成难易样本。
简单负样本:与GT没有任何交集。这种样本是最多的,在图像中随意采集往往都属于这一类。
简单正样本:与GT的交集远远大于阈值。也就是非常接近正确结果的。
困难负样本:与GT有交集,但小于阈值。
困难正样本:与GT有交集,且仅略大于阈值。
后面两种就是我们所说的难例,其loss较大。若在采样时难例占比太小,那么总体的loss就不大,这对训练来说是不利的。

因为本身正样本比较稀少,因此难例挖掘主要关注的是困难负样本,其基本策略是:

  1. 选取所有的正样本,数量记为k个。
  2. 对所有的负样本求loss,递减排序,选取前3k个。
  3. 用这k个正样本,3k个负样本参与损失计算与反向传播。(SSD和DSSD都采取了这样的比例)

smoothL1

在使用损失函数时,我们以往一般使用的是L1损失或者L2损失,而在Faster RCNN和SSD中都使用了smoothL1来作为损失函数。

为了更清楚地探究smoothL1的作用,我们将三者对x求导。

可以看到,对L1,其损失函数的导数随着x的增大而增大,这就导致了在训练初期,预测值与ground truth差异过于大时,损失函数对预测值的梯度十分大,训练不稳定。
对L2,其损失函数的导数为常数,这就导致了在训练后期,预测值与ground truth差异已经很小时,损失函数的导数的绝对值仍然为1,此时如果learning rate不变,那么模型参数将在稳定值附近波动,难以继续收敛以达到更高精度。一种思路是可以让学习率动态衰减,方法及实现详见deep-learning笔记:学习率衰减与批归一化
而smoothL1则从两个方面限制了梯度:
(1)当预测框与ground truth差别过大时,梯度值不至于过大。也就是避免了梯度爆炸,使得模型更加健壮。
(2)当预测框与ground truth差别很小时,梯度值足够小。
可以说smoothL1很好地解决了L1和L2的缺陷,且比较简便。


残差模块

在预测模块中,DSSD也对SSD进行了改进,在feature map之后还引入了残差模块来提升性能,如下图所示。

经比较可以发现,引入1个残差单元(即上方图c)的效果最好。


移去批归一化

在DSSD中,为了提高测试速度,作者还通过去掉BN层来提高模型的速度。
根据论文中的一组公式,我们可以简单地了解一下作者的方法。

实际上,作者的方法就是把批归一化进行变换拆分,从而将去掉的BN层加入到卷积层中。具体就是rewrite一个卷积层中如等式2所示的weight和如等式3所示的bias,从而就不需要等式4中相关的批归一化变量了。
作者通过实验也证明了这种方法对速度的提升(尽管还是很低)。


网络训练

因为在Fast RCNN和Faster RCNN中没有特征或者像素重新采样阶段,所以它们依赖于数据增强(data augmentation)。主要的方法有随机剪裁(random cropping),光度失真(random photometric distortion)和随机翻转(random flipping)。
在SSD中还包括了一种随机扩展(random expansion)的数据增强trick,这种trick对小检测对象比较有用。
DSSD在SSD的基础上进行训练,即先引入预训练得比较好的SSD,然后冻结SSD部分训练后面的部分,最后以较小的学习率训练整个网络来进行微调(fine-tuning)。


碰到底线咯 后面没有啦

本文标题:computer vision笔记:SSD和DSSD

文章作者:高深远

发布时间:2020年02月01日 - 11:34

最后更新:2020年02月15日 - 22:08

原始链接:https://gsy00517.github.io/computer-vision20200201113416/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%