可变形卷积概念出自2017年论文:Deformable Convolutional Networks
顾名思义,可变形卷积的是相对于标准卷积的概念而来。
(a) 一个经典的
3
×
3
3 \times3
3×3 卷积,每一个卷积输入的都是绿色的部分。
(b) Deformable Convolution,虽然也是做这九个点的卷积,但是这个卷积具体采在这个像素的位置是可以变化的,所以叫做 deformable。 那么变形的量是通过学习根据输入数据得出的。其中 © 和 (d) 是两种特殊的情况。
为什么要可变形卷积?
我们知道卷积核的目的是为了提取输入物的特征。我们传统的卷积核通常是固定尺寸、固定大小的(例如3x3,5x5,7x7.)。这种卷积核存在的最大问题就是,对于未知的变化适应性差,泛化能力不强。
卷积单元对输入的特征图在固定的位置进行采样;池化层不断减小着特征图的尺寸。网络内部缺乏能够解决这个问题的模块,这会产生显著的问题,例如,同一CNN层的激活单元的感受野尺寸都相同,这对于编码位置信息的浅层神经网络并不可取,因为不同的位置可能对应有不同尺度或者不同形变的物体,这些层需要能够自动调整尺度或者感受野的方法。再比如,目标检测虽然效果很好但是都依赖于基于特征提取的边界框,这并不是最优的方法,尤其是对于非网格状的物体而言。
解决上述问题最直观的想法就是,我们的卷积核可以根据实际情况调整本身的形状,更好的提取输入的特征。
可变形卷积理论?
(1)首先声明一点,在可变形卷积中,可变形卷积操作和池化操作都是2维的,都是在同一 channel 上进行的,常规的卷积操作主要可以分为两部分:(1)在输入的 feature map上使用规则网格R进行采样;(2)进行加权运算, R \mathcal{R} R 定义了感受野的大小和扩张
对于在输出的 feature map上的每个位置
p
0
\mathbf{p}_0
p0,通过下列式子进行计算:
y
(
p
0
)
=
∑
p
n
∈
R
w
(
p
n
)
⋅
x
(
p
0
+
p
n
)
R
=
{
(
−
1
,
−
1
)
,
(
−
1
,
0
)
,
⋯
,
(
0
,
1
)
,
(
1
,
1
)
}
y(\mathbf{p}_0) = \sum_{\mathbf{p}_n \in \mathcal{R}} \mathbf{w}(\mathbf{p}_n) \cdot \mathbf{x}(\mathbf{p}_0 + \mathbf{p}_n) \\ \mathcal{R} = \{(-1, -1),(-1,0), \cdots, (0,1),(1,1)\}
y(p0)=pn∈R∑w(pn)⋅x(p0+pn)R={(−1,−1),(−1,0),⋯,(0,1),(1,1)}
其中,
p
n
\mathbf{p}_n
pn 是对
R
\mathcal{R}
R 中所列位置的枚举,它就是相对于
p
0
\mathbf{p}_0
p0 这个像素点距离这个 kernel 中心的偏移,权重为
w
(
⋅
)
\mathbf{w}(\cdot)
w(⋅)。
对于普通的卷积,对于计算点
y
(
p
0
)
y(\mathbf{p}_0)
y(p0) 的特征值,它就是使用了
y
(
p
0
)
y(\mathbf{p}_0)
y(p0) 及其周边像素的一个加权和。
(2) Deformable Convolution:
可变形卷积的操作是不同的,在可变形网络的操作中,常规的规则网格
R
\mathcal{R}
R 通过增加一个偏移量进行扩张,同样的位置
p
0
\mathbf{p}_0
p0 变为:
y
(
p
0
)
=
∑
p
n
∈
R
w
(
p
n
)
⋅
x
(
p
0
+
p
n
+
Δ
p
n
)
,
o
f
f
s
e
t
s
{
Δ
p
n
∣
b
=
1
,
⋯
,
N
}
.
y(\mathbf{p}_0) = \sum_{\mathbf{p}_n \in \mathcal{R}} \mathbf{w}(\mathbf{p}_n) \cdot \mathbf{x}(\mathbf{p}_0 + \mathbf{p}_n + \Delta \mathbf{p}_n ) ,\\ \rm{offsets} \{\Delta \mathbf{p}_n | b = 1,\cdots, N\}.
y(p0)=pn∈R∑w(pn)⋅x(p0+pn+Δpn),offsets{Δpn∣b=1,⋯,N}.
现在,采样的位置变成了不规则位置,由于偏移量
Δ
p
n
\Delta \mathbf{p}_n
Δpn 通常是小数,因此我们通过双线性插值法进行实现,公式为:
x
(
p
)
=
∑
q
G
(
q
,
p
)
⋅
x
(
q
)
,
p
=
p
0
+
p
n
+
Δ
p
n
,
G
(
q
,
p
)
=
g
(
q
x
,
p
x
)
⋅
g
(
q
y
,
p
y
)
,
g
(
a
,
b
)
=
max
(
0
,
1
−
∥
a
−
b
∥
)
.
\mathbf{x}(\mathbf{p}) = \sum_{\mathbf{q}} G(\mathbf{q}, \mathbf{p}) \cdot \mathbf{x}(\mathbf{q}), \mathbf{p} = \mathbf{p}_0 + \mathbf{p}_n + \Delta \mathbf{p}_n,\\ G(\mathbf{q}, \mathbf{p}) = g(\mathbf{q}_x, \mathbf{p}_x) \cdot g(\mathbf{q}_y, \mathbf{p}_y) , \\ g(a, b) = \max(0, 1 - \| a -b\|).
x(p)=q∑G(q,p)⋅x(q),p=p0+pn+Δpn,G(q,p)=g(qx,px)⋅g(qy,py),g(a,b)=max(0,1−∥a−b∥).
拓展:双线性插值
首先看,双线性插值的作用,对图像进行缩放。假设原图像大小为
m
×
n
m \times n
m×n,目标图像的大小为
a
×
b
a \times b
a×b,那么两幅图像的边长比为
m
/
a
,
n
/
b
m/a,n/b
m/a,n/b。注意,通常这个比例不是整数,而非整数的坐标是无法在图像这种离散数据上使用的。双线性插值通过寻找距离这个对应坐标最近的四个像素点,来计算该点的值。比如,对应的坐标为(2.5,4.5),那么最近的像素是(2,4)(2,5)(3,4)(3,5)
若图像为灰度图像,那么
(
i
,
j
)
(i,j)
(i,j) 的灰度值可以通过以下公式计算:
f
(
i
,
j
)
=
w
1
∗
p
1
+
w
2
∗
p
2
+
w
3
∗
p
3
+
w
4
∗
p
4
f(i, j) = w1*p1 + w2*p2 + w3*p3 + w4*p4
f(i,j)=w1∗p1+w2∗p2+w3∗p3+w4∗p4
其中,
p
i
,
i
=
1
,
2
,
3
,
4
p_i, i=1,2,3,4
pi,i=1,2,3,4 为最近的四个像素点,
w
i
,
i
=
1
,
2
,
3
,
4
w_i, i=1,2,3,4
wi,i=1,2,3,4为各点相应权值。
可变形卷积结构形式?
注意:这里有一个非常非常非常容易混淆的点,所谓的deformable,到底deformable在哪?很多人可能以为deformable conv学习的是可变形的kernel,其实不是不是不是!本文并不是对kernel学习offset而是对feature的每个位置学习一个offset。
各部分维度如下:
input feature map:(batch, H, W, C)
output feature map: (batch, H, W, N)
offset field: (batch, H, W, 2N)
offset field 通过在原图上进行标准卷积操作得到,通道数为2N表示N个2维的偏置量 ( Δ \Delta Δx , Δ \Delta Δ y) ,N 表示卷积核的个数即输出特征层的通道数。
形变卷积过程可以描述为:首先在输入feature map上进行标准卷积得到N个2维的偏置量 ( Δ \Delta Δx , Δ \Delta Δy),然后分别对输入feature map上各个点的值进行修正(设 feature map为 P,即 P(x, y)= P(x + Δ \Delta Δx , y + Δ \Delta Δy) ,当 x + Δ \Delta Δ 为小数时,使用双线性插值计算 P( x + Δ \Delta Δx ,y + Δ \Delta Δy) )。形成 N个 feature map,然后使用 N 个卷积核一一对应进行卷积得到输出。
公式: