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

  • 相关阅读:
    BZOJ 3205 [Apio2013]机器人 ——斯坦纳树
    BZOJ 3782 上学路线 ——动态规划 Lucas定理 中国剩余定理
    HDU 1423 Greatest Common Increasing Subsequence ——动态规划
    BZOJ 3309 DZY Loves Math ——莫比乌斯反演
    POJ 1038 Bugs Integrated, Inc. ——状压DP
    POJ 3693 Maximum repetition substring ——后缀数组
    POJ 2699 The Maximum Number of Strong Kings ——网络流
    POJ 2396 Budget ——有上下界的网络流
    BZOJ 4650 [Noi2016]优秀的拆分 ——后缀数组
    源码安装python
  • 原文地址:https://www.cnblogs.com/ziwh666/p/12493991.html
Copyright © 2011-2022 走看看