上一篇我们介绍了:深度学习方法(十二):卷积神经网络结构变化——Spatial Transformer Networks,STN创造性地在CNN结构中装入了一个可学习的仿射变换,目的是增加CNN的旋转、平移、缩放、剪裁性。为什么要做这个很奇怪的结构呢?原因还是因为CNN不够鲁棒,比如把一张图片颠倒一下,可能就不认识了(这里mark一下,提高CNN的泛化能力,值得继续花很大力气,STN是一个思路,读者以及我自己应该多想想,还有什么方法?)。

今天介绍的这一篇可变形卷积网络deformable convolutional networks,也算是在STN之后的一个新的变换——STN是说CNN Kernel放死了(比如3*3大小),但是可以通过图片变换让CNN效果更好;而deformable是说既然图片可能各种情况,那我索性CNN的Kernel本身是不规整的,比如可以有dilation,也可以旋转的,或者看起来完全没有规则的。如下图,(a)是常规的一个3*3卷积窗口,(b)蓝色点就是原来的卷积窗口加上了一个offset的情况,(c)表示可以对进行窗口进行scale和aspect ratio的变换,(d)表示旋转;

论文引入了两种新的模块来提高卷积神经网络 (CNN) 对变换的建模能力:可变形卷积 (deformable convolution) 和可变形兴趣区域池化 (deformable ROI pooling),下面逐一介绍。

(1)可变形卷积 Deformable Convolution



图1 可变性卷积示意图

先看传统卷积的一个定义:

R代表一个receptive field的grid: R={(−1,−1),(−1,0),...,(0,1),(1,1)},以3*3为例。

对于输出中每一个像素position P0,一般的卷积就是

而可变形卷积做的是:

再看图1,把原来的卷积过程分成两路,上面一路学习offset Δpn,得到H*W*2N的输出(offset),N=|R|表示grid中像素个数,2N的意思是有x,y两个方向的offset。有了这个offset以后,对于原始卷积的每一个卷积窗口,都不再是原来规整的sliding window(图1中的绿框),而是经过平移后的window(蓝框),取到数据后计算过程和卷积一致。

就是这样简单吗?其实还相差一点,原因是Δpn不是整数像素,而是一个高精度的小数,不能直接获取像素坐标,而如果采用简单粗暴的取整又会有一定误差,因此就采用了和STN中一样的做法——双线性插值,插出每个点的像素值。公式上写成简洁的:

实际上做的就是找到小数的p所在的图像4像素grid,然后做双线性插值。上面公式这样写了以后可以和STN(参考上一篇)中做法一样,就通过BP端到端来训练了。

(2)可变形兴趣区域池化 Deformable RoI Pooling

思路和前面一样,一路学习offset,一路得到真正的pooling结果。

区别在于用的是FC,原因是ROI pooling之后的结果是固定大小的k*k,直接用FC得到k *k个offset。但是这些offset不能直接用,因为ROI区域大小不一,并且input feature map的w和h也是大小不一。作者提出的方法是用一个scale r:

下面是roi pooling原来的公式(用的是average?这个比较奇怪,一般都是用max的,当然按照这个逻辑,max pooling也很容易推出)

有了offset之后就可以这样做:

和前面一样,因为offset是带小数的,不能直接得到像素,需要用双线性插值算法得到每一个像素值。注意,这里的offset只有k*k个,而不是每一个像素一个。

实验结果

下面贴一些实验说明图,看起来有点道理,有点聚焦的意思:

这张图蛮难看懂的,论文也没有细讲,网上还没有详细分析的资料,我谈下我的理解,希望对读者有帮助,如果有不对的欢迎指正——做3*3卷积的时候,对任意一个像素(绿点)都会有9个offset,然后在三层带deformable的卷积中,就会通过叠乘效应产生9*9*9=729个offset坐标,然后画在图上。可以看到聚焦的目标周围。

图6是ROI pooling的结果,可以看到3*3个bin都偏向了目标周围,而避免了矩形框的backgroud影响,这个还是蛮有道理的。

结果看这个deformable的插件可以用在很多地方,效果也都还OK。


回过头细想一下,其实所谓的learning offset,这个思想在faster RCNN中已经用过了,这个针对每一个像素的receptive field得到一个offset,而faster RCNN是对每一个anchor box得到offset,意思是一样的,就是input大小不一样罢了。为什么会偏移向目标呢,原因参与到训练中,这样的输入可以使得loss变小,因此offset就是往loss变小的方向偏移。这个思想在另外一个最新的工作Mask RCNN(作者He Kaiming)中得到了进一步优化,后面有机会总结目标检测算法的时候,再具体展开,有兴趣的读者可以去看看,我当是先抛砖引玉了。

参考资料

[1] deformable convolutional networks

[2] Mask RCNN

[3] Spatial Transformer Networks

深度学习方法(十三):卷积神经网络结构变化——可变形卷积网络deformable convolutional networks的更多相关文章

  1. 深度学习方法(十一):卷积神经网络结构变化——Google Inception V1-V4,Xception(depthwise convolution)

    欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.机器学习技术感兴趣的同学加入. 上一篇讲了深度学习方法(十) ...

  2. 深度学习原理与框架-卷积神经网络基本原理 1.卷积层的前向传播 2.卷积参数共享 3. 卷积后的维度计算 4. max池化操作 5.卷积流程图 6.卷积层的反向传播 7.池化层的反向传播

    卷积神经网络的应用:卷积神经网络使用卷积提取图像的特征来进行图像的分类和识别       分类                        相似图像搜索                        ...

  3. tensorflow CNN 卷积神经网络中的卷积层和池化层的代码和效果图

    tensorflow CNN 卷积神经网络中的卷积层和池化层的代码和效果图 因为很多 demo 都比较复杂,专门抽出这两个函数,写的 demo. 更多教程:http://www.tensorflown ...

  4. 全卷积网络Fully Convolutional Networks (FCN)实战

    全卷积网络Fully Convolutional Networks (FCN)实战 使用图像中的每个像素进行类别预测的语义分割.全卷积网络(FCN)使用卷积神经网络将图像像素转换为像素类别.与之前介绍 ...

  5. 深度学习方法(十):卷积神经网络结构变化——Maxout Networks,Network In Network,Global Average Pooling

    欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术感兴趣的同学加入. 最近接下来几篇博文会回到神经网络结构 ...

  6. 深度学习方法(十二):卷积神经网络结构变化——Spatial Transformer Networks

    欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.机器学习技术感兴趣的同学加入. 今天具体介绍一个Google ...

  7. deeplearning.ai 卷积神经网络 Week 1 卷积神经网络 听课笔记

    1. 传统的边缘检测(比如Sobel)手工设计了3*3的filter(或者叫kernel)的9个权重,在深度学习中,这9个权重都是学习出来的参数,会比手工设计的filter更好,不但可以提取90度.0 ...

  8. 卷积神经网络的一些经典网络(Lenet,AlexNet,VGG16,ResNet)

    LeNet – 5网络 网络结构为: 输入图像是:32x32x1的灰度图像 卷积核:5x5,stride=1 得到Conv1:28x28x6 池化层:2x2,stride=2 (池化之后再经过激活函数 ...

  9. deeplearning.ai 卷积神经网络 Week 2 卷积神经网络经典架构

    1. Case study:学习经典网络的原因是它们可以被迁移到其他任务中. 1.1)几种经典的网络: a)LeNet-5(LeCun et al., 1998. Gradient-based lea ...

随机推荐

  1. 小Q与内存

    Portal --> broken qwq Description (这个描述好像怎么都精简不起来啊qwq) 大概是说你的计算机有1GB的物理内存,按照Byte寻址,其物理地址空间为\(0\si ...

  2. 【bzoj3796】Mushroom追妹纸

    Portal -->bzoj3796 Description 给出字符串s1.s2.s3,找出一个字符串w,满足: 1.w是s1的子串: 2.w是s2的子串: 3.s3不是w的子串. ​ 求w的 ...

  3. Notes of fwt

    昨天考试由于不会fwt而爆炸,所以今天搞了一下fwt……话说这玩意的普及程度已经很高了.fwt,快速沃尔什变换,可以用于位运算卷积的优化,是一种线性变换,所以就会有许多好的性质(eg:可以直接模,可以 ...

  4. c++多态性详解(转)

    什么是多态? 多态一词最初来源于希腊语,意思是具有多种形式或形态的情形,当然这只是字面意思,它在C++语言中多态有着更广泛的含义. 这要先从对象的类型说起!对象的类型有两种: 实例:Derived1类 ...

  5. Error: Chromium revision is not downloaded. Failed to download Chromium

    在使用prerender-spa-plugin做前端预渲染的时候,安装puppeteer的时候因为下载Chromium 失败报错,有如下解决方法: 1.使用Chromium 国内源 npm confi ...

  6. selenium - switch_to.frame()- 内嵌表单的切换

    表单嵌套frame/iframe webDriver只能在一个页面上对元素识别和定位,对于frame/iframe表单内嵌页面上的元素无法直接定位,此时就需要通过switch_to.frame()方法 ...

  7. web项目中解决post乱码和get乱码的方法

    前提复习编码问题产生的原因: 1.  什么是URL编码. URL编码是一种浏览器用来打包表单输入的格式,浏览器从表单中获取所有的name和其对应的value,将他们以name/value编码方式作为U ...

  8. Codeforces 833B The Bakery dp线段树

    B. The Bakery time limit per test 2.5 seconds memory limit per test 256 megabytes input standard inp ...

  9. 个人最常用的vim操作

    本文只记录个人工作中最常用到的vim快捷键,不是很全,但是已经覆盖了绝大多数功能. 参考:<鸟哥Linux私房菜>以及https://www.cnblogs.com/momofan/p/5 ...

  10. Mac(Linux)上安装memcached步骤

    Mac上安装memcached类似于在Linux平台上安装memcached. 主要需要做两块: 一.安装libevent库: 二.安装memcached; 一.安装libevent库 libeven ...