a 所示的正常卷积规律的采样 9 个点(绿点);b,c,d 为可变形卷积,在正常的采样坐标上加上一个位移量(蓝色箭头);其中 c和d 作为 b 的特殊情况,展示了可变形卷积可以处理尺度变换,比例变换和旋转变换等特殊情况。
普通的卷积,以3 × 3 3\times 33×3卷积为例,对于每个输出y ( p 0 ) , p 0 = ( 0 , 0 ) y(p_{0}),p_{0}=(0,0)y(p0),p0=(0,0),都要从x xx上面采样9个位置,这9个位置都在中心位置x ( p 0 ) x(p_{0})x(p0)向四周扩散,( − 1 , − 1 ) (-1,-1)(−1,−1)代表x ( p 0 ) x(p_{0})x(p0)的左上角,( 1 , 1 ) (1,1)(1,1)代表x ( p 0 ) x(p_{0})x(p0)的右下角。采样区域包括:R = { ( − 1 , − 1 ) , ( − 1 , 0 ) , . . . , ( 1 , 1 ) } R=\left\{(-1,-1),(-1,0),...,(1,1)\right\}R={(−1,−1),(−1,0),...,(1,1)}所以传统卷积输出的就是:y ( p 0 ) = ∑ p n ∈ R w ( p n ) ⋅ x ( p 0 + p n ) y(p_{0})=\sum_{p_{n}\in R}w(p_{n})\cdot x(p_{0}+p_{n})y(p0)=pn∈R∑w(pn)⋅x(p0+pn)其中,p n p_{n}pn是采样网格中的第n nn个点,w ( p n ) w(p_{n})w(pn)为对应的卷积核权重系数。
正如上面阐述的可变形卷积,就是在传统的卷积操作上加入了一个偏移量Δ p n \Delta p_{n}Δpn,正是这个偏移量才让卷积变形为不规则的卷积,这里要注意这个偏移量可以是小数,所以下面的式子的特征值需要通过双线性插值的方法来计算。y ( p 0 ) = ∑ p n ∈ R w ( p n ) ⋅ x ( p 0 + p n + Δ p n ) y(p_{0})=\sum_{p_{n}\in R}w(p_{n})\cdot x(p_{0}+p_{n}+\Delta p_{n})y(p0)=pn∈R∑w(pn)⋅x(p0+pn+Δpn)这个偏移量的计算如下:
为了解决无关区域的问题,在DCNv2中,引入权重系数Δ m k ∈ [ 0 , 1 ] \Delta m_{k}\in [0,1]Δmk∈[0,1],如果这个采样点的区域不感兴趣,权重系数的值会很小,DCNv2为:y ( p 0 ) = ∑ p n ∈ R w ( p n ) ⋅ x ( p 0 + p n + Δ p n ) ⋅ Δ m k y(p_{0})=\sum_{p_{n}\in R}w(p_{n})\cdot x(p_{0}+p_{n}+\Delta p_{n})\cdot\Delta m_{k}y(p0)=pn∈R∑w(pn)⋅x(p0+pn+Δpn)⋅Δmk同样的,Δ m k \Delta m_{k}Δmk也是由单独的卷积层输出的。
参数x为输入:形状为( N , C i n , H i n , W i n ) (N,C_{in},H_{in},W_{in})(N,Cin,Hin,Win);
offset为可变形卷积的输入坐标偏移:形状为( N , 2 ∗ H f ∗ W f , H o u t , W o u t ) (N,2*H_{f}*W_{f},H_{out},W_{out})(N,2∗Hf∗Wf,Hout,Wout);
weight为卷积核参数:形状为( C o u t , C i n , H f , W f ) (C_{out},C_{in},H_{f},W_{f})(Cout,Cin,Hf,Wf);
mask为可变形卷积的输入掩码:形状为( N , H f ∗ W f , H o u t , W o u t ) (N,H_{f}*W_{f},H_{out},W_{out})(N,Hf∗Wf,Hout,Wout),当使用DCN v1时,mask设置为None。
输出张量的形状为( N , C o u t , H o u t , W o u t ) (N,C_{out},H_{out},W_{out})(N,Cout,Hout,Wout);
其中:H o u t = ( H i n + 2 ∗ p a d d i n g s [ 0 ] − ( d i l a t i o n s [ 0 ] ∗ ( H f − 1 ) + 1 ) ) s t r i d e s [ 0 ] + 1 H_{out}=\frac{(H_{in}+2*paddings[0]-(dilations[0]*(H_{f}-1)+1))}{strides[0]}+1Hout=strides[0](Hin+2∗paddings[0]−(dilations[0]∗(Hf−1)+1))+1W o u t = ( W i n + 2 ∗ p a d d i n g s [ 1 ] − ( d i l a t i o n s [ 1 ] ∗ ( W f − 1 ) + 1 ) ) s t r i d e s [ 1 ] + 1 W_{out}=\frac{(W_{in}+2*paddings[1]-(dilations[1]*(W_{f}-1)+1))}{strides[1]}+1Wout=strides[1](Win+2∗paddings[1]−(dilations[1]∗(Wf−1)+1))+1
关于api内部操作的细节
每个input图片数据对应的输出feature map中的每个pixel位置都有一个大小为2 ∗ H f ∗ W f 2*H_{f}*W_{f}2∗Hf∗Wf的偏移项和H f ∗ W f H_{f}*W_{f}Hf∗Wf的掩膜。这样的大小设置是因为在每个输出pixel位置上我们有H f ∗ W f H_{f}*W_{f}Hf∗Wf个采样点,每个点都有对应的两个偏移方向和一个重要程度。前者就对应了我们的偏移项,后者就对应了掩膜项。
Reference
[1] Dai J , Qi H , Xiong Y , et al. Deformable Convolutional Networks[J]. IEEE, 2017.
[2] Zhu X , Hu H , Lin S , et al. Deformable ConvNets V2: More Deformable, Better Results[C]// 2019 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR). IEEE, 2019.