可变性卷积
- 前言
- 为什么要用DConv
- 普通卷积和与可变形卷积计算过程
- 普通卷积计算过程
- Pytorch官方API
- 可变形卷积计算过程
- 参考资源
前言
可变形卷积即DCN(缩写取自Deformable ConvNets)提出于ICCV 2017的paper:
Deformable Convolutional Networks
论文paper地址:https://openaccess.thecvf.com/content_ICCV_2017/papers/Dai_Deformable_Convolutional_Networks_ICCV_2017_paper.pdf
codebase地址:(很多框架中都已实现,这里选择以pytorch的为例)https://github.com/4uiiurz1/pytorch-deform-conv-v2/blob/master/deform_conv_v2.py
3×3标准和可变形卷积的采样位置图示。(a) 标准卷积的规则采样网格(绿点)。(b) 可变形卷积中带有增强偏移量(浅蓝色箭头)的变形采样位置(深蓝色点)。(c)(d)是(b)的特例,表明可变形卷积概括了尺度、(各向异性)长宽比和旋转的各种变换。
为什么要用DConv
卷积单元(卷积核)对输入的特征图在固定的位置进行采样;池化层不断减小着特征图的尺寸;RoI池化层产生空间位置受限的RoI。然而,这样做会产生一些问题,比如,卷积核权重的固定导致同一CNN在处理一张图的不同位置区域的时候感受野尺寸都相同,这对于编码位置信息的深层卷积神经网络是不合理的。因为不同的位置可能对应有不同尺度或者不同形变的物体,这些层需要能够自动调整尺度或者感受野的方法。再比如,目标检测的效果很大程度上依赖于基于特征提取的边界框,这并不是最优的方法,尤其是对于非网格状的物体而言。
普通卷积和与可变形卷积计算过程
普通卷积计算过程
这里dilation:controls the spacing between the kernel points;
与stride相似,实际含义为:每个点之间有空隙的过滤器,即为dilation。例如,在一个维度上,一个大小为
3
3
3的过滤器
w
w
w会对输入的x进行如下计算:
w
[
0
]
∗
x
[
0
]
+
w
[
1
]
∗
x
[
1
]
+
w
[
2
]
∗
x
[
2
]
w[0] * x[0] + w[1] * x[1] + w[2] * x[2]
w[0]∗x[0]+w[1]∗x[1]+w[2]∗x[2] 。若
d
i
l
a
t
i
o
n
=
1
dilation = 1
dilation=1,过滤器会计算:
w
[
0
]
∗
x
[
0
]
+
w
[
1
]
∗
x
[
2
]
+
w
[
2
]
∗
x
[
4
]
w[0] * x[0] + w[1] * x[2] + w[2] * x[4]
w[0]∗x[0]+w[1]∗x[2]+w[2]∗x[4];换句话说,在不同点之间有一个1的差距。(Pytoch中
d
i
l
a
t
i
o
n
dilation
dilation默认等于
1
1
1,但是实际为不膨胀,也就是说设置
d
i
l
a
t
i
o
n
=
2
dilation = 2
dilation=2时才会真正进行膨胀操作)
下面动画的
d
i
l
a
t
i
o
n
=
2
dilation = 2
dilation=2 的卷积操作
Pytorch官方API
torch.nn.Conv2d(in_channels,
out_channels,
kernel_size,
stride=1,
padding=0,
dilation=1,
groups=1,
bias=True,
padding_mode='zeros')
- in_channels参数代表输入特征矩阵的深度即channel,比如输入一张RGB彩色图像,那in_channels = 3;
- out_channels参数代表卷积核的个数,使用n个卷积核输出的特征矩阵深度即channel就是n;
- kernel_size参数代表卷积核的尺寸,输入可以是int类型如3 代表卷积核的height = width = 3,也可以是tuple类型如(3, 5)代表卷积核的height = 3,width = 5;
- stride参数代表卷积核的步距默认为1,和kernel_size一样输入可以是int类型,也可以是tuple类型,这里注意,若为tuple类型即第一个int用于高度尺寸,第二个int用于宽度尺寸;
- padding参数代表在输入特征矩阵四周补零的情况默认为0,同样输入可以为int型如1代表上下方向各补一行0元素,左右方向各补一列0像素(即补一圈0),如果输入为tuple型如(2, 1) 代表在上方补两行下方补两行,左边补一列,右边补一列。可见下图,padding[0]是在H高度方向两侧填充的,padding[1]是在W宽度方向两侧填充的;
使用方法可见官方文档:https://pytorch.org/docs/stable/generated/torch.nn.Conv2d.html#
可变形卷积计算过程
∇
P
n
\nabla P_n
∇Pn是由普通卷积计算得到的,这里的
o
u
t
_
c
h
a
n
n
e
l
=
2
∗
k
e
r
n
e
l
_
s
i
z
e
2
out\_channel =2*kernel\_size^2
out_channel=2∗kernel_size2,变换生成kernel_size*kernel_size 大小的
∇
R
\nabla R
∇R表。
使用双向线性插值方法确定最后的位置,后计算value。
可变卷积形pytorch API 地址
https://pytorch.org/vision/main/generated/torchvision.ops.deform_conv2d.html#torchvision.ops.deform_conv2d
参考资源
1.https://blog.csdn.net/jiangqixing0728/article/details/126269423
2.https://www.bilibili.com/video/BV1Sh4y1y75i/?spm_id_from=333.337.search-card.all.click&vd_source=17d3748d0773a2015a74ab52544dd499