zoukankan      html  css  js  c++  java
  • Deformable ConvNets--Part4: Deformable Convolutional Networks

    转自:https://blog.csdn.net/u011974639/article/details/79704043

    关于Deformable Convolutional Networks的论文解读,共分为5个部分,本章是第四部分:

    • [ ] Part1: 快速学习实现仿射变换
    • [ ] Part2: Spatial Transfomer Networks论文解读
    • [ ] Part3: TenosorFlow实现STN
    • [x] Part4: Deformable Convolutional Networks论文解读
    • [ ] Part5: TensorFlow实现Deformable ConvNets

    本章解读Deformable ConvNets论文,看该模型是如何让卷积可变形,如何让模型支持端对端训练。


    Deformable Convolutional Networks

    Deformable Convolutional Networks

    收录:ICCV2017(IEEE International Conference on Computer Vision)

    原文地址:Deformable-ConvNets

    代码:



    Abstract

    CNN因为其固定的几何结构限制了模型几何变换能力。论文引入了可变卷积(Deformable Convolution)和可变ROI pooling(Deformable RoI pooling)两个新模块,提高模型的空间转换能力。这两种模块增加模型空间采样位置和从task上学习偏移能力。新的模块可很容易的替换现有的CNN模型中对应的部分,并支持端对端训练。大量实验验证了可变性卷积模型能够有效的应对复杂的视觉任务。


    Introduction

    视觉任务中存在的问题

    视觉识别中一个关键的挑战是如何适应物体的几何变体或目标尺度、姿态、观察点、部分变形的几何变换。如下:

    这里写图片描述

    针对这一问题,通常有两个办法:

    • 一是构建有足够期望变化的训练数据集。这个通常是对数据做增强,例如仿射变换,放缩等。希望模型能够在多种变体数据上学习鲁棒性强的表征,但这是以计算消耗和模型复杂度为代价的。
    • 二是使用变换不变的特征和算法。这有许多广泛使用的算法,例如SIFT(尺度不变特征变换),基于滑窗的目标检测等

    这里写图片描述

    上述的方法有两个缺点:

    • 首先,对数据的几何变换是已知固定的,这样的先验应用于增强数据集上、设计特征和算法,会对未知几何变换的任务处理造成影响,因为没有正确的去对未知变换建模

    • 其次,手工设计的特征和算法难以或者不能应对复杂的变换,即使这些变换是已知的。

    Motivation

    近期,CNN在多个复杂视觉任务上获得了显著的提升。但是,CNN也存在上述的两个缺点。模型的几何变换能力大多来源于大量的数据增强、模型的表征能力和一个简单的手工特征(例如max-pooling应对小型平移变换)。

    简而言之,CNN受限于模型内部固定的几何结构:卷积单元对输入固定的采样位置;池化层固定的下采样因子;RoI池化层将RoI分成固定数量的bin等,这缺乏处理几何变换的内部机制。

    这里写图片描述

    这会导致一些明显的问题。例如:CNN中同一层的所有激活单元的接受野是固定的,这不利于high-level层编码空间信息,因为不一样的位置可能会对应不同尺度或形态的目标。对于精确定位来说,自适应确定尺度和感受野尺度是理想的。此外,在目标检测上,许多模型依然依赖于基于特征提取的bbox,这对于non-rigid objects物体等是非最优的。

    论文的贡献

    在本文中引入两个新模块极大提高了CNN对于几何变换的建模能力:

    • 第一个是deformable convolution(可变形卷积)。这在标准卷积的常规采样网络位置上增加了一个2D偏移,这使得采样网格可以自由变形。如下图所示:

    这里写图片描述

    可通过附加卷积层从之前的feature上学习偏移量,这样变形以局部,密集和自适应的方式适应输入feature。

    • 第二是deformable RoI pooling(可变性RoI池化)。在先前的RoI池化的每个常规的bin上添加一个偏移。类似的,偏移也是从前面的feature和RoI上学习的,能够对不同形状的目标做自适应定位。

    这两个模块都是轻量级,只增加了少量的计算和参数。并且能够轻易的替换现在CNN中对应的部分,支持端对端训练。deformable convolutional networks和STN(Part2)和可变形模块有同样的精神。都是具有内部转换参数和学习参数,都是纯粹的学习数据。deformable ConvNets相比的来讲,是更简单、有效,深度和端对端的训练。



    Deformable Convolutional Networks

    Deformable Convolution

    2D的卷积由两部分组成:

    • 在输入feature map X上使用regular grid R采样
    • 对采样值加权w求和

    网格R定义的是感受野尺寸和扩张率。例如:对于一个扩张率为1的3×3卷积核,采样的偏移量为

    R={(1,1),(1,0),..,(0,1),(1,1)}

    对于输出feature map y上每个位置po

    (1)y(po)=pnRw(pn)X(po+pn)
    其中pn在网格R上迭代。每个卷积核位置pn对应着核参数w(pn)

    要想获得可变性卷积,可在regular grid R上做手脚,论文是为其增加偏移量{Δpn|n=1,...,N},其中N=|R|

    (2)y(po)=pnRw(pn)X(po+pn+Δpn)

    此时采样偏移为pn+Δpn,我们想法子学习这个Δpn就可以了。

    Deformable ConvNets和STN对比

    Deformable ConvNets关于可变性卷积示意图如下:

    这里写图片描述

    上图在input feature map上蓝色的虚线表示regular grid。

    STN网络架构中的Spatial Transformer变换:

    这里写图片描述

    可以看到这和Deformable Convolution非常相似的,STN使用的是仿射变换,而Deformable ConvNets使用的是更泛化的偏移量。

    在Part2中,我们详细分析过STN中Spatial Transformer的组成部分:

    • Localisation net,在输入特征映射上应用卷积或FC层,用于获取仿射矩阵,即各个θ值。
    • Grid generator,用于生成实际的Sampling grid坐标
    • Sampler,实际对输入特征映射U的采样

    同样的Deformable ConvNets中关于deformable convolution的处理可分为以下部分:

    • 对输入feature map原本使用一个卷积conv得到下一层输入。现在使用另外一个offset conv卷积获取偏移量,offset conv卷积核大小和扩张率和conv相同,offset conv的输出为offset field
    • offset field和输入特征映射相同空间分辨率,并且通道数为2N,对应着N个2D的偏移量(x,y方向)
    • 通过双线性采样获取的最终的采样网格,配合conv卷积核得到最终输出结果

    对Deformable ConvNets的总结:

    可以看到Deformable Convolution说白了是一个扩张率可学习的卷积,相比于STN学习一组仿射变换参数,Deformable学习卷积核中各个采样点的偏移量。与此相对的常规的扩张卷积是固定的偏移量。


    Deformable Convolution 的反向传播

    注意到在Deformable ConvNets中偏移量Δpn常常不为整数,而在BP时需要可微求梯度的,故论文采用和Part2:STN(Spatial Transformer Network)一样的方法,使用双线性采样搞定:

    (3)X(p)=qG(q,p)·X(q)

    G(·,·) 是双线性插值核函数,p表示任意位置 p=po+pn+Δpnq是feature map X上所有位置的迭代。

    注意G是两维的,可以分成两个一维的核:

    (4)G(q,p)=g(qx,px)·g(qy,py)

    其中g(a,b)=max(0,1|ab|),公式(3)可通过公式(4)做快速计算。

    上述公式(3)(4)可能看的比较抽象,看看STN中使用双线性采样的表达式,再对比一下就很清晰了:

    在STN中使用双线性采样核的表达式总结如下:

    Vci=nHmWUnmcmax(0,1|xism|)max(0,1|yisn|)

    这其中的max(0,1|xism|)max(0,1|yisn|)对应的就是G(q,p)Vc对应的就是X(p) 对于反向求梯度的公式,可参考Part2:STN。

    Deformable RoI

    所有基于侯选区域的目标检测办法都使用了RoI Pooling,这能够将任意大小的矩形区域转换为固定大小的特征。 给定特征映射X和大小为w×h的RoI,我们记RoI的左上角为p0,RoI pooling将RoI分为k×k个bin,输出大小为k×k的特征映射y。对于序号为(i,j)的bin:

    (5)y(i,j)=pbin(i,j)X(p0+p)/nij
    其中nij是bin中像素的数量。第(i,j)个bin的跨度为iwkpx(i+1)wkjhkpy(j+1)hk。(x表示对x取整)

    和Deformable Convolution类似,对于RoI Pooling也是添加一个偏移量{Δpij|0ij<k}添加到空间分bin的坐标上,故公式(5)变成了:

    (5)y(i,j)=pbin(i,j)X(p0+p+Δpij)/nij

    同样的,Δpij会是非整数,故依旧是通过双线性采样来实现。

    下图是Deformable RoI Pooling示意图:

    这里写图片描述

    大概步骤如下:

    • 首先,使用公式(5)的RoI Pooling生成池化后的特征映射。
    • 在上述生成特征映射上,使用FC层生成normalized offset Δpij^
    • Δpij^通过和RoI的宽和长逐元素相乘,即 Δpij=γ·Δpij^(w,h),变换生成 Δpijγ是预设控制偏移大小的。经验设置为0.1。

    Position-Sensitive(PS) RoI Pooling

    如下图所示:

    这里写图片描述

    大概执行步骤:

    • 将输入feature map做卷积转为k2个score map,因为有背景,故共有k2(C+1)个特征图。(分类类别C)
    • 将这些特征图表示为{Xi,j},其中(i,j)表示bin的迭代。在这些特征图上做池化,第(i,j)个bin是从位置Xi,j的特征图上通过sum操作获取到的。

    简单的来讲,就是原本普通的特征映射X换成了现在现在指定位置敏感的Xi,j

    同样的,对于获取偏移量的分支,也是将原本的特征图X换成了Xi,j。对于offset的学习,按照全卷积的思想,使用一个卷积层全空间分辨率的offset fields。对于每个RoI,PS RoI pooling都应用在这样的offset field上获取normalized offset Δpn^

    Deformable ConvNets

    Deformable convolution 和RoI pooling和原本的版本具有相同的输入和输出,故能够直接替换CNN中原本对应的部分。在训练中,添加的用于学习offset的FC层或卷积层的权重设置为0。学习率设置为对应层的β 倍(默认β=1,在Faster-RCNN中FC层的β=0.01)。通过双线性插值的反向传播做训练。

    为了将deformable ConvNets集成到先进的CNN架构中,注意到现有架构分成两个阶段:

    • 一个深度全卷积网络在整个输入图片上生成特征图(特征提取层)
    • 在生成特征图上做一个具体的任务

    我们详细的讲解一下这两个阶段。

    Deformable Convolution for Feature Extraction

    论文采用了两个先进的特征提取架构:ResNet101和改进的Iception-ResNet,两个都是在ImageNet上跑过。原先的Inception-ResNet是为图片识别设计的,论文改进修复了其alignment 问题,改进后的版本称为Aligned-Inception-ResNet

    论文使用的改进版本的Aligned Xception

    这里写图片描述

    论文将两个网络的平均池化和FC层去掉,在最后添加了一个随机初始化的1×1卷积层将通道降维到1024。将最后一个卷积块的有效步幅从32pixel降到16pixel(步幅=HinputHoutput),增加feature map的分辨率。为了补偿,在最后卷积块添加扩张率为2的扩张卷积。

    Segmentation and Detection Networks

    在上述特征层提取的feature map上建立一个网络用于完成具体的任务。我们将C定义为任务分类类别数。

    • DeepLab: 用于语义分割。在feature map上添加一个1×1卷积生成C+1个maps用于表示每个像素分类结果,再接Softmax。
    • Category-Aware RPN: 用于目标检测。将2分类卷积分类器换成了C+1卷积分类器。
    • Faster R-CNN: 用于目标检测。RPN分支添加在conv4 block的顶端。论文将RoI pooling直接接在后面,在RoI输出上接两个1024维的FC层,再接bbox回归和分类分支。和之前的网络相比,将10个层的conv5替换为2个FC层,会有轻微的精度下降,但是依旧是足够强大的baseline。
    • R-FCN: R-FCN是先进的检测器。对应的每个RoI计算消耗可忽略不计。安装原先的实现,可将RoI换成PS RoI pooling。

    改进前的目标检测框架:

    这里写图片描述

    改进后的目标检测框架:

    这里写图片描述



    Understanding Deformable ConvNets

    使用可变形卷积堆叠,示例如下:

    这里写图片描述

    图左的标准卷积,所有采样位置和感受野是固定的。图右的可变形卷积依据目标的大小和形态自适应改变。

    可变形卷积集中案例:

    这里写图片描述

    使用可变形RoI Pooling:

    这里写图片描述

    讨论与其他工作不同之处。

    Spatial Transform Network: STN工作是在深度网络中从数据上学习空间转换,使用全局参数变换包裹feature map。这样的参数学习起来很困难。STN证明了在小型形变上是有效的。

    可变形卷积的offset learning 可以被考虑成STN中极其轻量级的空间变换。然而,可变形卷积不采用全局参数变换和特征变形,采样的是以局部和密集的方式管理特征映射。为了生成新的特征映射,再做加权求和操作。并且Deformable Convolution比STN更容易集成到现有的CNN架构中。

    Active Convolution: 这项工作也是通过增强卷积中采样位置和学习偏移量,通过反向传播实现端对端。这个工作和deformable convolution有两处不同。一是:对于不同的空间位置共享同一偏移量。二是:offset在每个任务和每个训练中是静态模型参数。相对的deformable convolution中的offset是动态变换的。

    Effective Receptive Field: 并不是所有的像素对于目标响应是相同的。在目标中间的像素贡献大点,有效感受野只占据理论感受野的一部分。理论上感受野大小随着卷积层的数量线性增加,但实际上是平方根线性增加,速度比预料要慢得多。这一发现说明了CNN顶层还是没有足够的接受野。侧面证明了扩张卷积为什么能够广泛应用于视觉任务。 可变形卷积可以自适应的接收野。

    Atrous convolution: 扩张卷积能够在保持计算量和参数量的条件下扩展特征的感受野。Deformable Convolution可以看成是泛化的扩张卷积,我个人将Deformable convolution理解为学习不同方向上的扩张率。

    Deformable Part Models (DPM): DPM和Deformable RoI类似,两者都是目标部件的空间变形。DPM是一个浅层模型,变形能力受限。可通过距离转换认为是特定的池化操作,它的推理算法可使用CNN完成。但它的训练不支持端对端,是启发的。相比之下,Deformable ConvNet支持端对端,并且当堆叠的更多,建模能力变的更强。

    DeepID-Net: 引入了变形约束池化层,可认为是对目标检测变形的考虑。这项工作可实现起来很复杂。

    Spatial manipulation in RoI pooling: 空间金字塔池化使用手工池化区域。
    Transformation invariant features and their learning: 设计特征不变变换是具有极大影响的。例如SIFT、ORB。同样在CNN背景下,有工作学习CNN内在不变的表示。有工作专门制定特征的变换。但这些变换都是先验的,在许多现实场景下,变换是未知的。而deformable convolution可以在任务中学习到各种变换。


    Experiment

    Task

    Semantic Segmentation: 在PASCAL VOC和CityScapes上做了测试。使用mIoU度量。训练期间,VOC的短边大小调整到360,CityScapes短边调整到1024。使用SGD优化器,8GPU每个batch为1。VOC和CityScapes上各跑30k和45k次迭代,在初始的23迭代使用学习率为103,后13迭代使用学习率为104

    Object Detection: 使用PASCAL VOC和COCO数据集。 使用标准的mAP度量。在训练和推理期间,将短边调整到600,使用SGD优化器,class-aware RPN每张图片上使用256个RoI,Faster R-CNNR-FCN使用256和128个。RoI Pooling使用7×7bins。在VOC和COCO上训练迭代了30K和240K次,学习率依旧是在初始的23迭代使用学习率为103,后13迭代使用学习率为104

    Evaluation of Deformable Convolution

    Table 1评估了deformable convolution的影响,使用ResNet101做特征提取层。使用deformable convolution越多,精度稳步上升。对于DeepLab和class-ware RPN使用3个deformable convolution改进达到了饱和。

    这里写图片描述

    为了更好明白deformable convolution的工作机理,论文定义了effective dilation度量有效滤波器。这是滤波器中所有相邻采样位置之间距离的平均值,用于测量滤波器的感受野。

    论文依据GT bbox和滤波器中心位置,将可变形卷积分为4类:small, medium, large, and background。下表显示了有效扩张值的统计数据:

    这里写图片描述

    • 可变形卷积的接受野和目标大小相关,这表明形变是从内容上学习到的
    • background目标的大小在medium和large之间,表明需要较大接收野来识别背景区域。

    模型的ResNet在后三个卷积使用扩张率为2的扩张卷积,论文进一步尝试了4,6,8,结果如下:

    这里写图片描述

    这表明:

    • 精度随着扩张率提升而提升,这表明了接收野小的问题。
    • 不同任务的最佳扩张率不同,例如DeepLab为6, Faster R-CNN为4
    • deformable convolution具有最佳的精度

    Evaluation of Deformable RoI Pooling

    在COCO上的结果如下:

    这里写图片描述

    可以看到加入deformable的效果都有所提升。

    Model Complexity and Runtime

    模型加入deformable convolution的模型复杂度和运行时间:

    这里写图片描述

    在参数和计算上增加的开销较小,这表明性能改进来自对几何变换建模的能力。



    参考资料

    Jifeng Dai-Deformable Convolutional Networks-MSRA COCO Detection & Segmentation Challenge 2017 Entry


  • 相关阅读:
    linux下安装nginx
    阿里云CentOS系统配置iptables防火墙
    没用私服,自己安装下本地jar包,制作坐标
    Redis加入Centos Linux开机启动
    CentOS6.5安装redis(3.0.3)
    Spring Boot 第一个demo
    JDK下载与安装
    IDEA-Maven下载及安装
    项目注意:
    idea项目Tomcat 插件 运行报错
  • 原文地址:https://www.cnblogs.com/leebxo/p/10697017.html
Copyright © 2011-2022 走看看