Deformable Convolution 可变形卷积

时间:2022-10-16 07:53:23

  可变形卷积概念出自2017年论文:Deformable Convolutional Networks

Deformable Convolution 可变形卷积

  顾名思义,可变形卷积的是相对于标准卷积的概念而来。
Deformable Convolution 可变形卷积
(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)=pnRw(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)=pnRw(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)=qG(q,p)x(q),p=p0+pn+Δpn,G(q,p)=g(qx,px)g(qy,py),g(a,b)=max(0,1ab).

拓展:双线性插值
首先看,双线性插值的作用,对图像进行缩放。假设原图像大小为 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)=w1p1+w2p2+w3p3+w4p4
其中, 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。
Deformable Convolution 可变形卷积

各部分维度如下:
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 个卷积核一一对应进行卷积得到输出。

公式:
Deformable Convolution 可变形卷积
Deformable Convolution 可变形卷积