目标检测算法DSSD的原理详解

article/2025/8/23 0:45:10

论文地址:https://arxiv.org/abs/1701.06659
Github 源码(caffe版):https://github.com/chengyangfu/caffe/tree/dssd

 

1、文章概述


    DSSD(Deconvolutional Single Shot Detector)是SSD算法改进分支中最为著名的一个,SSD的其他改进还包括RSSD(https://arxiv.org/abs/1705.09587)、FSSD(https://arxiv.org/abs/1512.02325)等。在VOC2007数据集上,513*513的输入图片上,DSSD的mAP值达到81.5%,但是fps只有6fps左右。

      DSSD将SSD的VGG网络用Resnet-101进行了替换,在分类回归之前引入了残差模块,在SSD添加的辅助卷积层后又添加了反卷积层形成“宽 - 窄 - 宽”的“沙漏”结构。DSSD相比SSD的一个最大的提升在于对小目标的检测度上DSSD有了很大的提升,文章的最后部分也展示了小目标的检测效果。即便如此,DSSD的检测速度相比SSD慢了很多,其中很大一部分原因在于引入的Resnet-101太深。

      DSSD的网络模型如下图所示:

       图中的蓝色部分是SSD在基础网络的基础上添加的辅助层,红色部分是DSSD在SSD的后面添加的反卷积层,红色的反卷积层和蓝色的卷积层对应尺度相同,融合后再送入上面的蓝色框框的Prediction Module模块进行分类回归。

 

2、Resnet-101替换VGG网络


       这么做的目的是提高精度,毕竟Resnet-101比VGG的网络更深,提取的特征就有更高的语义信息,而且Resnet-101的分类精度确实比VGG的高。需要注意的是,在300*300的输入图像下,直接将VGG用Resnet-101替换,精度不升反降;在512*512的输入图像下测试,精度才有略微提升。再加入了Prediction模块和反卷积模块后,精度才有稳定提升。还需注意的是,在300*300的图像上测试,用VGG的SSD有59的FPS,而用Resnet-101的DSSD的fps只有15,Resnet-101更深的网络结构是fps显著降低的原因。

 

3、PM(Prediction Module)模块


       PM模块如下图所示(图片来自博客:https://blog.csdn.net/jesse_mx/article/details/55212179?utm_source=itdadao&utm_medium=referral):

    左图(a)是SSD中用于分类和回归用的结构,即在特征图上直接连接1*1的卷积,一个用来分类,一个用于回归。图(c)是文中用于分类和回归的最优结构。图(b)、图(c)、图(d)均是在SSD的基础上将原有的结构改成Resnet模块(不清楚的可以查一下Resnet那篇文章)。这么做的目的是提取更深维度的特征用于分类和回归。添加的位置在反卷积结构之后,分类和回归之前。Eltw sum有两种,一种点和、一种点积,最后实验证明点积的效果最好。

 

4、DM(Deconvolutional Module)模块


      文章最具特色的部分,结构如下图所示(图片来自博客:https://blog.csdn.net/jesse_mx/article/details/55212179?utm_source=itdadao&utm_medium=referral):

 

        DM模块里的要反卷积的高层特征图(图中以A表示)和SSD的卷积的低层特征图(图中以B表示)和最后得到的融合后的卷积图(图中以C表示)与DSSD的沙漏结构中的对应位置如图所示。融合后的特征图C送入Prediction Module模块里,特征图C就对应PM残差结构中的“feature map”。需要注意的是这时的融合特征图C作为下一级DM模块的要反卷积的特征图再进行下一级的DM模块操作。至于2H和2W经过一系列的3*3卷积后仍保持2H*2W的特征图尺寸,个人认为是3*3卷积层中,padding=1,stride=1。

    DM模块放在SSD添加的辅助卷积层后面,与SSD中的卷积层网络构成了不对称的“沙漏”结构,也叫“encorder-decorder”结构。为什么设计成不对称的结构作者也在文中很清楚的说明了,可以查看原文。DM模块与整个沙漏结构,更充分利用了上下文信息(context),更充分利用了浅层的特征,从而与SSD相比在小目标和密集目标的检测率上有很大的提高。需要注意的是在融合Conv3_x时,要先加一步Normalization操作,否则不容易训练,因为这一层的梯度过大。

 

5、反卷积+“宽 - 窄 - 宽”的不对称“沙漏”结构


   DSSD的整体网络就是“宽 - 窄 - 宽”的不对称“沙漏”结构,具体结构在前面已经说了,这里主要从理论上分析一下为什么要这么设计,参考了这篇知乎上的文章:https://zhuanlan.zhihu.com/p/33036037?edition=yidianzixun&utm_source=yidianzixun&yidian_docid=0IA1dq0Q&yidian_s=&yidian_appid=

     卷积神经网络在结构上存在固有的问题:高层网络的感受野比较大,语义信息表征能力强,但是特征图的resolution低,几何信息的表征能力弱;低层网络的感受野比较小,几何细节信息表征能力强,虽然分辨率高,但是语义信息表征能力弱。SSD采用多尺度的特征图来预测目标,使用具有较大感受野的高层特征信息预测大的物体,具有较小感受野的低层特征信息预测小目标。这样就带来一个问题:使用的低层网络的特征信息预测小目标时,由于缺乏高层语义特征,导致SSD对于小目标的分类结果较差,即SSD没有充分利用低层的特征。而解决这个问题的思路就是对高层语义信息和低层语义信息进行融合,丰富预测回归位置框和分类任务输入的多尺度特征图,以此提高精度。基于此,作者提出了反卷积+“宽 - 窄 - 宽”的不对称“沙漏”结构。

 

6、DSSD关于default box的改进


      针对PASCAL VOC2007和2012里trainval的图片,用k-means对长宽比例做了一个聚类分析,最终确定default box的长宽比例的阿尔法为1、1.6、2和3;SSD的阿尔法为1、2、3、1/2、1/3。

 

7、DSSD的训练方法


      先预训练好一个SSD的模型,然后用训练好的SSD模型来初始化DSSD网络。具体地,训练分为两个阶段,先冻结DSSD网络中SSD网络层的参数,只用预训练好的SSD模型去微调DSSD层的权重(DSSD层的权重的初始化方式为Xavier);第二阶段解冻第一阶段的所有层参数,放开了微调。

      但是知乎上那篇文章复现DSSD时说这样训练精度并没有提高,而且特别耗时,反而直接放开所有层微调效果会更好,收敛速度会更快。

      具体的实验结果和测试时的新的操作请看原文。

参考博客:

https://blog.csdn.net/jesse_mx/article/details/55212179?utm_source=itdadao&utm_medium=referral

https://zhuanlan.zhihu.com/p/33036037?edition=yidianzixun&utm_source=yidianzixun&yidian_docid=0IA1dq0Q&yidian_s=&yidian_appid=

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

 
转自:https://blog.csdn.net/zj15939317693/article/details/80599596 


http://chatgpt.dhexx.cn/article/DGVciCum.shtml

相关文章

【每日一网】Day30:DSSD(Deconvolutional Single Shot Detector)简单理解

DSSD:Deconvolutional Single Shot Detector 算法背景 本文的主要贡献在于将上下文索引和残差网络加到了SSD算法中,然后在反卷积层上增加SSD和residual-101,以在目标检测中提高对小目标的准确性。DSSD将SSD的VGG网络用Resnet-101进行了替换…

【压测指南|压力测试核心性能指标及行业标准】

文章目录 压力测试核心性能指标及行业标准指标1:响应时间指标2:吞吐量(TPS)指标3:失败率总结: 压力测试核心性能指标及行业标准 在做压力测试时,新手测试人员常常在看报告时倍感压力:这么多性能…

CSDN做测试的老师教你Jmeter生成压力测试报告

根据各大招聘网站上的需求来看,熟悉Jmeter做性能测试已经几乎成为必要条件了。 那么今天在这个给大家安利一波。 怎么使用Jmeter生成压力测试报告呢? 条件准备: 1、Jmeter3.2(推荐使用,比较稳定) 2、J…

性能压测报告

文章目录 业务接口性能压测报告一、说明二、调优1、slb2、内核3、nginx4、php 三、盘古单节点压测数据四、盘古单代理节点压测数据五、集群压测数据1、每秒2000并发,总计5分钟压测数据2、每秒3000并发,总计5分钟压测数据 六、结论1、说明2、结果3、瓶颈 …

压力测试相关概念与性能指标以及压测实例

压力测试 压力测试考察当前软硬件环境下系统所能承受的最大负荷并帮助找出系统瓶颈所在。压测都 是为了系统在线上的处理能力和稳定性维持在一个标准范围内,做到心中有数。 使用压力测试,我们有希望找到很多种用其他测试方法更难发现的错误。有两种错误类…

系统压力测试(一)

《目录》 -------->认知,了解压测的一些参数,了解什么是正向的压测结果 -------->压测需求一般包含的东西与及步骤 -------->JMeter压测软件的介绍,压测计划中常用模块的用途 -------->了解怎么给出压测人员出一份压测指标&a…

压力测试报告

找XX二代--江苏对接功能点压力测试报告 一、测试目的 对找XX二代一些基本功能进行自动化测试代替人工测试,提高测试效率。 二、测试环境 本次压力测试使用了jmeter4.0测试工具,找XX二代设备1台; 软件版本:CMCC-DST1A-0-2_V2.2.X_2…

项目如何进行压力测试?

前言:这里对压测进行一些简介,本篇介绍项目压测场景,使用jmeter进行压测。 压测相关的一些指标: QPS(Queries Per Second):每秒能够响应的查询次数,也即是最大吞吐能力&#xff08…

压力测试基本概念

目录 一、压测是个啥?为啥要压测? 二、压测方案设计 1、压力场景 2、压测方案设计关注点 3、涉及到的知识点: 三、压测执行 四、压测报告关注点 一、压测是个啥?为啥要压测? 压测属于性能测试的一种&#xff1a…

jmeter压力测试报告—模板

XXX压力测试报告 时间:2018-09-05 测试人员:xxx XXX压力测试报告 目录 一 测试内容... 2 二 测试方法... 2 三 测试目标... 2 四 测试环境... 2 五 系统部署... 3 5.1 物理部署... 3 5.2 网络…

软件测试之压力测试

压力测试 压力测试是一种软件测试,用于验证软件应用程序的稳定性和可靠性。压力测试的目标是在极其沉重的负载条件下测量软件的健壮性和错误处理能力,并确保软件在危急情况下不会崩溃。它甚至可以测试超出正常工作点的测试,并评估软件在极端…

模拟压力测试报告

在Linux环境下测试一下数据库以及缓存在优化前后的负载情况,总结一下过程。 压测工具:JMETE 运行环境 本来想在虚拟机上运行java程序以及数据库,不过压测下虚拟机承载不了太高的并发,硬件有限,只能将java应用运行在W…

JMeter压力测试报告分析

JMeter 一、测试工具:二、JMeter介绍:三、Java环境的安装与使用:3.1.初始化3.1.1.下载并安装,3.1.2.解压,3.1.3.进入bin目录,3.1.4.cmd启动jmeter.bat,3.1.5.出现两个窗口:一个cmd窗…

Redis压力测试报告

Redis配置 Max_total 200 Max_idle 100 Max_wait 10 Time_out 3000 测试机器(本机)参数 CPU 2核 内存 4G 网络 100Mbs 1.不同操作压力测试结果 结论: 1.针对redis的不同操作,在相同线程数下TPS基本保持一致&#x…

自动化测试工程师需要具备什么技能?

如果是初入门的学习者,不建议拿一本书从头学,很可能会被里边一些专业术语和不常用的技术带偏,不论在公司还是在其他岗位上自学测试,都可以用自己搭建好的项目来练手(如果在公司有现成的项目更好)&#xff0…

面了一个测试工程师要求月薪26K,总感觉他背了很多面试题...

最近有朋友去华为面试,面试前后进行了20天左右,包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说,80%的人都会栽在第一轮面试,要不是他面试前做足准备,估计都坚持不完后面几轮面试。 其实&…

一名优秀的测试工程师,应具备那些能力

前言 作为一个软件测试工程师,你找工作的敲门砖是什么?是学历?是经验?还是年龄?   从事测试工程师的人员日趋增多,自然而然竞争也会变得激烈。如何让我们的工作履历变的更加精彩,除了我们实际…

什么是测试开发工程师?

什么是测试开发工程师? 测试开发工程师 (Software Development Engineer in Test,简称SDET)是指那些既可以称作是开发人员,同时也负责软件开发阶段和测试周期的测试工作的技术人员。一个专业的SDET更关注软件产品的可测性,稳健性和…

测试工程师应具备的素质

郭芙曾提到测试的软实力包括测试人员的基本素质,那么测试人员到底应具备怎样的素质呢?昨天逛书城,看到一本教科书上有对测试人员应具备的素质的描述,所述未必尽如其然,但仍有可借鉴之处,手机拍了下&#xf…

成为一个优秀的测试工程师需要具备哪些知识和经验?

先说下做软件测试所必须掌握的技能范围 我按照薪资的不同大致划分成3个档位: 月薪5-9k:从零基础入门到能够找到工作月薪15-25k:测试在职搞定性能测试和自动化测试年薪30W:搞定测试开发,进入一线大厂 第一个阶段&…