SSD目标检测算法改进:DSOD(不需要预训练的目标检测算法)

论文的题目: DSOD: Learning Deeply Supervised Object Detectors from Scratch
论文下载链接: http://openaccess.thecvf.com/content_ICCV_2017/papers/Shen_DSOD_Learning_Deeply_ICCV_2017_paper.pdf
代码地址: https://github.com/szq0214/DSOD

ICCV2017的文章,有人说这篇文章并没有太多的创新点,也有人说这篇文章很有意思。为什么分歧那么大?

提示:如果想了解DSOD的所有细节,要先理解SSD算法,毕竟是对SSD的算法进行的改进。

DSOD解决的主要问题:
不追求速度,不追求精确度(当然准确度还是有所提高的),而是DSOD算法可以从零开始训练(start form scratch),不需要预训练。

自己的一些看法:
刚开始接触的时候,觉得这没什么啊?从零训练网络和预训练的有什么区别呐?而且有时候预训练还能更快的收敛,节省训练时间。
但是,预训练也是有坏处的,比如Faster RCNN,就是与训练的VGG,那么VGG前面的几层的网络结构就要固定了,是不能改变的。
这样我们就不能知道前面几层到底适不适合检测问题呐?

整体思路:
DSOD的整个网络结构看下表,
SSD目标检测算法改进:DSOD(不需要预训练的目标检测算法)_第1张图片
其实整个网络结构可以看成 Stem Block,Dense Block,Transition w/o Pooling Layer和最后的DSOD Prediction Layer组合而成。
分别来看这四个层的作用。

Stem Block:
    顾名思义,骨干结构,由一个3*3stride为2的卷积核和两个3*3stride为1的卷积核还有一个2*2的max pooling组成。有别于DenseNet的
一个7*7stride为2后接一个3*3 max pooling stride 为2的结构。
这个思路其实很常见,早在VGG中就开始使用了,Inception 系列使用的更多。另外这也是压缩网络的
一个重要思路,就是将大的卷积核换成较小的卷积核的组合。
为什么可以这样设计?
因为一个两个3*3的的卷积核和一个7*7的卷积核的感受野是一样的,这样的话,才能保证CNN看到的信息不会变少。
3*3stride为1的卷积加上一个2*2的stride为2的pooling也可以做到3*3stride为2的pooling。 所以这样设计是可行的。
对感受野不清楚的话,可以参考这篇: http://blog.csdn.net/u010725283/article/details/78593410
那么这样做有什么好处呐?
作者说是可以获得更多的信息(这个就需要看实验结果了)。

Dense Block:
这个也是DenseNet的dense layer-wise connection。先说这个Dense Block能做什么?
其实就是将前面层的feature map可以连接到现在层上,这样就可以更好的利用前面层的信息了。当然如何连接,可以参考DenseNet。

Transition w/o Pooling Layer
这个更简单了,其实就是一个1*1卷积,这个在VGG也使用了。把1*1卷积扩展加上合理解释的是NetWork in Net Work。其中好处就是feature map通道间的融合,
加上可以变换卷积核的数量。减少参数量等等好处。这个1*1找时间要好好研究一下。

DSOD Prediction Layer
     DSOD Prediction Layer层如下图的结构。
SSD目标检测算法改进:DSOD(不需要预训练的目标检测算法)_第2张图片
左边就是SSD算法的检测部分,右边是DSOD的,整个其实还是DenseNet的思想,即将前面层的feature map和后面层的feature map连接到一起。
这个过程并没有什么新意。

以上就是DSOD,如果看过R-FCN的话就会有所感悟,R-FCN其实就是将Faster RCNN的主网络换成了ResNet,但是呐,作者发现使用全卷积网络结构的ResNet并不适合Faster RCNN,就进行了改进。
那么DSOD我的理解就是,把SSD的主干网络换成了DenseNet,那么既然主干网络都换了,为什么最后的检测层不能使用DenseNet的思想呐!这样就有了DSOD的网络结构。
所以看到这,有些人就认为了,这个DSOD并没有什么新东西,都是拿先有的来组合一下,得到一个the state of art。
但是,作者却有意外之喜,就是DSOD可以从零开始训练,摆脱了在ImageNet大数据集上进行预训练。这样的检测网络可是独此一家。
这也是DenseNet有意思的地方。

另外又证明了DenseNet的思想是有效的,除了大家都在追求的更深的网络,更多的数据,还有一种思路是挖掘网络的能力,
充分挖掘网络各层蕴含的信息,同样可以提高网络能力。
换句话说就是对于一个数据集,并不是越深的网络就越好,还可以寻找更适合这个数据集的模型。

另外,DSOD的最大卖点就是可以从零开始训练,这个从零开始训练又有什么好的呐?
这个可以分两点来看,
  1. 在ImageNet上做预训练,然后迁移到其他领域,有些情况这种迁移是不合适的,比如医疗中的图像,多光谱图像,sar图像。
  2. 另外就是会预训练会限制网络的结构,比如常见的SSD,Faster RCNN等网络,他们的前几层是不能动的。这样就不能调整网络结构去适应更多计算有限的场景。比如在手机上部署这些网络。

参考:
DSOD: http://openaccess.thecvf.com/content_ICCV_2017/papers/Shen_DSOD_Learning_Deeply_ICCV_2017_paper.pdf
DenseNet: http://www.cs.cornell.edu/~gaohuang/papers/DenseNet-CVPR-Slides.pdf
感受野的计算: http://blog.csdn.net/u010725283/article/details/78593410

你可能感兴趣的:(计算机视觉,目标检测)