深度学习方法(十三):卷积神经网络结构变化——可变形卷积网络deformable convolutional networks

上一篇我们介绍了:深度学习方法(十二):卷积神经网络结构变化——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

原文地址:https://www.cnblogs.com/yihaha/p/7265283.html