DSOD检测算法系列
参考转自:
https://blog.csdn.net/sinat_37532065/article/details/86655088
https://blog.csdn.net/weixin_41278720/article/details/83050824
一、DSOD
论文:DSOD: Learning Deeply Supervised Object Detectors from Scratch ICCV2017
github:https://github.com/szq0214/DSOD
1.简介
由于深度学习需要大量的训练数据,而针对特定任务需求的训练样本往往是有限的,通常情况下,目标检测算法会先使用在海量数据(如ImageNet数据集)上训练好的分类模型对需要训练的网络参数进行初始化(pre-train预训练),然后使用训练样本对网络参数进行微调(fine-tune)。
这样采用预训练模型+fine-tune的好处是:
(1)可以将许多优秀的开源模型直接用于检测;
(2)训练数据相对较少,可以快速获取最终模型;
同时也存在以下几点问题:
(1)基于ImageNet数据集的预训练分类模型,网络结构复杂,参数量大,其特定的网络结构也限制了目标检测模型的设计空间,难以对模型的结构进行灵活地调整;
(2)分类任务和检测任务的损失函数和类别分别不同,两者的搜索/优化空间是不一样的,在分类任务上生成的预训练模型在检测任务上得到的结果是局部最优的,而非全局最优的;
(3)fine-tune能够减少不同目标类别分布的差异性,但是对于和ImageNet数据集差异较大的图片(如深度图、医学图像)效果不佳;
因此,这篇文章提出了一种无需预训练,直接基于训练样本从零开始训练目标检测模型的方法。
本文的贡献:
(1)提出DSOD算法,能够从零开始训练检测网络,且效果可以与目前性能最好的模型相媲美;
(2)提出并验证了一系列方法从零开始高效训练网络;
2.网络结构
1)总体框架
DSOD的网络分为两个部分: 提取特征的backbone网络和预测结果的前端网络。backbone网络是深度监督网络DenseNets的变形,由stem block、四个dense blocks、两个2个transition layers和2个transition w/o pooling layers组成。预测网络同样使用dense结构融合多尺度特征进行预测。图1展示了DSOD的预测网络,表1展示了整个网络结构细节。
每个网络部分和设计原则如下:
- Proposal-free
目前目标检测算法分为三类:①需要借助类似selective search的方法生成目标候选区域,如R-CNN和Fast R-CNN;②通过RPN网络生成相对较少的候选区域,如Faster R-CNN和R-FCN;③不需要生成候选区域,直接回归目标位置和bbox坐标的单步网络,如YOLO和SSD。事实上,只有one-stage网络能够在没有预训练模型的情况下成功收敛。论文猜测前两种算法的RoI池化部分,池化生成特征是针对每个候选区域的,这阻碍了梯度region level反向传播到卷积层。基于候选区域的算法在有预训练模型的情况下表现很好,因为RoI池化之前的层得到了很好的初始化,但是并不适应于从零开始训练。
因此,本文设计的第一个原则就是:采用不需要候选区域的算法从零训练检测网络。
- Deep Supervision
深度监督的效力已经在许多网络中得以证明,核心思想是将损失函数直接作用在位置较前的隐藏层上,而不是只作用在输出层上,从而使梯度信号能传递到靠近输入层的神经元,以缓解梯度消失的问题。但是对于目标检测任务,还需要引入作用在每个隐藏层的companion 损失。因此本文使用了深度监督的方法,即DenseNet提出的dense layer-wise connection。
基本结构为dense block,所谓dense block,就是每一个层都与其前面所有的层连接,因此在使用单一的损失函数时,前面的层也可以接收到目标函数的监督信号。
此外,论文还引入了transition w/o pooling layer,其目的是在使用更多dense block的同时,仍然能保持特征映射图最终的分辨率。在原DenseNets算法中,每一个transition layer都包含一次池化操作,这会降低特征图的分辨率,因此要想保持网络输出的尺寸不变,则dense block的数量必须是固定的(DenseNet是4个dense block)。要构造更深的网络,只能考虑在block内部添加层,而transition w/o pooling layer只使用了1*1的卷积,而没有进行池化操作,故其不会降低特征映射图的分辨率,所以论文使用了transition w/o pooling layer来消除网络结构对dense block数量的限制。
- Stem Block
受Inception-v3和v4的启发,论文构建stem block时使用的是三个层叠的33卷积层和一个22的最大值池化层,第一个卷积层后设置步长为2的池化层,后两个卷积层后设置步长为1的池化层。这样做的原因是,论文发现与DenseNets原有的结构(77的卷积层和33的最大值池化层)相比,这样的设计可以减少输入图像中的信息丢失,从而训练出更加鲁棒的检测器。
- Dense Prediction Structure
图1对比了SSD的plain structure和本文提出的前端网络的Dense structure。SSD在设计预测层为沙漏结构,对于300x300的输入来说,使用6个不同尺度的特征图进行预测。其中分辨率最大(38x38)的特征图取自backbone 网络的中间层,能够检测小目标对象,剩下的五个特征图取自backbone的高层输出。每两个不同尺度的特征图之间使用的是具有bottleneck结构的plain transition layer。
在SSD的plain structure中,每一层特征是由其上一层特征直接转换而来,dense structure的每一层都结合了多个不同尺度层的信息,其结构如右图所示。简单来说,论文规定对于所有的预测层来说,输出具有相同的通道数。除第一个分辨率最大的特征层外,其它五个不同尺度特征层的输入有一半是前面的层经卷积的结果,而另一半的输入则直接由相邻前一层下采样得到,这样每一层便包含了其先前具有不同分辨率的所有层信息。下采样的具体实现过程是先做步长为2的池化操作,使得特征图尺寸一致以便做连接,然后使用1*1的卷积减少50%的输出channel,从而保证特征图数量的匹配。池化操作先于卷积操作是为了减少计算的成本。
对于每个尺寸特征图,一半的特征来是前面的特征经过一系列卷积得到,一半是相邻高分辨率特征下采样得到。
二、Tiny-DSOD
论文:Tiny-DSOD: Lightweight Object Detection for Resource-Restricted Usages
github:https://github.com/lyxok1/Tiny-DSOD
Tiny-DSOD是为了能在移动端等设备上部署DSOD模型,所做的改进版,轻量高效,达到了同等开销下的state-of-the-arts。
本文的贡献:
(1)结合DenseNet和深度可分离卷积,提出了Depthwise dense block (DDB) ;
(2)为了融合前面层的不同大小特征图的语义信息,提出了轻量级的D-FPN;
(3)结合提出的Depthwise dense block (DDB)和D-FPN,提出Tiny-DSOD算法。
1. 基于DDB的主干网络
基于DSOD中提出的思想,本文构建了DenseNet型骨干网络,其中主要是对原版DenseNet中的dense block做了改进,引入了depthwise卷积,提出了DDB。
首先对于MobileNet-V2中带有残差连接的block结构,需要注意残差连接支路和特征提取支路最后是Add在一起的:
图2基于MobileNet-V2,提出第一种DDB,DDB-a模块,如图3,其结构与MobileNet-V2大致相同,只是最后将Add操作替换成了拼接操作,如下图所示。DDB-a有两个缺点:(1)复杂度高,,这限制了连续堆叠的个数,如果堆叠的多了增长率就必须设置的很小;(2)连续堆叠时,两个block之间存在连续的1x1卷积,这会产生大量潜在的冗余参数。
图3DDB-b模块。考虑上述因素,提出第二种DDB,如图4所示。首先通过1x1卷积将通道数压缩到增长率g个,然后通过3x3 depthwise卷积抽取特征,最后直接与block的输入进行拼接。复杂度为,比DDB-a小。后续实验还证明DDB-b比DDB-a更有效,所以Tiny-DSOD最终选择DDB-b作为baseline。
图4完整backbone网络结构如表2所示,Stem部分每个卷积层后面都加了BN层和ReLU激活,Extractor部分一共有4个dense stage。每个dense stage中包含若干个DDB-b块,相邻的dense stage直接通过transition layer连接,transition layer通过1x1卷积融合不同通道间的信息,同时压缩通道数(非w/o的transition layer还可以缩放尺度)。增长率设计方面,随着stage加深,增长率g也逐渐变大,这有助于降低计算开销。后续实验表明,在模型大小相当的情况下,设置均匀的增长率更有助于提高模型精度。
表22. 基于D-FPN的前端网络
在SSD和DSOD中,虽然预测阶段使用了Multi-scale的信息,但是在预测层的前几层,还是只用了最大的scale的信息(只有浅层特征),缺乏语义级别的信息。为了克服这个弱点,作者借鉴了FPN的思想,将高层特征与低层特征融合然后再去预测,并且同样借助depthwise卷积改善效率,如图5。
图5前端网络主要由正向路径和反向路径组成,正向路径进行1/2下采样,反向路径进行2x上采样。
下采样操作,通过一个双分支结构进行,并且3x3卷积采用了depthwise卷积,两路分支通过拼接操作结合。
在传统FPN中,通过deconvolution来进行上采样,复杂度较高。为了避免该问题,作者设计了一个新的上采样操作,首先通过双线性插值恢复大小,然后通过3x3 depthwise卷积抽取特征,如图6。
一句话概括为,每个通道输出的特征等于与其对应的输入通道通过双线性插值(求和符号里面的内容)以后再与对应的depthwise卷积核卷积(Wc)得到 **。
图6其数学形式为:
最后,将两条路径对应大小的feature map逐元素相加。实验表明,在略微增加计算成本的情况下,D-FPN的引入可以得到相当大的精度提升。