zoukankan      html  css  js  c++  java
  • DSSD

    Introduction

    增加large-scale context对于目标检测尤其是小物检测质量提升我们多次提到过, 这也很容易理解.

    当时流行一种可以融合背景的方法"encoder decoder", 因为其先encode压缩输出尺寸, 后decode扩充尺寸, 看起来像一个漏斗, 因此也常称为漏斗式, 常常又是对称形式所以称为对称漏斗, 但本文中是非对称形式. 作者便将此形式改进后加入SSD后层, 结构如下图所示:

    mainarch

    Related Work

    利用single-scale输出预测multi-scale物体天生劣势, 作者从multi-scale考虑, 主要有两种表现形式:

    1. 将各层的feature map融合, 因为融合的feature map来自图片的各个level, 因此池化融合后的输出在classification和localization更具有表现力, 但此方法不仅需要大量储存空间还会降低速度.
    2. 直接使用各层的feature map, 各层输出感受野各不相同, 用大的感受野检测大型物体, 用小的感受野检测小型物体. 但是为了检测小型物体, 当时的做法多是直接利用浅层的输出, 但是因为浅层网络语义信息较少最终表现并不好.

    作者就是从第二种方式得到启发, 使用反卷积和skip connection扩大图像, 这样除了能提升分辨率, 还能保证语义信息充足_(感受野似乎变小?)_.

    这里我想所谓第一种表现力更强可能是因为直接相加, 将激活集中到同一张map中, 对于所谓增加储存空间可能因为需要反向传播因此要保存各层的map, 还要保存融合中间过程中的map, 这样速度也会有相应影响.

    Deconvolutional Single Shot Detection (DSSD) model

    Using Residual101 in place of VGG

    首先作者将SSD的backbone换为ResNet-101, 并在其后加入数个卷积层, 单纯加卷积层并不能直接提升精度, 但是在这些后加入即将提到的prediction module后却能极大的提升精度.

    Prediction module

    原本SSD因为梯度太大, 对各层输出的feature map直接利用进行预测. 后来有人提出使用子网络可以提升效果, 那么本文就如下图所示加入一个残差模块(c): pm

    (a)是SSD原始模块, (b)是基础残差模块, (d)是双层改进残差模块.

    Deconvolutional SSD

    反卷积紧接SSD后方, 本文使用是一种非对称漏斗结构而非先前所说的对称漏斗, 即下图中的DSSD Layers部分:

    mainarch

    我们可以注意首先有skip connection, 这也是本文的一大改进, 其次还有漏斗网络不对称, 尤其是decode层很少, 主要有以下两个原因:

    1. 为追求速度而简化模型.
    2. 没有在ILSVRC CLS-LOC上预训练的包含decoder的模型, 因为预训练好的classification模型比随机初始化模型精度更高

    Deconvolution Module

    上图中"Deconvolution Module"具体结构如下图所示:

    dm

    此模块主要有如下几个特点:

    1. 最后一层加入BN层.
    2. 使用反卷积而非线形上采样.
    3. 通过实验证明, 组合时各元素相乘比各元素相加取得更好地结果.

    Training

    训练策略基本与SSD相同, 首先利用IOU选positive bbox, 其后控制negative: positive = 3: 1, 对计算并反向传播loss...

    作者训练时还对样本随机进行广度畸变(photometric distortion), 翻转和剪切.

    关于bbox作者使用k-means同时扫参选择最佳数量和最佳比例, 最终得到的结果如下图所示:

    kmeans

    可以发现基本选出的bbox都是较为瘦高, 作者认为一个重要原因是数据集大多较宽而SSD会把他们resample成正方形, 最终将其拉长. 除此之外作者还加入了几个其他比例的bbox预设.

    Experiments

    Base network

    作者把ResNet-101的stride缩小来提升分辨率, 并且用了我们EE中小波分析的方法填充因为缩小stride形成的hole_(很遗憾原理我也不懂, 方法是对于被缩小stride那一阶段的卷积核大于1的卷积层, 将dilation从1变为2, 原理出自M. Holschneider, R. Kronland-Martinet, J. Morlet, and P. Tchamitchian. A real-time algorithm for signal analysis with the help of the wavelet transform. In Wavelets, pages 286–297. Springer, 1990.)_

    作者从网络中选取了若干层, 具体如下图所示, 其中depth是指选择层所在整个网络中的位置.

    selected

    为了提升小物体的检测能力, 必须要使用浅层(conv3_x)的feature map. 同时此阶段卷积核大于1的卷积层只有9个, 那么此阶段和VGG - conv4_3相比分辨率提升感受野减小. 但相应的坏处就是feature map的信息变弱导致预测表现变差.

    PASCAL VOC 2007

    在低分辨率时ResNet-101和VGG表现相近, 但ResNet收敛更快; 当分辨率提升ResNet超越VGG越1%, 可能与网络深度增加导致在深层网络物体空间信息仍能很好的保存.

    在下图中, 作者观察到在特定的条件下(如天空中的飞机, 草原上的羊, 海中的船)DSSD和SSD相比小物检测性能提升较为明显. 图例作图为SSD, 右图为DSSD.

    e1

    r1

    r2

    Ablation Study on VOC2007

    作者拆分各成分实验, 结果如下图, 补充的是:

    • 使用两个PM对性能几乎无提升.
    • 表中可以看见用元素乘法比加法效果更好.
    • 用线形上采样等方法不仅速度慢, 精度提升也有限.

    e2

    Others

    其余的实验从表格中可以直观得出结论, 其中要提一点的是实验都是把SSD的参数freeze掉后训练.

    e3

    e4

    e5

    Inference Time

    为了提升速度, 作者移除了BN, 作者将卷积层的参数重写, 其中ϵ=15ϵ=1−−5是一个很小的数:

    w^=scale(wvar+ϵ−−−−−−√)b^=scale(bμvar+ϵ−−−−−−√)+shiftw^=scale(wvar+ϵ)b^=scale(b−μvar+ϵ)+shift


    把与BN相关的变量移除, 最后得到下式:

    y=w^x+b^y=w^x+b^


    这样大概会取得1.2到1.5倍速度的提升, 同时也减少至多三分之二的内存用量.

    最终结果并没有SSD快, 其中重要原因之一是使用更复杂的backbone, 其次是在原来的基础上加入了若干网络, 另外会产生更多的bbox(约2.6倍).

    Conclusion

    本文主要就是为了提升小物检测的质量, 引入的内容有反卷积和对各层skip和multi-scale预测, 确实从图例上看得出质量有所提升, 但质量仍然有很大的提升空间. 最后除了几张自然图片, 我再补充几张人文类型的图片, 能检测领带和棒球棒.

    r3

    r4

  • 相关阅读:
    微信小程序:模板消息推送提示{“errcode”:41030,”errmsg”:”invalid page hint: [gP1eXXXXXX]”}
    Linux 定时执行shell脚本命令之crontab
    Ubuntu16.04系统下 解决“无法获得锁 /var/lib/dpkg/lock -open (11:资源暂时不可用)、无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?”的方法
    微信小程序:wx.request之post请求后端无法获取数据的问题
    jQuery获取浏览器参数
    Chrome等浏览器下出现net::ERR_BLOCKED_BY_CLIENT的解决办法
    Thinkphp3.2.3框架下封装公共的函数,例如封装CURL函数来获取接口数据
    Select下拉列表选择自动提交form表单数据
    一步一步从原理跟我学邮件收取及发送 5.C语言的socket示例
    一步一步从原理跟我学邮件收取及发送 4.不同平台下的socket
  • 原文地址:https://www.cnblogs.com/ziwh666/p/12493991.html
Copyright © 2011-2022 走看看