【第8篇】OverLock(CVPR2025):新型卷积神经网络OverLoCK,通用的即插即用Backbone!

论文题目:OverLoCK: An Overview-first-Look-Closely-next ConvNet with Context-Mixing Dynamic Kernels
中文题目:OverLoCK:一种先概览-再仔细观察-最后上下文混合动态核的卷积网络
文献地址:https://arxiv.org/pdf/2502.20087
源码地址:https://github.com/LMMMEng/OverLoCK
所属单位:香港大学计算与数据科学学院
image.png

传统卷积网络通常采用自下而上的特征提取方式:随着网络逐层加深,特征图不断缩小、语义逐渐增强。但这种单向信息流存在一个问题——中间特征只能继续向下编码,难以提前获得来自高层语义的指导。
人类观察图像时往往不是逐像素扫描,而是先快速形成场景概览,再把注意力集中到重要区域。OverLoCK 正是从这一过程出发,在纯卷积网络中构造一条自上而下的上下文指导流,让模型实现“先概览、再聚焦”。
🔥🔥🔥**本篇内容** : 本文介绍 CVPR 2025 纯卷积视觉网络 OverLoCK。模型提出 Deep-stage Decomposition Strategy(深度阶段分解策略,DDS)与 Context-Mixing Dynamic Convolution(上下文混合动态卷积,ContMix),分别解决“高层语义如何反向指导特征提取”和“卷积如何兼顾长程依赖与局部归纳偏置”两个问题。

五分钟回顾模型

OverLoCK 的名字直接概括了它的工作方式:

Overview First,Look Closely Next——先形成全局概览,再聚焦关键细节。

它要解决的核心矛盾是:传统 CNN 擅长提取局部模式,但缺少显式的自上而下语义指导;大核卷积和动态卷积能够扩大感受野,却不一定同时兼顾输入自适应、长程依赖和局部细节。
OverLoCK 从整体上采用分支式纯卷积架构。输入先经过 Base-Net 形成通用中层特征;Overview-Net 在更低分辨率上快速建立全局上下文;Focus-Net 再接收中层特征和上下文先验,聚焦关键区域并生成高层特征。三个子网络共同组成一条“先概览、再聚焦”的信息流。
OverLoCK整体框架
从这个整体框架向下看,OverLoCK 给出的答案主要包含 DDS 和 ContMix 两项创新:

快速回顾项传统问题OverLoCK 的设计直接作用
深层信息流只有自下而上的逐级编码DDS:Base、Overview、Focus先概览,再用上下文指导聚焦
长程建模固定卷积核的有效范围有限ContMix:上下文生成动态核根据输入调整空间聚合方式
局部细节全局建模可能削弱局部归纳偏置大核组与 5×5 小核组并用同时覆盖长程关系与局部结构

DDS:把深层网络拆成三个协同部分。 Deep-stage Decomposition Strategy(DDS)将网络拆分为:

  • Base-Net:提取低层和中层通用特征,为后续两个分支提供基础表示。
  • Overview-Net:在更低分辨率上快速获得高语义的全局概览。
  • Focus-Net:在 Overview-Net 的上下文先验指导下,进一步提取细粒度高层特征。
    这种设计不需要反复递归计算,而是通过一次 Overview 和一次 Focus 建立自上而下的信息流。
    ContMix:让上下文进一步参与局部卷积。 Context-Mixing Dynamic Convolution(ContMix)位于 Focus-Net 的 Dynamic Block 中。它先将全局上下文压缩成固定数量的区域中心,再计算局部位置与区域中心的关联,根据关联结果生成位置相关的动态卷积核。
    image.png
    简单理解,普通卷积对所有输入使用一组固定参数;ContMix 则让不同位置根据当前图像的全局上下文选择不同的聚合方式。
    为兼顾不同尺度,一部分通道组使用较大的动态核建模长程依赖,另一部分使用 5×5 小核保留局部细节。这使 ContMix 既能“看得远”,又不会完全丢掉 CNN 擅长的局部归纳偏置。
    模型变体。 OverLoCK 提供 XT、T、S、B 四种模型规模,通过通道数、Block 数量、卷积核尺寸和分组数调节计算量与容量,可以作为分类、检测和分割任务的通用 Backbone。
    OverLoCK模型变体

Base-Net 负责建立基础表示,Overview-Net 负责快速理解全局,Focus-Net 在全局语义指导下仔细观察;ContMix 则继续向下,把这种指导转化为输入相关的动态卷积核。

实验结果

image.png

ImageNet-1K 图像分类

224×224 输入下,

  • OverLoCK-T 的 Top-1 Accuracy 为 84.2%。
  • OverLoCK-B 的 Top-1 Accuracy 为 85.1%。
  • 将输入提高到 384×384 后,OverLoCK-B 达到 86.2%。
    OverLoCK在ImageNet-1K上的结果
    这些结果说明,OverLoCK 不只适用于密集预测,其纯卷积 Backbone 在分类任务上也具有较强的表征能力。具体优劣仍应在相同输入分辨率、训练策略、预训练数据和计算预算下比较。

目标检测与实例分割

使用 Mask R-CNN 3× 调度时, OverLoCK-S 的框检测 AP(APᵇ)达到 51.0,实例分割 AP(APᵐ)达到 45.0;采用 Cascade Mask R-CNN 时,OverLoCK-B 的 APᵇ 与 APᵐ 分别为 53.9 和 46.8。
OverLoCK目标检测与实例分割结果
检测与分割结果表明,Overview-Net 提供的上下文指导并非只对分类有效,它也能服务于需要多尺度输出的下游任务。

ADE20K 语义分割

在 UperNet 框架下,原文档记录:

BackbonemIoUMulti-scale mIoU
OverLoCK-T50.350.8
OverLoCK-B51.752.3
语义分割需要同时理解全局场景与像素级局部边界,因此能够传递全局上下文的 DDS 和兼顾大小感受野的 ContMix 与这类任务较为契合

吞吐量与分布外鲁棒性

OverLoCK-XT 的吞吐量为 1672 images/s,并给出了 ImageNet-V2、ImageNet-A、ImageNet-R、ImageNet-Sketch 等分布外数据集上的结果。
OverLoCK效率与鲁棒性结果
这些实验关注的不只是标准数据集精度,也考察了模型面对数据分布变化时的表现。不过吞吐量高度依赖 GPU、batch size、数值精度和推理实现,引用时应同时保留论文对应的测试条件。

本文方法

A. 整体框架

OverLoCK 采用分支式纯卷积架构,核心基于深度阶段分解策略(DDS),由 Base-NetOverview-NetFocus-Net三个子网络组成,搭配动态上下文流实现自上而下的语义指导,整体包含 4 个 stage,输出多尺度特征用于各类视觉任务:
image.png

  • Base-Net建立通用中层表示:是OverLoCK的低层特征提取器,为后续的Overview-net概览Focus-net聚焦提供高质量中层特征。具体而言,通过三个Embedding层,逐步将输入图像(HxW)下采样至(H/16 x W / 16),在缩小分辨率、降低夹断来那个的同时,逐步聚合局部信息,生成包含边缘、纹理、简单形状等通用特征的中层特征图;另一方面,构建Basic Block基础块,结构为 “残差 3×3 深度卷积 → 层归一化 → 膨胀重参数卷积(Dilated RepConv)SE层 → 卷积前馈网络(ConvFFN),强化局部细节的特征表达。
    image.png
  • Overview-Net用低分辨率快速看全局:Base-Net的中层特征为输入,快速生成低分辨率、高语义的全局上下文先验。具体而言,将Base-Net输出的 H/16×W/16 特征进一步下采样至 H/32×W/32,也是通过Embedding层和Basic Block进行,此处下采样倍数更高,相当于用极小的计算开销覆盖整个输入图像的全局信息,生成具有指导意义的上下文先验。
  • 产生一个语义上有意义但质量较低的概览特征图,作为对输入图像的整体理解,作为上下文先验融合到Focus-Net的所有构建块中。
  • Focus-Net在全局指导下聚焦:Base-Net 的中层特征和 Overview-Net 的上下文先验为双重输入,在自上而下的指导下,精细提取高分辨率、高语义的高层特征,提升核心区域的特征区分度(如从“通用轮廓”到“猫的脸部特征”)。具体而言,采用Dynamic Block=残差 3×3 深度卷积 → 门控动态空间聚合器(GDSA) → ConvFFN;核心组件 GDSAContMixtoken混合器,输入 Base-Net特征 + Overview-net上下文先验的融合特征,通过 1×1 卷积 + SiLU 激活生成动态门控(抑制噪声),再通过 ContMix 聚合长程特征,实现 “指导 - 聚合 - 优化” 的闭环;
局部特征
   │
残差 3×3 DWConv
   │
GDSA:门控 + ContMix 动态空间聚合
   │
ConvFFN
   │
聚焦后的高层特征

Gated Dynamic Spatial Aggregator(GDSA)使用门控分支调节动态空间聚合结果,再由 ContMix 完成长程空间混合。到这一层,Overview-Net 提供的全局指导开始具体作用于局部特征聚合。
image.png
整体来看,三者的协同完美模拟了人类 “先看整体(Overview-Net)→ 再聚焦细节(Focus-Net)” 的视觉感知逻辑,同时通过 Base-Net 的通用特征支撑,既避免了传统卷积网络 “无指导的盲目提取”,又解决了 Transformer/Mamba等模型 “计算量过大” 的问题,这也是 OverLoCK 兼顾精度与效率的核心原因。
image.png
普通层级式 Backbone 通常是单向的:前一 stage 的输出直接送入下一 stage。OverLoCK 则通过 DDS 把深层处理拆成 Overview 和 Focus 两个阶段,形成两条相互配合的信息流:

  • 特征流:承载纹理、边缘、轮廓和高层语义。
  • 上下文指导流:把 Overview-Net 的全局理解送到 Focus-Net。
Base-Net 提取通用中层特征
        ↓
Overview-Net 低成本建立全局语义
        ↓
上下文先验送入 Focus-Net
        ↓
Dynamic Block 在指导下聚合局部与长程信息
        ↓
输出兼顾全局语义与局部细节的高层特征

B. Dynamic Convolution with Context-Mixing(上下文混合动态卷积)

ContMix的整体结构示意图如下图所示,作为一种即插即用的动态卷积模块,ContMix在捕捉长距离依赖关系和保持归纳偏置方面的能力如图所示。
image.png
ContMix实现了在保持卷积归纳偏置的同时,动态地对长距离依赖进行建模,从而在各种输入分辨率下都能有效地处理图像特征。实现过程:
a. 输入特征转换:输入特征 X X X被转换为两部分:Q和K。其中,Q通过1×1卷积 W q {W_q} Wq X X X进行特征提取;K是通过将 X X X通过自适应平均池化Adaptive Pooling得到S×S区域中心的聚合,再通过1x1卷积 W k {W_k} Wk进行特征提取,将Q和K的通道均匀分成G组,以获得 Q g {Q_g} Qg K g {K_g} Kg
b. 计算亲和矩阵:通过矩阵乘法计算出每一对Qg和Kg的G个亲和矩阵 A g {A^g} Ag A g {A^g} Ag的每一行 A i g {A^g_i} Aig包含了 Q g {Q_g} Qg中第 i i i个token与 K g {K_g} Kg中所有token的亲和度。
c. 生成动态卷积核:通过线性层 W d {W_d} Wd对每个亲和度矩阵 A g {A_g} Ag中的token亲和度值进行聚合,并通过softmax函数进行归一化,得到 D g D^g Dg。每个 D g D^g Dg的行可以被重塑成目标卷积核形状,从而在每个token位置产生一个输入依赖的卷积核。
d. 卷积操作:卷积操作将特征 X X X的通道均匀分成G组,同一组内的通道共享同一个动态卷积核。每个token在卷积操作中与全局信息交互,从而捕获长距离依赖。
e. ContMix的定制实现:在OverLoCK网络的Dynamic Block中,ContMix被定制实现。Q 来自 Z i Z_i Zi(局部特征),K来自 P i {P_i} Pi​(全局上下文),而非融合特征。确保 “局部像素” 与 “全局指导” 的关联更精准。此外,ContMix的S被设置为7,以确保线性时间复杂度。ContMix的组被分配给大卷积核和小卷积核,其中小卷积核的大小设置为5×5,以实现不同尺度特征的提取。
ContMix 的核心过程可以分成五步:

  1. 构造局部查询:通过 1×1 卷积从局部特征生成 Query,用来描述每个位置当前需要什么信息。
  2. 压缩全局上下文:利用自适应平均池化将上下文聚合为固定的 S×S 区域中心,再生成 Key。
  3. 计算位置—区域关联:比较每个局部位置与各区域中心,得到上下文亲和度。
  4. 生成动态核:将亲和度映射为卷积核权重,并通过 Softmax 进行归一化。
  5. 分组动态卷积:同一组通道共享相应动态核,在保留卷积局部连接形式的同时,引入来自全局上下文的权重。
    作用分析:ContMix作为一个通用的即插即用模块,其在OverLoCK网络中的实现细节包括使用当前融合特征X计算Q和K,以及将大卷积核和小卷积核的组数设置为一半,以实现长距离依赖和局部细节的建模。
    在 OverLoCK 的 Dynamic Block 中,局部特征与 Overview-Net 上下文承担不同角色:局部特征提供待聚合的位置描述,上下文先验提供全局指导。论文配置将区域中心固定为 S=7,位置与区域中心的关联规模为 HW × S²;当 S 固定时,该部分复杂度相对于 token 数 HW 呈线性增长。
    为了同时覆盖远距离关系和局部细节,ContMix 将通道组分配给不同核尺寸:一部分使用大核,另一部分使用 5×5 小核。大核扩大依赖范围,小核保留局部结构,二者共同构成多尺度空间聚合
    至此,整条由整体到局部的逻辑就完整了:DDS 决定网络如何先概览再聚焦,Base/Overview/Focus 决定上下文如何流动,Dynamic Block 和 GDSA 决定如何使用指导信息,ContMix 最终把上下文变成每个位置参与计算的动态卷积核。

环境安装

# Environments:
cuda==12.1
python==3.10
# Dependencies:
pip install torch==2.3.1 torchvision==0.18.1 --index-url https://download.pytorch.org/whl/cu121
pip install natten==0.17.1+torch230cu121 -f https://shi-labs.com/natten/wheels/
pip install timm==0.6.12
pip install mmengine==0.2.0 -i https://mirrors.ustc.edu.cn/pypi/simple/

git clone https://github.com/Shiweiliuiiiiiii/SLaK.git
pip install timm tensorboardX six
cd cutlass/examples/19_large_depthwise_conv2d_torch_extension
TORCH_CUDA_ARCH_LIST="8.0" ./setup.py install --user   # 时间有点长
A quick check: python depthwise_conv2d_implicit_gemm.py

TORCH_CUDA_ARCH_LIST="8.0" 对应特定 GPU 架构,不能直接照搬到所有设备。编译过程耗时较长属于常见现象,应根据实际 GPU Compute Capability 调整。
image.png
quick check没问题。

训练速度慢问题验证

A. 验证mmcv算子是否受pytorch高版本影响

验证高版本pytorch 2.3.1与mmdet2.28.1不兼容问题是否影响mmcv算子回退到cpu版本

python -c "import mmcv.ops; print(mmcv.ops.__all__)"

存在RoIAlign, DeformConv 等核心算子。
image.png
并验证输出的设备:

import torch
import mmcv.ops

# 测试 DeformConv2d
deform_conv = mmcv.ops.DeformConv2d(3, 3, kernel_size=3, padding=1).cuda()
x = torch.randn(1, 3, 64, 64).cuda()
offset = torch.randn(1, 18, 64, 64).cuda()
out = deform_conv(x, offset)
print(f"DeformConv2d output device: {out.device}")

# 测试 RoIAlign
roi_align = mmcv.ops.RoIAlign(output_size=(7, 7), spatial_scale=1.0, sampling_ratio=0).cuda()
x = torch.randn(1, 3, 64, 64).cuda()
rois = torch.tensor([[0, 0, 0, 10, 10]]).float().cuda()
out = roi_align(x, rois)
print(f"RoIAlign output device: {out.device}")

将上述代码放置于test_mmcv_ops.py中进行验证,输出均在cuda上。
image.png

B. 验证natten是否高效运行

python -c "import natten; print(natten.__version__)"

image.png
打印natten版本为0.17.1。
测试natten上算子耗时,1.86ms基本上也没问题。

import torch
import natten
import time

# 创建输入
B, C, H, W = 1, 64, 64, 64
x = torch.randn(B, C, H, W).cuda()

# 创建邻域注意力层,使用正确的参数名
na = natten.NeighborhoodAttention2D(
    dim=C,          # 用 dim 代替 in_channels
    kernel_size=7,
    num_heads=1     # 必须传入 num_heads
).cuda()

# 测速
start = time.time()
for _ in range(100):
    out = na(x)
torch.cuda.synchronize()
end = time.time()
print(f"NATTEN average time: {(end - start) / 100 * 1000:.2f} ms")

image.png

C. 训练iGEMM

从训练过程中,也可以看出加速库iGEMM成功加载

===== iGEMM Efficient Conv Impl, channels 64, kernel size (17, 17) =====
---------------- trying to import iGEMM implementation for large-kernel conv
---------------- found iGEMM implementation 
===== iGEMM Efficient Conv Impl, channels 64, kernel size (17, 17) =====
---------------- trying to import iGEMM implementation for large-kernel conv
---------------- found iGEMM implementation 

image.png
综上,大核卷积(iGEMM)、MMCV 算子、NATTEN 这三个核心依赖都已经确认在 GPU 上正常工作。

D. 端到端训练流程验证

使用一个简单的脚本进行验证,如下所示:

#!/usr/bin/env python3
# mmdet v2.28.1 专属性能分析脚本
import os
import sys
import torch
from torch.profiler import profile, record_function, ProfilerActivity

# 添加mmdet路径(根据你的实际路径调整)
# sys.path.append(os.path.abspath('.'))
# sys.path.append(os.path.abspath('./mmdetection'))

# 导入mmdet v2.28.2的核心模块(旧版接口)
from mmdet.apis import init_detector, set_random_seed
from mmdet.datasets import build_dataloader, build_dataset
from mmdet.models import build_detector
from mmcv import Config
from mmcv.runner import build_optimizer, EpochBasedRunner
from mmcv.parallel import MMDataParallel

def main():
    # ===================== 配置参数(根据你的实际情况修改) =====================
    CONFIG_PATH = '/home/data/Model/000_model_eval/20260227_cascadercnn_overlock-t-fpn_sdxtdataset_1x/20260227_cascadercnn_overlock-t-fpn_sdxtdataset_1x.py'  # 你的配置文件路径
    CHECKPOINT_PATH = None  # 可选:预训练权重路径
    GPU_ID = 0  # 使用的GPU编号
    # ==========================================================================

    # 1. 加载配置文件
    cfg = Config.fromfile(CONFIG_PATH)
    cfg.gpu_ids = [GPU_ID]
    set_random_seed(0, deterministic=False)

    # 2. 构建数据集和数据加载器(仅加载训练集)
    dataset = build_dataset(cfg.data.train)
    data_loader = build_dataloader(
        dataset,
        samples_per_gpu=cfg.data.samples_per_gpu,
        workers_per_gpu=cfg.data.workers_per_gpu,
        num_gpus=1,
        dist=False,
        shuffle=True
    )
    data_iter = iter(data_loader)
    data_batch = next(data_iter)  # 获取第一个batch的数据

    # 3. 构建模型(MMDataParallel适配旧版)
    model = build_detector(cfg.model, train_cfg=cfg.get('train_cfg'), test_cfg=cfg.get('test_cfg'))
    model.init_weights()
    model = MMDataParallel(model.cuda(), device_ids=[GPU_ID])
    model.train()

    # 4. 构建优化器(仅用于解析loss,不实际更新参数)
    optimizer = build_optimizer(model, cfg.optimizer)

    # 5. 执行Profiling(核心步骤)
    print("🚀 开始性能分析(mmdet v2.28.2)...")
    with profile(
        activities=[ProfilerActivity.CPU, ProfilerActivity.CUDA],
        profile_memory=True,
        record_shapes=True,
        on_trace_ready=torch.profiler.tensorboard_trace_handler('./profiler_log')
    ) as prof:
        with record_function("train_step"):
            # 执行一次完整的训练step(前向+反向)
            losses = model(** data_batch)
            loss, _ = model.module._parse_losses(losses)
            loss.backward()

    # 6. 输出并保存结果
    print("\n" + "="*80)
    print("📊 Profiling 结果(按CUDA耗时排序):")
    print("="*80)
    result_table = prof.key_averages().table(sort_by="cuda_time_total", row_limit=20)
    print(result_table)

    # 保存到文件
    with open("profiler_result.txt", "w", encoding='utf-8') as f:
        f.write(result_table)

    # 7. 提示信息
    print(f"\n✅ Profiling完成!结果已保存到:")
    print(f"   - 文本报告:{os.path.abspath('profiler_result.txt')}")
    print(f"   - TensorBoard日志:{os.path.abspath('./profiler_log')}")
    print(f"\n📌 如需可视化分析,请运行:")
    print(f"   tensorboard --logdir=./profiler_log")

if __name__ == '__main__':
    # 确保使用GPU
    assert torch.cuda.is_available(), "请确保GPU可用!"
    main()

验证结果部分截图如下所示:
image.png
训练速度依旧很慢。
image.png

总结与思考

OverLoCK 的核心并不是单独提出一个更大的卷积核,而是重新组织了卷积网络中的上下文流动方式:

  • DDS 将深层处理拆成 Base、Overview 和 Focus 三部分。
  • Overview-Net 先在低分辨率上形成全局语义先验。
  • Focus-Net 在先验指导下提取更有针对性的高层特征。
  • GDSA 通过门控控制上下文信息。
  • ContMix 将局部位置与全局区域中心的关系转化为动态卷积核,同时保留大小核的多尺度聚合。
    如果只是快速回顾这篇论文,可以记住一句话:

OverLoCK 让纯卷积网络先低成本地看懂全局,再用全局上下文指导局部特征聚合。

从个人复现记录看,MMCV、NATTEN 和 iGEMM 的 CUDA 路径均能加载或执行,但训练依然较慢。

OverLoCK 值得关注的地方,是它没有为了全局建模完全转向 Transformer 或状态空间模型,而是通过上下文指导流和动态卷积重新挖掘 CNN 的能力。对于需要复用卷积生态、同时希望增强长程依赖的视觉任务,它提供了一个有启发性的设计方向。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木棉知行者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值