DCNv4论文解析:CVPR2024顶会|纯Pytorch实现代码,无需编译|即插即用,一键运行,高效可变形卷积网络:重新思考视觉应用的动态和稀疏算子
DCNv4论文解析:CVPR2024顶会|纯Pytorch实现代码,无需编译|即插即用,一键运行,高效可变形卷积网络:重新思考视觉应用的动态和稀疏算子
DCNv4论文解析:纯Pytorch实现,无需编译!CVPR顶会|利用可变形卷积探索大规模视觉基础模型
论文提出了可变形卷积v4(DCNv4),通过优化内存访问和重新设计算子,显著提升了运行效率和性能,使其成为一种高效的动态和稀疏算子,在多种视觉任务和模型架构中展现出强大的潜力。

论文信息:Efficient Deformable ConvNets: Rethinking Dynamic and Sparse
Operator for Vision Applications
论文链接:https://arxiv.org/pdf/2401.06197
文章末尾部分 包含 YOLO11、YOLOv8、YOLOv12、RT-DETR、YOLOv7、YOLOv10、YOLOv5 等模型 结合+ DCNv4卷积 高效可变形卷积网络:重新思考视觉应用的动态和稀疏算子|原创改进核心内容

在计算机视觉领域,卷积网络(ConvNets)和Transformer的性能之争一直备受关注。近年来,Transformer凭借注意力机制在大型视觉模型中取得显著成果,展现出超越ConvNets的潜力。然而,像InternImage和ConvNeXt等基于卷积网络的视觉模型,依然在性能、效率、简洁性以及对下游任务的适应性方面表现出色,在图像生成等领域,卷积仍是首选方法,这凸显了基于卷积方法的持久价值。
可变形卷积v3(DCNv3)作为先进卷积网络模型InternImage的核心算子,创新性地将稀疏注意力机制与卷积相结合。它以小窗口(如 3 × 3 3×3 3×3)滑动处理每个输出位置,动态采样点并聚合空间特征,有望实现更快的收敛速度和更低的推理延迟。尽管如此,DCNv3存在运行速度慢和初始训练阶段收敛慢等问题,这限制了其在视觉骨干模型中的广泛应用。
为解决这些问题,论文提出了可变形卷积v4(DCNv4),通过优化内存访问和重新设计算子,显著提升了运行效率和性能,使其成为一种高效的动态和稀疏算子,在多种视觉任务和模型架构中展现出强大的潜力。


1. 相关工作
1.1 视觉模型中的核心算子
- 标准卷积:是最普遍且有影响力的算子,构成了大多数计算机视觉架构的骨干。
- 深度可分离卷积(DWConv):将空间和通道操作分离,在开发轻量级和高效模型中发挥了关键作用。
- RepLKNet:表明纯卷积网络利用大内核深度卷积,能在效率和有效性上取得有竞争力的性能。
- 可变形卷积(DCN)系列:通过向卷积核添加可学习的偏移量,显著提升了卷积的适应性。
- 注意力机制:能够建模长距离依赖关系,已成功应用于各种计算机视觉任务。
- 窗口注意力:通过将注意力操作限制在固定大小的窗口内,降低了普通注意力固有的计算复杂度。
- 可变形注意力:使每个查询能够集中在选定数量的关键采样点上,采样点位置和权重动态确定,有效降低计算复杂度,广泛应用于多种感知方法。
- DynamicConv和dynamicDWNet:通过合并动态权重增强深度卷积(DWConv),实现实例特定权重的动态适应。
- 稀疏算子:用于非网格结构数据,通过双线性插值或以参数化方式获取动态权重。
1.2 回顾DCNv3
给定输入 x ∈ R H × W × C x \in \mathbb{R}^{H×W×C} x∈RH×W×C(高度为 H H H,宽度为 W W W,通道为 C C C),DCNv3对于每个点 p 0 p_{0} p0的操作定义为:
y g = ∑ k = 1 K m g k x g ( p 0 + p k + Δ p g k ) y_{g}=\sum_{k = 1}^{K}m_{gk}x_{g}(p_{0} + p_{k}+\Delta p_{gk}) yg=k=1∑Kmgkxg(p0+pk+Δpgk)
y = c o n c a t ( [ y 1 , y 2 , . . . , y G ] , a x i s = − 1 ) y = concat([y_{1}, y_{2},..., y_{G}], axis = -1) y=concat([y1,y2,...,yG],axis=−1)
其中, G G G表示空间聚合组的数量;对于第 g g g组, x g , y g ∈ R H × W × C ′ x_{g}, y_{g} \in \mathbb{R}^{H×W×C'} xg,yg∈RH×W×C′( C ′ = C / G C' = C / G C′=C/G为组维度)表示切片后的输入/输出特征图; m g k ∈ R m_{gk} \in \mathbb{R} mgk∈R表示第 g g g组中第 k k k个采样点的空间聚合权重(也称为调制标量),由输入 x x x决定,并通过softmax函数沿 K K K维度归一化; p k p_{k} pk表示预定义网格采样位置,如常规卷积中的 ( − 1 , − 1 ) , ( − 1 , 0 ) , . . . , ( 0 , + 1 ) , . . . , ( + 1 , + 1 ) {(-1, -1), (-1, 0),..., (0, +1),..., (+1, +1)} (−1,−1),(−1,0),...,(0,+1),...,(+1,+1); Δ p g k \Delta p_{gk} Δpgk是第 g g g组中与网格采样位置 p k p_{k} pk对应的偏移量。在DCNv3算子前后可应用 1 × 1 1×1 1×1逐点卷积以增强模型的表达能力。DCNv3结合了卷积和注意力的特点,既以滑动窗口方式处理输入数据,继承了卷积的归纳偏差,又能根据输入特征动态预测采样偏移 Δ p \Delta p Δp和空间聚合权重 m m m,具有动态特性。
1.3 视觉骨干网络中的内存访问成本(MAC)
FLOPs(浮点运算次数)虽常被用于衡量模型复杂度,但不能准确代表模型的速度或延迟。在实际场景中,模型的运行速度受多种因素影响,内存访问成本(MAC)起着尤为重要的作用。例如,Flash - Attention通过减少对高带宽内存(HBM)的访问次数,尽管其FLOPs比普通注意力更高,但在实践中实现了显著更快的速度。DCN算子在FLOPs方面没有劣势,但与DW - Conv相比,由于较高的内存访问成本,其延迟明显更长。本文对DCN算子的内存访问成本进行了深入分析和优化,以显著加速DCN的运行速度。
2. 方法
2.1 重新思考可变形卷积中的动态特性
- Softmax归一化:卷积和DCNv3的一个关键区别在于,DCNv3按照缩放点积自注意力的惯例,使用softmax函数对空间聚合权重 m m m进行归一化,而卷积则不对其权重使用softmax,且仍能良好工作。注意力需要softmax的原因是,对于缩放点积自注意力( Q , K , V ∈ R N × d Q, K, V \in \mathbb{R}^{N×d} Q,K,V∈RN×d),其定义为 s o f t m a x ( 1 d Q K ⊤ ) V softmax(\frac{1}{\sqrt{d}}QK^{\top})V softmax(d1QK⊤)V,其中 N N N是同一注意力窗口中的点数, d d d是隐藏维度。若没有softmax,先计算 K ⊤ V ∈ R d × d K^{\top}V \in \mathbb{R}^{d×d} K⊤V∈Rd×d,会退化为同一注意力窗口中所有查询的线性投影,导致性能下降。然而,对于像深度卷积和DCNv3这样每个点都有自己专用聚合窗口的卷积算子,且每个聚合窗口中的值已经不同,不存在“键”的概念,这种退化问题不再存在,归一化也就变得不必要。实际上,使用softmax将卷积权重归一化在固定的 0 − 1 0 - 1 0−1范围内,可能会严重限制算子的表达能力,使学习速度变慢。为验证这一假设,论文训练了一个ConvNeXt模型,并在卷积前对深度卷积权重的 7 × 7 7×7 7×7窗口应用softmax。从实验结果(表1)可以观察到,模型性能和收敛速度都显著下降。这表明,对于像卷积或DCN这样在每个位置都有专用聚合窗口的算子,无界范围的聚合权重比经过softmax归一化的有界范围权重具有更好的表达能力。
- 增强动态特性:受上述观察的启发,论文在DCNv4中移除了DCNv3中的softmax归一化,将调制标量从 0 0 0到 1 1 1的范围转换为类似于卷积的无界动态权重。如图2所示,这种改变进一步放大了DCN的动态特性,而其他算子在动态特性方面存在一定限制,如注意力和DCNv3的权重值范围有界,卷积的聚合窗口固定且聚合权重与输入无关。图1b显示,通过这一改变,DCNv4的收敛速度明显快于DCNv3和其他常见算子,包括卷积和注意力。第4节的实验结果进一步表明,DCNv4在预训练和迁移学习设置中都表现良好。
2.2 加速DCN
- GPU效率的理论分析:研究首先对DCNv3算子的计算行为进行理论分析,采用屋顶线模型评估其性能,重点关注理论FLOPs和内存访问成本(MAC)。对于形状为 ( H , W , C ) (H, W, C) (H,W,C)的输入和输出张量,DCNv3算子需要 36 H W C 36HWC 36HWC次FLOPs,其中 3 × 3 3×3 3×3表示卷积核的空间维度,系数 4 4 4用于每个采样点的双线性插值。根据[27]中的框架,DCNv3的MAC计算为 2 H W C + 27 H W G 2HWC + 27HWG 2HWC+27HWG。第一项对应输入/输出特征图的大小,第二项对应DCNv3的偏移量和聚合权重( G G G组)。假设组维度为 16 16 16,近似 G G G为 C / 16 C/16 C/16,则MAC约为 3.7 H W C 3.7HWC 3.7HWC。然而,这是在无限缓存和每个值仅读取一次内存的理想情况下,在并行计算环境中,由于并发线程执行需要同时访问数据,这种情况通常不现实。为估计最大内存访问需求,考虑无缓存的场景,每个输出位置需要重新读取内存,涉及 36 36 36次双线性插值读取、 27 27 27次偏移/聚合权重读取和 1 1 1次写入操作,MAC为 64 H W C 64HWC 64HWC,是理想情况的 17 17 17倍。这种分析揭示了计算与内存访问比例的巨大差距(范围从 0.6 0.6 0.6到 9.7 9.7 9.7),突出了内存访问优化的巨大潜力。值得注意的是,尽管DCNv3使用依赖于输入的动态偏移导致内存访问不确定,但同一组内的通道共享偏移值,这为提出特定的优化策略以提高DCNv3的速度提供了思路。
- 消除冗余工作量:在以前的DCN内核CUDA实现中,对于形状为 ( H , W , C ) (H, W, C) (H,W,C)的输入、 ( H , W , G , K 2 × 2 ) (H, W, G, K^{2}×2) (H,W,G,K2×2)的偏移量和 ( H , W , G , K 2 ) (H, W, G, K^{2}) (H,W,G,K2)的聚合权重,通常会创建 H × W × C H×W×C H×W×C个线程以最大化并行性,每个线程处理一个输出位置的一个通道。实际上,每组内的 D = C / G D = C / G D=C/G个通道在每个输出位置共享相同的采样偏移和聚合权重值。使用多个线程处理这些通道会导致不同线程多次从GPU内存读取相同的采样偏移和聚合权重值,这对于内存受限的算子来说是一种浪费。通过让一个线程处理每个输出位置同一组内的多个通道,可以消除这些冗余的内存读取请求,大大降低内存带宽的使用。由于采样位置相同,还可以只计算一次DCN中使用的双线性插值系数。具体来说,如果每个线程处理 D ′ D' D′个通道,读取偏移和聚合权重的内存访问成本以及计算双线性插值系数的计算成本都可以降低 D ′ D' D′倍。
- 消除冗余内存指令:在实践中,仅通过重用线程处理多个通道并不能提高速度。因为当 D ′ D' D′增加时,线程数量减少,每个线程的工作量增加 D ′ D' D′倍,这实际上降低了CUDA内核的并行度。幸运的是,DCN内核现在计算量较轻,因为双线性插值只需对所有 D ′ D' D′个通道执行一次,大部分工作量是从不同通道读取输入值的内存指令。当内存布局为通道最后,且所有 D ′ D' D′个通道值是连续的时,可以利用向量化加载。例如,读取四个32位浮点值时,可使用一条指令一次加载一个128位的打包值,而不是用四条指令分别读取,从而减少每个线程的指令数量和执行时间。在将最终结果写入GPU内存时,也可应用类似技术,最小化内存访问时间并提高内存带宽利用率。此外,现代半精度数据格式(float16/bfloat16)可将需要加载的字节数减半,意味着在相同内存带宽下,使用半精度格式时内存效率可提高一倍。在原始DCNv3实现中,使用半精度数据未观察到速度提升,可能是由于数据访问和计算的开销过大,而在新的实现中,速度提升显著。需要注意的是,上述优化技术也可应用于DCNv1/v2和可变形注意力,因为它们具有相似的性能瓶颈和问题。
- DCN模块的微设计:DCNv3模块引入了多个微设计,随着核心内核的优化,这些微设计对速度的影响变得不可忽视。论文确定了DCNv3设计中可进一步优化的两个点:一是在移除softmax并将调制标量转换为动态聚合权重后,计算偏移和动态权重的线性层实际上可以合并为一个线性层,这减少了网络碎片化,消除了额外的开销,如内核启动和同步,提高了GPU上的运行时效率;二是在原始DCNv3模块设计中,使用了一个由深度 3 × 3 3×3 3×3卷积、层归一化(LN)、GELU和线性层组成的复杂子网来计算偏移和动态权重。按照Xception的设计,移除额外的LN - GELU层并使用原始的可分离卷积结构,进一步减少了运行时间。通过实验发现,如果延迟是更高优先级,深度卷积也可以移除,仅会有轻微的性能损失。
3. 实验

3.1 算子的速度基准测试
- 设置:通过测量构建先进视觉骨干模型的几个代表性算子的运行时间进行算子级基准测试,包括用PyTorch实现的全注意力、先进的FlashAttention - 2实现、窗口大小为 7 × 7 7×7 7×7的窗口注意力、分别由cuDNN和PyTorch的ATen库实现的 7 × 7 7×7 7×7窗口深度卷积。为简化,仅对空间聚合的核心操作进行基准测试,排除qkv投影和输出投影层等额外线性层的运行时测量。对于输入尺度,首先考虑从标准 224 × 224 224×224 224×224输入分辨率生成的特征图形状,具有常见的 4 , 8 , 16 , 32 × 4, 8, 16, 32× 4,8,16,32×下采样率,用于分层卷积网络/Transformer骨干模型;还添加了像ViT这样的各向同性骨干模型的特征图形状,下采样率为 16 16 16且隐藏维度更大。此外,考虑到下游任务(如目标检测)中常用的高分辨率输入,将分层特征图和各向同性特征图的输入形状分别设置为 800 × 1280 800×1280 800×1280和 1024 × 1024 1024×1024 1024×1024,批量大小分别为 64 64 64和 1 1 1。对于具有头/组概念的算子,将每个头/组的维度设置为 32 32 32,并在隐藏维度变化时改变头/组的数量。
- 结果:在标准分辨率和高分辨率输入上的基准测试结果分别如表2和表3所示。除FlashAttention(无FP32实现)外,报告了FP32和FP16数据格式的结果。用PyTorch实现的密集全局注意力在输入分辨率较大时速度明显较慢,甚至出现内存不足的情况。FlashAttention显著提高了注意力的速度,在某些情况下甚至比 7 × 7 7×7 7×7窗口注意力更快,表明了适当优化的重要性。然而,它并没有改变注意力的二次复杂度,在高输入分辨率下,仍落后于窗口注意力或卷积等局部/稀疏算子。虽然DCNv3比普通实现的DWConv快,但比经过大量优化的cuDNN版本慢。相比之下,DCNv4比DCNv3提速超过3倍,大大节省了运行时间。此外,DCNv4成功利用了 3 × 3 3×3 3×3稀疏窗口的优势,在不同设置下的运行速度明显快于其他基线。
3.2 图像分类

- 设置:在ImageNet分类任务上评估DCNv4的有效性。以强大的基线模型InternImage为基础,将其原有的DCNv3替换为DCNv4,创建FlashInternImage。所有其他实现细节,包括网络架构和超参数,都与InternImage保持一致。同时,比较了Swin - Transformer和ConvNeXt这两个Transformer和ConvNet模型中的代表性基线。按照常见做法,在ImageNet1K上对FlashInternImage - Tiny/Small/Base训练300个epoch,对FlashInternImage - Large先在ImageNet - 22K上训练90个epoch,然后在ImageNet - 1K上微调20个epoch,其他基线模型为了公平比较也采用相同设置。
- 结果:表4展示了不同尺度模型的结果。除了模型大小和训练/推理分辨率外,还报告了每个模型在FP32/FP16数据格式下的整体吞吐量(每秒图像数)。为了公平比较,使用timm实现的ConvNeXt和Swin Transformer,其实际速度比原始实现更快。配备DCNv4的FlashInternImage显著提高了InternImage对应模型的吞吐量,提升幅度超过50% - 80%,同时模型性能也有轻微提升。FlashInternImage现在与ConvNeXt速度相当,但准确率更高。值得注意的是,FlashInternImage - S的准确率优于ConvNeXt - B(84.4% vs. 83.8%),且速度更快,展现了更好的速度 - 精度权衡。此外,FlashInternImage - L甚至超过了ConvNeXt - XL和InternImage - XL,速度提升30% - 130%(401 vs. 174),证明了DCNv4模块的有效性。
3.3 高分辨率输入的下游任务
- 实例分割:利用Mask R-CNN和Cascade Mask-RCNN这两个具有代表性的实例分割框架,在COCO数据集上,以1×(12个epoch)和3×(36个epoch)的训练周期对FlashInternImage进行训练。结果在表5中展示,同时报告了批量大小为16、FP32/FP16数据格式下的每秒帧数(FPS)。FlashInternImage在所有模型规模和训练周期下均展现出卓越的性能,实现了更高的速度 - 精度平衡。比如,FlashInternImage-T/S超越了所有相同规模的其他模型,并且与更大规模的InternImage-S/B性能相当,但其速度却快80%-90%。
- 语义分割:运用UperNet在ADE20K数据集上对FlashInternImage进行160K次迭代训练。从表6的结果中能得出与实例分割相似的结论,这里同样报告了批量大小为16、FP32/FP16数据格式下的FPS。配备DCNv4的FlashInternImage在不同模型规模下,不仅速度显著提升,还进一步优化了InternImage的性能,达到了新的最优水平。
- 3D目标检测:在自动驾驶场景中基于摄像头的3D目标检测任务上对DCNv4进行测试。使用FlashInternImageSmall和Base骨干模型,在nuScenes数据集上对最先进的多摄像头3D目标检测器BEVFormer v2训练24个epoch。在表7中报告nuScenes测试集的结果以及每个模型的FPS。由于BEVFormer v2中的头部分(如BEV编码器和目标解码器)未充分优化,占用了超过50%的运行时间(骨干模型速度越快,占比越高),因此也报告骨干模型的FPS以便更清晰地说明。结果显示,仅考虑骨干模型时,FlashInternImage的速度比InternImage骨干模型快两倍甚至三倍,且性能相当,极大地提高了模型效率 。
3.4 DCNv4作为通用算子
- 在其他视觉骨干网络中的即插即用:验证DCNv4在使用其他算子设计的架构(如ConvNeXt和ViT)中是否依然能良好运行。在ViT和ConvNeXt中,将注意力模块和深度卷积层替换为DCNv4,然后在ImageNet-1K上进行监督学习,且不改变其他架构和超参数,与FlashInternImage和InternImage的设置类似。从表4的结果可知,在这些针对特定算子精心调整的架构上,DCNv4表现同样出色。得益于DCNv4的快速速度,新模型甚至能实现更高的吞吐量,充分展示了DCNv4的卓越性能。
- 在扩散模型中的即插即用:DCN已被公认为感知任务中的有效算子。随着生成模型成为人工智能生成内容(AIGC)的基础工具,研究人员好奇DCNv4在基于扩散的生成模型的生成任务中是否也能表现良好。具体来说,选择在潜在扩散模型中使用的U-Net,以Stable Diffusion为基线,替换U-Net中的注意力模块和常规3×3卷积。使用U-ViT的代码库,遵循其训练计划,并基于Stable Diffusion提供的图像自动编码器提取的图像潜变量训练一个潜在扩散模型。从表9的结果可以看出,DCNv4在生成建模中同样表现出色,与U-Net中的常规卷积相比,在更少的参数下实现了更好的FID(Frechet Inception Distance,用于衡量生成图像与真实图像之间的距离)/吞吐量结果。需要注意的是,当前的架构/超参数可能并非DCNv4的最优设置,重新设计模型或搜索新的超参数可能会带来更好的结果。
3.5 消融研究
对第3.2节中描述的优化选择进行消融研究,结果如表10所示。表中的时间是在输入为56×56×128、批量大小为64、4个组(每组32个通道)的情况下获得的。首先移除softmax操作并改进微设计,即将两个线性层合并为一个,并在计算偏移/聚合权重时移除代价较高的层归一化和GELU激活函数,简化整体模块并提高速度。然后开始修改内核实现,改变并行执行模式,让每个线程处理8个通道而非1个通道,这样可以节省从GPU内存加载采样偏移和聚合权重值时不必要的内存访问。但正如预期,仅应用此更改不会提高速度,因为并行度降低,每个线程的工作量增加了8倍,延迟反而增加。通过重用双线性插值系数消除冗余计算(第4行)可以节省一些时间,但效果不明显。通过向量化加载/存储移除冗余内存指令(第5行)可以大大减少每个线程的工作量,显著加快GPU内核速度。使用半精度数据类型(第6行),使内核读写的字节数减半,进一步提高了数据吞吐量。最终得到DCNv4的设计,其效率比原始实现提高了三倍 。
4. 结论
论文提出了可变形卷积v4(DCNv4),这是一种高效的动态和稀疏算子。通过重新思考可变形卷积中的动态特性并优化内存访问,DCNv4比其前身DCNv3速度更快、效果更好。配备DCNv4的FlashInternImage骨干网络不仅提高了速度,还在各种视觉任务中提升了性能。通过将DCNv4集成到ConvNeXt和ViT等最先进的架构中,展示了其作为通用算子的通用性和有效性,新模型在吞吐量和准确率上均有所提高;同时,DCNv4在潜在扩散模型中也表现良好,显示出其增强生成模型的潜力。
五、芒果YOLO系列改进:基于 原创改进内容🚀🚀🚀
5.1 将 DCNv3 改进到 YOLO11 中 - 基于 DCNv3 原创改进核心内容
详情改进内容点击:🚀🚀🚀芒果YOLO11改进:主干Backbone篇之DCNv3结构:即插即用|使用pytorch代码实现,并针对YOLO11专门优化模块
5.2 将 DCNv3 改进到 YOLOv8 中 - 基于 DCNv3 原创改进核心内容
详情改进内容点击:🚀🚀🚀芒果YOLOv8改进:主干Backbone篇之DCNv3结构:即插即用|使用pytorch代码实现,并针对YOLOv8专门优化模块
5.3 将 DCNv3 改进到 YOLOv10 中 - 基于 DCNv3 原创改进核心内容
详情改进内容点击:🚀🚀🚀芒果YOLOv10改进:主干Backbone篇之DCNv3结构:即插即用|使用pytorch代码实现,并针对YOLOv10专门优化模块
5.4 将 DCNv3 改进到 RT-DETR 中 - 基于 DCNv3 原创改进核心内容
详情改进内容点击:🚀🚀🚀芒果RT-DETR改进:主干Backbone篇之DCNv3结构:即插即用 框架为ultralytics,和YOLOv8一致
5.5 将 DCNv3 改进到 YOLOv7 中 - 基于 DCNv3 原创改进核心内容
详情改进内容点击:🚀🚀🚀芒果YOLOv7改进61:主干篇:改进DCNv3结构:即插即用|使用纯pytorch代码实现,不需要CUDA编译,并针对YOLOv7专门优化模块,基于可变形卷积的超强变种
5.6 将 DCNv3 改进到 YOLOv5 中 - 基于 DCNv3 原创改进核心内容
详情改进内容点击:🚀🚀🚀芒果YOLOv5改进76:主干Backbone篇之DCNv3:即插即用|使用pytorch代码实现,并针对YOLOv5专门优化模块,基于可变形卷积的超强变种
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)