论文: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算法对小目标不够鲁棒的最主要的原因是浅层feature map的表征能力不够强。
DSSD就使用了更好的基础网络(ResNet)和Deconvolution层,skip连接来给浅层feature map更好的表征能力。
这也是DSSD算法的核心思想。
具体怎么做?
 既然DSSD算法的核心思想就是提高浅层的表征能力,首先想到的肯定是将基础网络由VGG换成ResNet,
更深的网络表征能力就更强这基本成为了大家的共识了。
上表说明了在VGG和ResNet上哪些层作为最后的预测feature layer。如果不明白这张表的话,再仔细看一下SSD的网络结构图
就知道怎么回事了。
 另外值得一提的是,这些层可不是随便选的,大致要和VGG对应,且感受野也要对应,这样才能保证效果会提高,要不然反而会
变差也不好说。
看看加上ResNet的SSD的效果。
实验结果很明显,图片大小不够的时候,ResNet的SSD和VGG的SSD效果其实相当,整体甚至还会稍微差一些。
(这里作者没有分析,我对这块也是不明白,为什么呐?欢迎讨论)。
到了512*512的尺度上时,ResNet的下过就明显要好了。尤其是标粗的小目标(bird)。
 这也印证了之前的分析,浅层更具有表征能力时,对小目标效果就会更好。
基于ResNet的实验,还没有完,在预测阶段作者同样做了一些工作就是修改一下预测模块。这个灵感作者说是来自MS-CNN指
出改善每个任务的分支网络同样可以提高准确率。
作者使用了四种不同的预测模块。如下图:
Prediction Module :
这四个不同的预测模块就不细讲了,其实就是将ResNet进行到底,预测阶段同样是用这个思路。
效果确实得到了提高,如下表:
                                    
基于ResNet的实验基本做完了,下面就看这篇文章的最重要的点,Deconvolution模块的使用。
Deconvolution Module:
在第一张图片中的这个小圆就是代表了 Deconvolution Module 。它的结构如下图所示:
被红色框部分圈住的可以有两种连接方式,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:

目标检测:SSD改进之DSSD的论文详解相关推荐

  1. 【目标检测算法-锚框公式推导及代码详解】

    目标检测算法-锚框公式推导及代码详解 0 沐神对锚框的宽高计算并未推导以及讲解 1 锚框宽高公式推导 1.1 基础概念 1.2 锚框宽高公式推导 1.3 图片验证计算 1.4 小结 2 代码详解 2. ...

  2. CNN目标检测(一):Faster RCNN详解

    ↑↑↑↑目录在这里↑↑↑↑↑ Faster RCNN github : https://github.com/rbgirshick/py-faster-rcnn Faster RCNN paper : ...

  3. [转]CNN目标检测(一):Faster RCNN详解

    https://blog.csdn.net/a8039974/article/details/77592389 Faster RCNN github : https://github.com/rbgi ...

  4. Transformer | DETR目标检测中的位置编码position_encoding代码详解

    本文主要描述的是DETR论文中的position_encoding,详细DETR论文解析可参考 论文篇 | 2020-Facebook-DETR :利用Transformers端到端的目标检测=> ...

  5. 【目标检测】IoU(交并比)详解及代码实现

    1. IOU概述 IoU的全称为交并比(Intersection over Union),是目标检测中使用的一个概念,IoU计算的是"预测的边框"和"真实的边框" ...

  6. 目标检测特殊层:ROI Align层详解

    ROI Align 是在Mask-RCNN这篇论文里提出的一种区域特征聚集方式, 很好地解决了ROI Pooling操作中两次量化造成的区域不匹配(mis-alignment)的问题.实验显示,在检测 ...

  7. 目标检测之两阶段算法--Fast R-CNN详解

    论文题目:<Fast R-CNN> 论文地址:Fast R-CNN 1. 概述 之所以提出Fast R-CNN,主要是因为R-CNN存在以下几个问题:1.训练分多步.通过上一篇博文我们知道 ...

  8. 【目标检测-YOLO】YOLOv5-v6.0-网络架构详解(第二篇)

    参考:YOLOv5-5.0v-yaml 解析及模型构建(第二篇)_星魂非梦的博客-CSDN博客 前文:YOLOv5-v6.0-yolov5s网络架构详解(第一篇)_星魂非梦的博客-CSDN博客_yol ...

  9. 目标检测系列——开山之作RCNN原理详解

最新文章

  1. 用模板实现单例模式(线程安全)、模板方式实现动态创建对象
  2. python turtle循环图案-Python绘图Turtle库详解
  3. NHibernate初学者指南(2):一个完整的例子
  4. mui框架之a标签无法跳转的问题
  5. 【深度学习】新人如何入门Pytorch的路线?有哪些资源推荐?
  6. 机器学习基础(五十二)—— 朴素贝叶斯细节
  7. CAN分析仪创芯科技使用(Ubuntu)
  8. NUDT硕士论文LaTeX模板
  9. 单元格下拉全选快捷键_复制全选快捷键是什么
  10. html电话号码隐藏样式,打电话不显示号码怎么设置(教你打电话隐藏号码)
  11. python猜数字统计游戏次数_猜数字游戏的实现(Python3.5)
  12. 一枚钻戒如何成功借势世界杯,与粉丝秀恩爱
  13. SpringDataJPA教程 三种配置方式
  14. 智能养老手环能够防止老年人出现安全意外
  15. 搜狗输入法【U/V】模式你“造”吗?
  16. 从C快速入门C++ (命名空间、引用、函数重载)
  17. MDN-CSS-排版社区大学首页
  18. 使用特网云云主机的最显着原因之一
  19. 物理学在计算机中的物理应用,物理学在计算机中的应用.doc
  20. 《Windows程序设计》读书笔十 菜单和其他资源

热门文章

  1. 四款好用的在线表单工具盘点
  2. Navicat提示Access violation at address 004E9844 in module ‘navicat.exe’
  3. Bean是如何创建的?
  4. 一篇读懂:Android手机如何通过USB接口与外设通信(附原理分析及方案选型)
  5. 5 款可替代 du 命令的工具
  6. pm961 mysql_搭建Memcache服务详解
  7. 中国新冠疫情数据可视化
  8. 【echarts】在柱状图上方显示数值
  9. MongoDB——文档操作(更新文档)
  10. HTML5实现的树叶飘落动画特效