SSD目标检测算法改进DSSD(反卷积)

 

转自: https://blog.csdn.net/u010725283/article/details/79115477

论文:DSSD : Deconvolutional Single Shot Detector

 

论文地址:https://arxiv.org/abs/1701.06659

 

代码:https://github.com/chengyangfu/caffe/tree/dssd

 

DSSD是2017年的CVPR,二作就是SSD的一作Wei Liu。另外值得一提的是,一作Cheng Yang Fu和Wei Liu大神已经合作发表

 

好几篇文章。

 

SSD的作者们对其做的改进肯定会有些方向性,毕竟他们可是深知SSD的优点和缺点啊!

 

个人的一些见解:

 

 对state of the art的算法进行改进的时候最主要的是找准方向。

大家最常用的思路就是找缺点,比如ssd算法一个比较大的缺点是对小目标不够鲁棒。

 但是这种缺点在目前基于CNN的目标检测算法都很常见。无非是有些算法相对好一些而已。

那么,知道了缺点了,如何去改进呐?改进的方法是不是具有普遍性?能不能扩展这种改进方法?

 

 如果能回答了以上这些问题的改进方法,是具有方向性的,就是在此基础上,再做一些工作就可以更进一步的去改进算法。

 

或者这类改进算法并不是只适应一种算法,比如Faster RCNN中的RPN网络和Anchor 的思想,SPPNet中的SPP layer等等,

 

这些改进同样适应其他算法,Fast RCNN使用了SPP layer,改进成为了ROI Pooling。

 

 

DSSD的贡献:

 

 

 本文最大的贡献,在常用的目标检测算法中加入上下文信息。通俗点理解就是,基于CNN的目标检测算法基本都是利用一层的

 

信息(feature map),比如YOLO,Faster RCNN等。还有利用多层的feature map 来进行预测的,比如ssd算法。那么各层之间的信息的结合并没有充分的利用。

 

DSSD算法就是为了解决这个问题的。

 

DSSD算法的由来:

 

 

 既然是SSD算法的改进算法,我们先看看SSD算法的一些缺点。

 

SSD算法的缺点众所周知了,就是对小目标不够鲁棒。我们先分析一下为什么会对小目标不够鲁棒的。

 

 先回忆一下YOLO算法,把检测的图片划分成14*14的格子,在每一个格子中都会提取出目标检测框,最初的时候每一个格子

 

只会提取出一个目标框,这时问题就很大,因为可能会有两个目标落入一个格子中,那么就会出现漏检。

 

顺理成章的是,在一个格子中提取出多个检测框来匹配目标,这时我们可以使用Anchor的思路,一个格子中加上6到9个不同的

 

检测框。这样就可以匹配大部分目标了。这也算解决了漏检问题了。

 

 但是还是会有问题的,比如我们的9个Anchor比较大的话,比较小的目标就又无法匹配到了。那怎么解决呐?

 

SSD的思路就是我可以在更潜的一些层(feature map)上,来更好的匹配小目标。换句话说就是把图片分成的格子更小了,

 

一张图片分成的格子的数目变多了。那么这样再在这些格子中使用Anchor ,这样漏检的概率就会大大减小了。

 

所以SSD的mAP比YOLO提高了不少。

 

但是!

 

 

在浅层提取的feature map表征能力不够强,也就是浅层的feature map中每个格子也可以判断这个格子中包含的是哪一个

 

类,但是不够那么确定!

 

 可能会出现混淆。就是框是标对了,但是分类有可能出错,或者置信度不够高,不确定框里面的东西是什么?(有可能是分错

 

类,也有可能是背景误认为成目标)。

 

这样同样会出现误检和漏检。这种情况对于小目标出现的概率更高。所以SSD算法对小目标还是不够鲁棒。

 

那怎么办?

 

DSSD的网络结构:

 

 

SSD目标检测算法改进DSSD(反卷积)_第1张图片

 

 经过以上的分析我们知道,SSD算法对小目标不够鲁棒的最主要的原因是浅层feature map的表征能力不够强。

 

DSSD就使用了更好的基础网络(ResNet)和Deconvolution层,skip连接来给浅层feature map更好的表征能力。

 

这也是DSSD算法的核心思想。

 

具体怎么做?

 

 既然DSSD算法的核心思想就是提高浅层的表征能力,首先想到的肯定是将基础网络由VGG换成ResNet,

 

更深的网络表征能力就更强这基本成为了大家的共识了。

 

SSD目标检测算法改进DSSD(反卷积)_第2张图片

 

上表说明了在VGG和ResNet上哪些层作为最后的预测feature layer。如果不明白这张表的话,再仔细看一下SSD的网络结构图

 

就知道怎么回事了。

 

 另外值得一提的是,这些层可不是随便选的,大致要和VGG对应,且感受野也要对应,这样才能保证效果会提高,要不然反而会

 

变差也不好说。

 

看看加上ResNet的SSD的效果。

 

SSD目标检测算法改进DSSD(反卷积)_第3张图片

 

实验结果很明显,图片大小不够的时候,ResNet的SSD和VGG的SSD效果其实相当,整体甚至还会稍微差一些。

 

(这里作者没有分析,我对这块也是不明白,为什么呐?欢迎讨论)。

 

到了512*512的尺度上时,ResNet的下过就明显要好了。尤其是标粗的小目标(bird)。

 

 这也印证了之前的分析,浅层更具有表征能力时,对小目标效果就会更好。

 

基于ResNet的实验,还没有完,在预测阶段作者同样做了一些工作就是修改一下预测模块。这个灵感作者说是来自MS-CNN指

 

出改善每个任务的分支网络同样可以提高准确率

 

作者使用了四种不同的预测模块。如下图:

 

Prediction Module :

 

SSD目标检测算法改进DSSD(反卷积)_第4张图片

 

这四个不同的预测模块就不细讲了,其实就是将ResNet进行到底,预测阶段同样是用这个思路。

 

效果确实得到了提高,如下表:

                                    SSD目标检测算法改进DSSD(反卷积)_第5张图片

 

基于ResNet的实验基本做完了,下面就看这篇文章的最重要的点,Deconvolution模块的使用。

 

Deconvolution Module:

 

在第一张图片中的这个小圆就是代表了 Deconvolution Module 。它的结构如下图所示:

 

SSD目标检测算法改进DSSD(反卷积)_第6张图片

被红色框部分圈住的可以有两种连接方式,Eltw Product其实就是矩阵的点积,还有sum的形式就是求和。

在caffe中的可以用下面的prototxt文件来描述。

 

  1. layer {  
  2.   name: "fuse"  
  3.   type: "Eltwise"  
  4.   bottom: "A"  
  5.   bottom: "B"  
  6.   top: "C"  
  7.   eltwise_param {  
  8.     operation: SUM  
  9.   }  
  10. }  

operation参数表明使用哪种操作,SUM是默认操作,就是将A和B相加减。PROD表示点积,MAX求最大值。

 

如上表,结果是使用prod的效果会更好一点。

 

将ResNet,Deconvolution Module,Prediction Module结合在一起就是最终的DSSD算法了。

 

所有新的网络的提出,如果没有讲是如何训练的,我觉得都是在耍流氓。

 

训练部分作者基本沿用SSD的训练方法。

 

当然,ResNet要比VGG的收敛速度要快很多。

 

总结:提高浅层的表征能力,是可以提高类似检测器对小目标的检测能力。按照这个方向走是正确的。

参考:

DSSD:https://arxiv.org/abs/1701.06659

caffe中一些特殊的层:http://blog.csdn.net/u013989576/article/details/73294131

SSD

MS-CNN:

你可能感兴趣的:(神经网络,图像识别)