为什么使用可变形卷积:
- 自适应感受野:可变形卷积允许网络动态调整其感受野的大小和形状,使其能够更好地适应不同尺度和形状的图像特征。
- 处理几何变形:对于包含复杂几何结构的图像,可变形卷积能更好地捕捉和处理这些变形。【特别是在一个风格迁移上面,例如字体生成,他其实就是一种几何变形,可变形卷积对于几何变形非常适用】
- 增强特征提取:通过学习最优的采样位置,可变形卷积可以提取更有意义和更具代表性的特征。
普通卷积
普通卷积(dilation=1)
普通卷积就是特征图与卷积核的权重W相乘再求和
- y(p0) 表示输出特征图在位置 p0 的值。
- 𝑥(𝑝0+𝑝𝑛)表示输入特征图在位置 pn 的值。
- 𝑤(𝑝𝑛)表示卷积核在位置 𝑝𝑛 的权重。
- 𝑅 是卷积核的感受野,表示卷积核覆盖的区域
空洞卷积(dilation>1)
空洞卷积相当于pn不再是一个一个的变化,而是根据dilation进行变化
可变形卷积
可变形卷积的思想:
常规卷积的卷积核为固定的大小与形状,对于形状规则的物体可能会有更好的效果,那如果遇到形变比较复杂的物体呢?
一般来讲,可采用的做法有:丰富数据集、引入更多复杂形变的样本,使用各种数据增强和tricks,人工设计一些手工特征和算法等等,那么是否可以采用更加灵活的卷积核呢?于是可变形卷积--Deformable Conv出现了。
整体步骤:
- 学习△pn(offset坐标)
- 将原图像中的每个特征的坐标与△pn相加,得到offset后的特征应该在的位置
- 由于得到的新位置是float,所以需要双线性插值得到真正的最后坐标
- 与卷积核W相乘,然后相加
这里有一个非常非常非常容易混淆的点,所谓的deformable,到底deformable在哪?很多人可能以为deformable conv学习的是可变形的kernel,其实不是!可变形卷积并不是对kernel学习offset而是对feature的每个位置学习一个offset,然后将这个offset后的feature再与固定的kernel相乘相加。
△ Pn(feature偏移量)怎么学?
将input feature map输入进一个普通卷积,这个普通卷积学习input feature的每个位置的offset:
- in-channel = 输入图像的 channel
- out-channel = 2 * kernel-size * kernel-size【这里的out_channel是为了生成偏移的坐标,每个偏移的坐标有x、y 两个坐标值】
- stride / padding是由P0决定的
需要学习多少参数?
由于在可变形卷积中,卷积核不再是固定,而是可以根据输入特征图的内容进行调整。这种调整是通过学习每个位置的偏移量来实现的。对于一个K*K的卷积核:
- 需要学习K*K个位置的偏移。
- 每个位置有两个方向的偏移(x和y)。
因此,每个卷积核总共需要学习2*K*K个偏移参数。
对于dilation=1的情况,因为图像的大小是H*W,所以一共要学习2*K*K*H*W个参数。
https://zhuanlan.zhihu.com/p/62661196
可变形卷积(Deformable Conv)原理解析与torch代码实现-CSDN博客
论文及代码详解——可变形卷积(DCNv1)_可变形卷积v1-CSDN博客
Deformable Convolution |可变形卷积_哔哩哔哩_bilibili