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的架构。其网络结构如下图所示: 

网络设计原则

论文提出了四点网络设计原则: 
(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的对比如图所示。 

左图为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:SSD算法的优化相关推荐

  1. 目标检测Yolo与SSD算法比较

    目标检测近年来已经取得了很重要的进展,主流的算法主要分为两个类型(参考RefineDet):(1)two-stage方法,如R-CNN系算法,其主要思路是先通过启发式方法(selective sear ...

  2. 目标检测系列:SSD系列SSD、FSSD、DSSD、DSOD

    SSD DSSD FSSD DSOD SSD 动机 目前目标检测的一些算法包括基于深度学习的,都是先假定一些候选框,接着对候选框内容进行特征提取再分类,然后再对边框的位置进行修正这一系列的计算,最典型 ...

  3. CVPR目标检测与实例分割算法解析:FCOS(2019),Mask R-CNN(2019),PolarMask(2020)

    CVPR目标检测与实例分割算法解析:FCOS(2019),Mask R-CNN(2019),PolarMask(2020) 目标检测:FCOS(CVPR 2019) 目标检测算法FCOS(FCOS: ...

  4. matlab corner 舍弃,CornerNet为什么有别于其他目标检测领域的主流算法?

    原标题:CornerNet为什么有别于其他目标检测领域的主流算法? 这篇文章为大家解读由密歇根大学 Hei Law 团队在 ECCV 2018发布的论文,一种新的目标检测算法. 目标检测算法在诸如自动 ...

  5. 目标检测中的遮挡问题及优化

    文章目录 1 Repulsion Loss: Detecting Pedestrians in a Crowd 1.1 现有方法的缺点 1.2 解决办法 1.3 对问题做数学建模 1.3.1 引力作用 ...

  6. 手把手教你训练自己的目标检测模型(SSD篇)

    目标检测是AI的一项重要应用,通过目标检测模型能在图像中把人.动物.汽车.飞机等目标物体检测出来,甚至还能将物体的轮廓描绘出来,就像下面这张图,是不是很酷炫呢,嘿嘿 在动手训练自己的目标检测模型之前, ...

  7. 用于目标检测的Faster R-CNN算法的实际实现

    Introduction 您使用哪种算法进行对象检测任务? 为了在最短的时间内构建最精确的模型,我尝试了其中的一些. 这个跨越多个黑客马拉松和现实世界数据集的旅程通常总是让我进入R-CNN系列算法. ...

  8. 论文推荐 | 目标检测中不平衡问题算法综述

    (图片付费下载于视觉中国) 作者 | CV君 来源 | 我爱计算机视觉(ID:aicvml) 今天跟大家推荐一篇前几天新出的投向TPAMI的论文:Imbalance Problems in Objec ...

  9. 【小白目标检测】手把手教你做视频中的实时目标检测(基于Pelee算法)

    手把手教你做视频中的实时目标检测(基于Pelee算法) 0. 先看效果: 1. 算法详解: 2. 下载源码: 3. 运行检测: 有需求的大佬欢迎加入我的接单群,需求详情请群里戳群主 获取源码或数据集: ...

最新文章

  1. kaggle训练模型
  2. virtual box一直正在加载文件_如何用Band-in-a-box进行民乐编曲
  3. AI、大数据、中台、AIoT、Fintech等十余场火热专题应有尽有,年度盛会BDTC 2019邀您共赴!...
  4. oracle 10g 学习之视图、序列、索引、同义词(9)
  5. solr的两种启动方式
  6. 家庭局域网_KODI超强的局域网视频播放软件
  7. 关于音频情感分类的随笔(4)
  8. sumifs两个求和列如何计算_SUMIFS多条件求和,基本使用方法讲解
  9. uni-app 选择图片上传到服务器、云储存
  10. 【UI设计No5】LOGO设计
  11. microsoft的罗马帝国——浪潮之巅
  12. 【NOIP2015】洛谷2668 斗地主
  13. C#实现平面图形图像缩放、平移、自定义坐标系
  14. 2022年人工智能领域发展七大趋势
  15. 矩阵分解——QR分解
  16. 熬夜学Java语言-File类浅解析
  17. 孙鑫java视频教程笔记
  18. 解决虚拟机中Win7系统无法安装vmware tools问题
  19. 上大学后才知道的14件事
  20. php 开发桌面应用,winbinder开发php桌面应用程序 | 学步园

热门文章

  1. 牛顿迭代法求平方根(C++)
  2. linux查看刷卡pos机_pos机linux下的对应程序
  3. Python磁力获取器命令行工具 torrent-cli
  4. 55 | Linux系统启动报错No bootable device
  5. 盘点2019年市值前十的互联网巨头,谁仍然是投资者的心头爱?
  6. 打印复印店复印100张资料需要多少钱
  7. qt android播放器代码,Qt on android 播放视频的实现
  8. Scrapy 如何正确配置、验证xpath?
  9. 二叉树的四种遍历方法(前序遍历、中序遍历、后序遍历、层序遍历)有图有真相!!!
  10. 高通起诉苹果制造商背后:契约精神与利益怂恿之辩