深度学习方法(十三):卷积神经网络结构变化——可变形卷积网络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)表示旋转;markdown

这里写图片描述

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

(1)可变形卷积 Deformable Convolution学习

这里写图片描述
图1 可变性卷积示意图优化

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

R表明一个receptive field的grid: R={(1,1),(1,0),...,(0,1),(1,1)} ,以3*3为例。
对于输出中每个像素position P0,通常的卷积就是.net

这里写图片描述

而可变形卷积作的是:插件

这里写图片描述

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

就是这样简单吗?其实还相差一点,缘由是 Δpn 不是整数像素,而是一个高精度的小数,不能直接获取像素坐标,而若是采用简单粗暴的取整又会有必定偏差,所以就采用了和STN中同样的作法——双线性插值,插出每一个点的像素值。公式上写成简洁的:blog

这里写图片描述

实际上作的就是找到小数的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