目标检测之DSOD:SSD算法的优化

github代码:https://github.com/szq0214/DSOD

由于深度学习需要大量的训练数据,而针对特定任务需求的训练样本往往是有限的,通常情况下,目标检测算法会先使用在海量数据(如ImageNet数据集)上训练好的分类模型对需要训练的网络参数进行初始化(pre-train,预训练),然后使用训练样本对网络参数进行微调(fine-tune)。 

但这种预训练结合微调的方法存在以下几点问题:(1)对于目标检测任务而言,由于其损失函数和目标类别分布与分类模型存在差异,其搜索/优化空间是不同的,所以使用预训练模型容易求得局部而非全局最优解。虽然利用训练数据对网络进行微调可以在一定程度上缓解这种现象,但仍然不能从本质上解决问题。(2)预训练模型一般是基于RGB图像训练得到的,对于差异较大的问题域,如针对深度图像、多光谱图像和医学影像的目标检测,要从预训练的分类模型迁移学习为目标检测模型难度非常大。(3)预训练的分类模型通常具有较为复杂的网络结构,不仅参数规模大,其特定的网络结构也限制了目标检测模型的设计空间,难以对模型的结构进行灵活地调整。 
因此,这篇文章提出了一种无需预训练,直接基于训练样本来训练目标检测模型的方法。

算法框架

网络可以分为两个部分:用于特征提取的backbone sub-network和用于预测的front-end sub-network。backbone sub-network使用的是DenseNets的变形,含有一个stem block,4个dense block,2个transition layer和2个transition w/o pooling layer;front-end sub-network基于多尺度的响应图做出预测,同样使用dense的架构。其网络结构如下图所示: 
目标检测之DSOD:SSD算法的优化_第1张图片

网络设计原则

论文提出了四点网络设计原则: 
(1)proposal-free 
目标检测算法一般可以分为三类:一类需要借助额外的算法来产生目标候选区域,如R-CNN、Fast R-CNN;一类通过自身的RPN(Region Proposal Network)结构生成proposal,如Faster R-CNN、R-FCN;最后一类则直接回归目标的位置,而不需要提取proposal,如YOLO、SSD。 
论文发现,只有不基于region proposal的方法,即第三类方法,才可以不使用预训练模型直接训练网络。原因是对于前两种方法来说,RoI池化过程是基于每一个proposal的,这阻碍了梯度从region level传播到整个卷积层,所以对于这两种方法来说,使用预训练模型的参数对RoI前面的层进行初始化是有必要的。 
因此,论文在设计网络结构时,是基于proposal-free的SSD架构。 
(2)deep supervision 
deep supervision的核心思想是将损失函数作用在隐含层上,而不是仅仅作用在输出层上,从而使梯度信号能传递到靠近输入层的神经元,以缓解梯度消失的问题,但其需要对隐含层引入companion objective,比较复杂,因此论文选用的是DenseNets所提出的dense layer-wise connection的结构。 
其基本结构为dense block,所谓dense block,就是每一个层都与其前面所有的层连接,因此在使用单一的损失函数时,前面的层也可以接收到目标函数的监督信号。 
此外,论文还引入了transition w/o pooling layer,其目的在于使得在使用更多dense block的同时,仍然能保持特征映射图最终的分辨率。在原DenseNets算法中,由于每一个transition layer都包含一次池化操作,这会降低特征图的分辨率,因此要想保持网络输出的尺寸不变,则dense block的数量必须是固定的,要构造更深的网络,只能考虑在block内部添加层。而transition w/o pooling layer只使用了1*1的卷积,而没有进行池化操作,故其不会降低特征映射图的分辨率,所以论文使用了transition w/o pooling layer来消除网络结构对dense block数量的限制。 
(3)stem block 
受Inception-v3和v4的启发,论文构建stem block时使用的是三个层叠的3*3卷积层和一个2*2的最大值池化层,第一个卷积层后设置步长为2的池化层,后两个卷积层后设置步长为1的池化层。这样做的原因是,论文发现与DenseNets原有的结构(7*7的卷积层和3*3的最大值池化层)相比,这样的设计可以减少输入图像中的信息丢失,从而训练出更加鲁棒的检测器。 
(4)dense prediction structure 
论文借鉴了SSD的网络结构,但使用了dense layer-wise connection的思想,其与plain connection的对比如图所示。 
目标检测之DSOD:SSD算法的优化_第2张图片
左图为SSD的结构。SSD在进行预测时,使用了6个尺度的特征映射图,其中分辨率最高的特征图取自backbone sub-network的中间层,分辨率为38*38,用来加强对小尺寸目标的检测能力。每两个不同尺度的特征图之间使用的是具有bottleneck结构的transition layer。 
可以看到,在SSD中,每一层是由其上一层直接转换而来,这里论文改为使用dense的结构,使得每一层都结合了多个不同尺度层的信息,其结构如右图所示。为了简单起见,论文规定预测所基于的所有特征层都具有相同的输出维度,除第一个尺度的层外,其它层都有一半的特征图是前面的层经卷积操作转换而来,而另一半的特征图则直接由邻接的具有更高分辨率的层下采样而来,这样每一层便包含了其先前的具有不同分辨率的所有层信息。下采样的具体实现过程是先做步长为2的池化操作,使得特征图尺寸一致以便做连接,然后使用1*1的卷积减少50%的输出channel,从而保证特征图数量的匹配。池化操作先于卷积操作是为了减少计算的成本。

实验结果

论文根据它所提出的网络设计原则对SSD重新进行了设计,以更小巧的模型架构取得了超越state of the art方法的结果,其不仅有实时的检测速度,且网络参数数量仅为SSD的1/2,R-FCN的1/4,Faster RCNN的1/10。论文的代码和模型地址为:DSOD代码 
论文通过实验对其提出的几点网络设计原则进行了验证,实验结论如下: 
(1)Proposal-free Framework 
不使用预训练模型,Faster R-CNN和R-FCN无法收敛,SSD可以收敛但比使用预训练模型时效果差很多。 
(2)Deep Supervision 
使用Deep Supervision可以在不使用预训练模型的情况下,使网络的检测精度超过预训练结合微调的SSD网络。 
 (5) Transition w/o Pooling Layer: 
使用Transition w/o Pooling Layer可以将性能提高1.7%。 
(3)Stem Block 
使用Stem Block可以将性能提高2.8%。 
(4)Dense Prediction Structure: 
由于需要进行下采样等操作,使用Dense Prediction Structure算法运行速度会比plain structure稍慢,但可以将检测精度提高0.4%,同时减少3.4M的参数数量。 
此外,论文还对DSOD进行了预训练,得到了一个很有意思的实验结果:使用预训练结合微调的方式,DSOD的性能比不使用预训练模型时降低了0.4%,其原因有待深入研究。

总的来说,这篇文章摆脱了基于深度学习的目标检测算法对预训练模型的依赖,其利用有限的训练数据通过设计更为精巧的网络结构实现对模型的有效训练,大幅度缩减了需要训练的网络参数数量,具备在手机等资源有限的设备上进行应用的潜能,并且可以对网络结构进行灵活设计,还具备state-of-the-art的性能。

你可能感兴趣的:(目标检测,DSOD)