DCNv1-v4

Deformabl Convolutionv1-v4比较

​ CNN在视觉识别任务上取得了显着的成功。尽管如此,它们仍然存在上述两个缺点。它们对几何变换建模的能力主要来自于广泛的数据增强、大的模型容量和一些简单的手工制作的模块(例如,用于小平移不变性的最大池化)。

DCNv1

论文:https://openaccess.thecvf.com/content_ICCV_2017/papers/Dai_Deformable_Convolutional_Networks_ICCV_2017_paper.pdf

CNN 本质上仅限于对大型未知变换进行建模。该限制源于 CNN 模块的固定几何结构:卷积单元在固定位置对输入特征图进行采样;池化层以固定比例降低空间分辨率; RoI(感兴趣区域)池化层将 RoI 分成固定的spatial bins等。缺乏处理几何变换的内部机制。

在可变形卷积中,引入了两个新模块,它们极大地增强了 CNN 建模几何变换的能力。

image-20240726141951009

image-20240726142051319

​ 以 333*3 卷积为例,设 R={(1,1),(1,0),,(0,1),(1,1)}\mathcal{R}=\{(-1,-1), (-1,0),\dots, (0,1),(1,1)\},则卷积和 DCN 可以表示为:

Convolution:y(p0)=PnRw(pn)x(p0+pn)deformable conv(v1):y(p0)=PnRw(pn)x(p0+pn+Δpn)Convolution:\boldsymbol{y(p_0)} = \sum_{\boldsymbol{P_n} \in \mathcal{R}}\boldsymbol{w(p_n)\cdot x(p_0+p_n)} \\ deformable\ conv(v1):\boldsymbol{y(p_0)} = \sum_{\boldsymbol{P_n} \in \mathcal{R}}\boldsymbol{w(p_n)\cdot x(p_0+p_n+\Delta p_n)}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import torch
import torch.nn as nn
from torchvision.ops import deform_conv2d

class DeformConv1(nn.Module):
def __init__(self, in_channels, out_channels, kernel_size=3, stride=1, padding=1):
super().__init__()
self.offset_conv = nn.Conv2d(in_channels, 2 * kernel_size * kernel_size, kernel_size, stride, padding)
self.conv = nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding)

def forward(self, x):
offset = self.offset_conv(x)
x = deform_conv2d(x, offset, self.conv.weight, self.conv.bias,
stride=self.conv.stride, padding=self.conv.padding,
dilation=self.conv.dilation, groups=self.conv.groups)
return x

DCNv2

论文:https://openaccess.thecvf.com/content_CVPR_2019/papers/Zhu_Deformable_ConvNets_V2_More_Deformable_Better_Results_CVPR_2019_paper.pdf

​ DCNv1存在弊端:通过 PASCAL VOC 图像中偏移采样位置的排列将感受野引起的变化可视化。研究发现,激活单元的样本倾向于聚集在它所在的对象周围。然而,对象的覆盖范围并不精确,样本分布超出了感兴趣的区域:

image-20240726145646544

deformable conv(v2):y(p0)=PnRw(pn)x(p0+pn+Δpn)Δmkdeformable\ conv(v2):\boldsymbol{y(p_0)} = \sum_{\boldsymbol{P_n} \in \mathcal{R}}\boldsymbol{w(p_n)\cdot x(p_0+p_n+\Delta p_n)} \cdot \Delta m_k

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import torch
import torch.nn as nn
from torchvision.ops import deform_conv2d

class DeformConv2(nn.Module):
def __init__(self, in_channels, out_channels, kernel_size=3, stride=1, padding=1):
super().__init__()
self.offset_conv = nn.Conv2d(in_channels, 2 * kernel_size * kernel_size, kernel_size, stride, padding)
self.mask_conv = nn.Conv2d(in_channels, kernel_size * kernel_size, kernel_size, stride, padding)
self.conv = nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding)

def forward(self, x):
offset = self.offset_conv(x)
mask = self.mask_conv(x).sigmoid() # 使用sigmoid函数将掩码值映射到[0, 1]区间

x = deform_conv2d(x, offset, self.conv.weight, self.conv.bias, mask=mask,
stride=self.conv.stride, padding=self.conv.padding,
dilation=self.conv.dilation, groups=self.conv.groups)
return x

DCNv3

​ V2虽然类比于传统CNN在性能有所提升,但是对比Transformer还是有所差距。近年来大规模视觉变换器(ViT)的巨大进步相比,基于卷积神经网络(CNN)的大规模模型仍处于早期状态。为了弥补 CNN 和 ViT 之间的差距,我们首先从两个方面总结它们的差异:

  • ViT 的 多头自注意力 MHSA(MHSA)具有长程依赖性和自适应空间聚合,受益于灵活的 MHSA,ViT 可以从海量数据中学习比 CNN 更强大、更稳健的表示。

  • 从架构角度来看,除了 MHSA 之外,ViT 还包含一系列标准CNN中未包含的高级组件,例如层归一化(LN)、前馈网络(FFN) 、GELU 等

DCNv3:

  1. 借鉴了可分离卷积的想法,并将原始卷积权重 wkw_k 分离为深度部分和逐点部分,其中深度部分由原始位置感知调制标量 mkm_k 负责,逐点部分是采样点之间共享的投影权重 ww
  2. 引入多组(groups)机制
  3. 沿采样点标准化调制标量

deformable conv(v3):y(p0)=g=1GPnRwgmgkxg(p0+pn+Δpn)deformable\ conv(v3):\boldsymbol{y(p_0)} = \sum_{g=1}^G\sum_{\boldsymbol{P_n} \in \mathcal{R}}\boldsymbol{w_g \cdot m_{gk}\cdot x_g(p_0+p_n+\Delta p_n)}