深度学习方法(十三):卷积神经网络结构变化——可变形卷积网络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:
对于输出中每一个像素position P0,一般的卷积就是
而可变形卷积做的是:
再看图1,把原来的卷积过程分成两路,上面一路学习offset
就是这样简单吗?其实还相差一点,原因是
实际上做的就是找到小数的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
********:该做什么就做什么,不该做什么就不做什么?还是不该做什么可以不做什么?