1、什么是可变形卷积?
可变形卷积是指卷积核在每一个元素上额外增加了一个参数方向参数,这样卷积核就能在训练过程中扩展到很大的范围。
注意:这里有一个非常非常非常容易混淆的点,所谓的deformable,到底deformable在哪?很多人可能以为deformable conv学习的是可变形的kernel,其实不是不是不是!本文并不是对kernel学习offset而是对feature的每个位置学习一个offset。
(a)是传统的标准卷积核,尺寸为3x3(图中绿色的点);
(b)就是我们今天要谈论的可变形卷积,通过在图(a)的基础上给每个卷积核的参数添加一个方向向量(图b中的浅绿色箭头),使的我们的卷积核可以变为任意形状;
(c)和(d)是可变形卷积的特殊形式。
2、为什么要可变形卷积?
CNNs对大型,未知形状变换的建模存在固有的缺陷,这种缺陷来源于CNNs模块固有的几何结构:
- 卷积单元对输入特征图的固定位置进行采样;
- 池化层以固定的比例进行池化;
即使是ROI pooling
也是将ROI
分割到固定的bin
中去。这些特性是有影响的,例如,在同一层Conv
中,所有的激活单元的感受野是一样的,但由于不同位置可能对应着不同尺度或变形的物体,因此对尺度或者感受野大小进行自适应是进行精确定位所需要的。为了解决或者减轻这个问题,本文提出了两种新的模块,可变形卷积(deformable conv
)和可变形感兴趣区域池化(deformable ROI Pooling
),来提高对形变的建模能力。这两个模块都是基于一个平行网络学习offset
(偏移),使得卷积核在input feature map
的采样点发生偏移,集中于我们感兴趣的区域或者目标。通过研究发现,标准卷积中的规则格点采样是导致网络难以适应几何形变的“罪魁祸首”,为了削弱这个限制,对卷积核中每个采样点的位置都增加了一个偏移变量,可以实现在当前位置附近随意采样而不局限于之前的规则格点。
3、可变形卷积结构形式
上图是可变形卷积的学习过程,首先偏差是通过一个卷积层获得,该卷积层的卷积核与普通卷积核一样。输出的偏差尺寸和输入的特征图尺寸一致。生成通道维度是2N
,对应偏移位置的x
坐标和y
坐标。卷积核通过双线性插值后向传播算法同时学习。
4、可变形卷积结构与普通卷积结构的比较
5、可变形卷积的学习过程
图a是标准卷积的采样过程,图b是可变形卷积的采样过程。
可变性卷积的流程为:
- 原始图片
batch
(大小为b*h*w*c
),记为U
,经过一个普通卷积,卷积填充为same
,即输出输入大小不变,对应的输出结果为(b*h*w*2c)
,记为V
,输出的结果是指原图片batch中每个像素的偏移量(x
偏移与y
偏移,因此为2c
)。 - 将
U
中图片的像素索引值与V
相加,得到偏移后的position
(即在原始图片U
中的坐标值),需要将position
值限定为图片大小以内。position
的大小为(b*h*w*2c)
,但position
只是一个坐标值,而且还是float
类型的,我们需要这些float类型的坐标值获取像素。 - 例,取一个坐标值
(a,b)
,将其转换为四个整数,floor(a)
,ceil(a)
,floor(b)
,ceil(b)
,将这四个整数进行整合,得到四对坐标(floor(a),floor(b)), ((floor(a),ceil(b)), ((ceil(a),floor(b)), ((ceil(a),ceil(b))
。这四对坐标每个坐标都对应U
中的一个像素值,而我们需要得到(a,b)
的像素值,这里采用双线性差值的方式计算(一方面得到的像素准确,另一方面可以进行反向传播)。 - 在得到
position
的所有像素后,即得到了一个新图片M
,将这个新图片M
作为输入数据输入到别的层中,如普通卷积。
6、可变形卷积的具体实现
1、首先声明一点,在可变形卷积中,可变形卷积操作和池化操作都是2维的,都是在同一channel
上进行的,常规的卷积操作主要可以分为两部分:
- (1)在输入的
feature map
上使用规则网格R进行采样; - (2)进行加权运算,
R
定义了感受野的大小和扩张
对于在输出的feature map
上的每个位置P0,通过下列式子进行计算:
其中,Pn是对R中所列位置的枚举
2、可变形卷积的操作是不同的,在可变形网络的操作中,常规的规则网格R通过增加一个偏移量进行扩张,同样的位置P0变为:
现在,采样的位置变成了不规则位置,由于偏移量△Pn通常是小数,因此我们通过双线性插值法进行实现,公式为:
完整的示意图如下: