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

📅 2026/8/25 15:44:13
【第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所属单位香港大学计算与数据科学学院文章目录[toc]五分钟回顾模型实验结果ImageNet-1K 图像分类目标检测与实例分割ADE20K 语义分割吞吐量与分布外鲁棒性本文方法A. 整体框架B. Dynamic Convolution with Context-Mixing上下文混合动态卷积环境安装训练速度慢问题验证A. 验证mmcv算子是否受pytorch高版本影响B. 验证natten是否高效运行C. 训练iGEMMD. 端到端训练流程验证总结与思考传统卷积网络通常采用自下而上的特征提取方式随着网络逐层加深特征图不断缩小、语义逐渐增强。但这种单向信息流存在一个问题——中间特征只能继续向下编码难以提前获得来自高层语义的指导。人类观察图像时往往不是逐像素扫描而是先快速形成场景概览再把注意力集中到重要区域。OverLoCK 正是从这一过程出发在纯卷积网络中构造一条自上而下的上下文指导流让模型实现“先概览、再聚焦”。**本篇内容** 本文介绍 CVPR 2025 纯卷积视觉网络 OverLoCK。模型提出Deep-stage Decomposition Strategy深度阶段分解策略DDS与Context-Mixing Dynamic Convolution上下文混合动态卷积ContMix分别解决“高层语义如何反向指导特征提取”和“卷积如何兼顾长程依赖与局部归纳偏置”两个问题。五分钟回顾模型OverLoCK 的名字直接概括了它的工作方式Overview FirstLook Closely Next——先形成全局概览再聚焦关键细节。它要解决的核心矛盾是传统 CNN 擅长提取局部模式但缺少显式的自上而下语义指导大核卷积和动态卷积能够扩大感受野却不一定同时兼顾输入自适应、长程依赖和局部细节。OverLoCK 从整体上采用分支式纯卷积架构。输入先经过 Base-Net 形成通用中层特征Overview-Net 在更低分辨率上快速建立全局上下文Focus-Net 再接收中层特征和上下文先验聚焦关键区域并生成高层特征。三个子网络共同组成一条“先概览、再聚焦”的信息流。从这个整体框架向下看OverLoCK 给出的答案主要包含 DDS 和 ContMix 两项创新快速回顾项传统问题OverLoCK 的设计直接作用深层信息流只有自下而上的逐级编码DDSBase、Overview、Focus先概览再用上下文指导聚焦长程建模固定卷积核的有效范围有限ContMix上下文生成动态核根据输入调整空间聚合方式局部细节全局建模可能削弱局部归纳偏置大核组与5×5小核组并用同时覆盖长程关系与局部结构DDS把深层网络拆成三个协同部分。Deep-stage Decomposition StrategyDDS将网络拆分为Base-Net提取低层和中层通用特征为后续两个分支提供基础表示。Overview-Net在更低分辨率上快速获得高语义的全局概览。Focus-Net在 Overview-Net 的上下文先验指导下进一步提取细粒度高层特征。这种设计不需要反复递归计算而是通过一次 Overview 和一次 Focus 建立自上而下的信息流。ContMix让上下文进一步参与局部卷积。Context-Mixing Dynamic ConvolutionContMix位于 Focus-Net 的 Dynamic Block 中。它先将全局上下文压缩成固定数量的区域中心再计算局部位置与区域中心的关联根据关联结果生成位置相关的动态卷积核。简单理解普通卷积对所有输入使用一组固定参数ContMix 则让不同位置根据当前图像的全局上下文选择不同的聚合方式。为兼顾不同尺度一部分通道组使用较大的动态核建模长程依赖另一部分使用5×5小核保留局部细节。这使 ContMix 既能“看得远”又不会完全丢掉 CNN 擅长的局部归纳偏置。模型变体。OverLoCK 提供 XT、T、S、B 四种模型规模通过通道数、Block 数量、卷积核尺寸和分组数调节计算量与容量可以作为分类、检测和分割任务的通用 Backbone。Base-Net 负责建立基础表示Overview-Net 负责快速理解全局Focus-Net 在全局语义指导下仔细观察ContMix 则继续向下把这种指导转化为输入相关的动态卷积核。实验结果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 不只适用于密集预测其纯卷积 Backbone 在分类任务上也具有较强的表征能力。具体优劣仍应在相同输入分辨率、训练策略、预训练数据和计算预算下比较。目标检测与实例分割使用 Mask R-CNN 3× 调度时 OverLoCK-S 的框检测 APAPᵇ达到 51.0实例分割 APAPᵐ达到 45.0采用 Cascade Mask R-CNN 时OverLoCK-B 的 APᵇ 与 APᵐ 分别为 53.9 和 46.8。检测与分割结果表明Overview-Net 提供的上下文指导并非只对分类有效它也能服务于需要多尺度输出的下游任务。ADE20K 语义分割在 UperNet 框架下原文档记录BackbonemIoUMulti-scale mIoUOverLoCK-T50.350.8OverLoCK-B51.752.3语义分割需要同时理解全局场景与像素级局部边界因此能够传递全局上下文的 DDS 和兼顾大小感受野的 ContMix 与这类任务较为契合吞吐量与分布外鲁棒性OverLoCK-XT 的吞吐量为 1672 images/s并给出了 ImageNet-V2、ImageNet-A、ImageNet-R、ImageNet-Sketch 等分布外数据集上的结果。这些实验关注的不只是标准数据集精度也考察了模型面对数据分布变化时的表现。不过吞吐量高度依赖 GPU、batch size、数值精度和推理实现引用时应同时保留论文对应的测试条件。本文方法A. 整体框架OverLoCK 采用分支式纯卷积架构核心基于深度阶段分解策略DDS由Base-Net、Overview-Net、Focus-Net三个子网络组成搭配动态上下文流实现自上而下的语义指导整体包含 4 个stage输出多尺度特征用于各类视觉任务Base-Net建立通用中层表示是OverLoCK的低层特征提取器为后续的Overview-net概览和Focus-net聚焦提供高质量中层特征。具体而言通过三个Embedding层逐步将输入图像HxW下采样至(H/16 x W / 16)在缩小分辨率、降低夹断来那个的同时逐步聚合局部信息生成包含边缘、纹理、简单形状等通用特征的中层特征图另一方面构建Basic Block基础块结构为 “残差 3×3 深度卷积 → 层归一化 → 膨胀重参数卷积Dilated RepConv→SE层 → 卷积前馈网络ConvFFN强化局部细节的特征表达。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核心组件GDSA以ContMix为token混合器输入Base-Net特征 Overview-net上下文先验的融合特征通过 1×1 卷积 SiLU 激活生成动态门控抑制噪声再通过 ContMix 聚合长程特征实现 “指导 - 聚合 - 优化” 的闭环局部特征 │ 残差 3×3 DWConv │ GDSA门控 ContMix 动态空间聚合 │ ConvFFN │ 聚焦后的高层特征Gated Dynamic Spatial AggregatorGDSA使用门控分支调节动态空间聚合结果再由 ContMix 完成长程空间混合。到这一层Overview-Net 提供的全局指导开始具体作用于局部特征聚合。整体来看三者的协同完美模拟了人类 “先看整体Overview-Net→ 再聚焦细节Focus-Net” 的视觉感知逻辑同时通过Base-Net的通用特征支撑既避免了传统卷积网络 “无指导的盲目提取”又解决了Transformer/Mamba等模型 “计算量过大” 的问题这也是OverLoCK兼顾精度与效率的核心原因。普通层级式 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在捕捉长距离依赖关系和保持归纳偏置方面的能力如图所示。ContMix实现了在保持卷积归纳偏置的同时动态地对长距离依赖进行建模从而在各种输入分辨率下都能有效地处理图像特征。实现过程a. 输入特征转换输入特征X XX被转换为两部分Q和K。其中Q通过1×1卷积W q {W_q}Wq​对X XX进行特征提取K是通过将X XX通过自适应平均池化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 ii个token与K g {K_g}Kg​中所有token的亲和度。c. 生成动态卷积核通过线性层W d {W_d}Wd​对每个亲和度矩阵A g {A_g}Ag​中的token亲和度值进行聚合并通过softmax函数进行归一化得到D g D^gDg。每个D g D^gDg的行可以被重塑成目标卷积核形状从而在每个token位置产生一个输入依赖的卷积核。d. 卷积操作卷积操作将特征X XX的通道均匀分成G组同一组内的通道共享同一个动态卷积核。每个token在卷积操作中与全局信息交互从而捕获长距离依赖。e. ContMix的定制实现在OverLoCK网络的Dynamic Block中ContMix被定制实现。Q 来自Z i Z_iZi​局部特征K来自P i {P_i}Pi​​全局上下文而非融合特征。确保 “局部像素” 与 “全局指导” 的关联更精准。此外ContMix的S被设置为7以确保线性时间复杂度。ContMix的组被分配给大卷积核和小卷积核其中小卷积核的大小设置为5×5以实现不同尺度特征的提取。ContMix 的核心过程可以分成五步构造局部查询通过1×1卷积从局部特征生成 Query用来描述每个位置当前需要什么信息。压缩全局上下文利用自适应平均池化将上下文聚合为固定的S×S区域中心再生成 Key。计算位置—区域关联比较每个局部位置与各区域中心得到上下文亲和度。生成动态核将亲和度映射为卷积核权重并通过 Softmax 进行归一化。分组动态卷积同一组通道共享相应动态核在保留卷积局部连接形式的同时引入来自全局上下文的权重。作用分析ContMix作为一个通用的即插即用模块其在OverLoCK网络中的实现细节包括使用当前融合特征X计算Q和K以及将大卷积核和小卷积核的组数设置为一半以实现长距离依赖和局部细节的建模。在 OverLoCK 的 Dynamic Block 中局部特征与 Overview-Net 上下文承担不同角色局部特征提供待聚合的位置描述上下文先验提供全局指导。论文配置将区域中心固定为S7位置与区域中心的关联规模为HW × S²当S固定时该部分复杂度相对于 token 数HW呈线性增长。为了同时覆盖远距离关系和局部细节ContMix 将通道组分配给不同核尺寸一部分使用大核另一部分使用5×5小核。大核扩大依赖范围小核保留局部结构二者共同构成多尺度空间聚合至此整条由整体到局部的逻辑就完整了DDS 决定网络如何先概览再聚焦Base/Overview/Focus 决定上下文如何流动Dynamic Block 和 GDSA 决定如何使用指导信息ContMix 最终把上下文变成每个位置参与计算的动态卷积核。环境安装# Environments:cuda12.1python3.10# Dependencies:pipinstalltorch2.3.1torchvision0.18.1 --index-url https://download.pytorch.org/whl/cu121 pipinstallnatten0.17.1torch230cu121-fhttps://shi-labs.com/natten/wheels/ pipinstalltimm0.6.12 pipinstallmmengine0.2.0-ihttps://mirrors.ustc.edu.cn/pypi/simple/gitclone https://github.com/Shiweiliuiiiiiii/SLaK.git pipinstalltimm tensorboardX sixcdcutlass/examples/19_large_depthwise_conv2d_torch_extensionTORCH_CUDA_ARCH_LIST8.0./setup.pyinstall--user# 时间有点长A quick check: python depthwise_conv2d_implicit_gemm.pyTORCH_CUDA_ARCH_LIST8.0对应特定 GPU 架构不能直接照搬到所有设备。编译过程耗时较长属于常见现象应根据实际 GPU Compute Capability 调整。quick check没问题。训练速度慢问题验证A. 验证mmcv算子是否受pytorch高版本影响验证高版本pytorch 2.3.1与mmdet2.28.1不兼容问题是否影响mmcv算子回退到cpu版本python-cimport mmcv.ops; print(mmcv.ops.__all__)存在RoIAlign,DeformConv等核心算子。并验证输出的设备importtorchimportmmcv.ops# 测试 DeformConv2ddeform_convmmcv.ops.DeformConv2d(3,3,kernel_size3,padding1).cuda()xtorch.randn(1,3,64,64).cuda()offsettorch.randn(1,18,64,64).cuda()outdeform_conv(x,offset)print(fDeformConv2d output device:{out.device})# 测试 RoIAlignroi_alignmmcv.ops.RoIAlign(output_size(7,7),spatial_scale1.0,sampling_ratio0).cuda()xtorch.randn(1,3,64,64).cuda()roistorch.tensor([[0,0,0,10,10]]).float().cuda()outroi_align(x,rois)print(fRoIAlign output device:{out.device})将上述代码放置于test_mmcv_ops.py中进行验证输出均在cuda上。B. 验证natten是否高效运行python-cimport natten; print(natten.__version__)打印natten版本为0.17.1。测试natten上算子耗时1.86ms基本上也没问题。importtorchimportnattenimporttime# 创建输入B,C,H,W1,64,64,64xtorch.randn(B,C,H,W).cuda()# 创建邻域注意力层使用正确的参数名nanatten.NeighborhoodAttention2D(dimC,# 用 dim 代替 in_channelskernel_size7,num_heads1# 必须传入 num_heads).cuda()# 测速starttime.time()for_inrange(100):outna(x)torch.cuda.synchronize()endtime.time()print(fNATTEN average time:{(end-start)/100*1000:.2f}ms)C. 训练iGEMM从训练过程中也可以看出加速库iGEMM成功加载iGEMM Efficient Conv Impl,channels64,kernel size(17,17)----------------trying toimportiGEMM implementationforlarge-kernel conv----------------found iGEMM implementationiGEMM Efficient Conv Impl,channels64,kernel size(17,17)----------------trying toimportiGEMM implementationforlarge-kernel conv----------------found iGEMM implementation综上大核卷积iGEMM、MMCV 算子、NATTEN 这三个核心依赖都已经确认在 GPU 上正常工作。D. 端到端训练流程验证使用一个简单的脚本进行验证如下所示#!/usr/bin/env python3# mmdet v2.28.1 专属性能分析脚本importosimportsysimporttorchfromtorch.profilerimportprofile,record_function,ProfilerActivity# 添加mmdet路径根据你的实际路径调整# sys.path.append(os.path.abspath(.))# sys.path.append(os.path.abspath(./mmdetection))# 导入mmdet v2.28.2的核心模块旧版接口frommmdet.apisimportinit_detector,set_random_seedfrommmdet.datasetsimportbuild_dataloader,build_datasetfrommmdet.modelsimportbuild_detectorfrommmcvimportConfigfrommmcv.runnerimportbuild_optimizer,EpochBasedRunnerfrommmcv.parallelimportMMDataParalleldefmain():# 配置参数根据你的实际情况修改 CONFIG_PATH/home/data/Model/000_model_eval/20260227_cascadercnn_overlock-t-fpn_sdxtdataset_1x/20260227_cascadercnn_overlock-t-fpn_sdxtdataset_1x.py# 你的配置文件路径CHECKPOINT_PATHNone# 可选预训练权重路径GPU_ID0# 使用的GPU编号# # 1. 加载配置文件cfgConfig.fromfile(CONFIG_PATH)cfg.gpu_ids[GPU_ID]set_random_seed(0,deterministicFalse)# 2. 构建数据集和数据加载器仅加载训练集datasetbuild_dataset(cfg.data.train)data_loaderbuild_dataloader(dataset,samples_per_gpucfg.data.samples_per_gpu,workers_per_gpucfg.data.workers_per_gpu,num_gpus1,distFalse,shuffleTrue)data_iteriter(data_loader)data_batchnext(data_iter)# 获取第一个batch的数据# 3. 构建模型MMDataParallel适配旧版modelbuild_detector(cfg.model,train_cfgcfg.get(train_cfg),test_cfgcfg.get(test_cfg))model.init_weights()modelMMDataParallel(model.cuda(),device_ids[GPU_ID])model.train()# 4. 构建优化器仅用于解析loss不实际更新参数optimizerbuild_optimizer(model,cfg.optimizer)# 5. 执行Profiling核心步骤print( 开始性能分析mmdet v2.28.2...)withprofile(activities[ProfilerActivity.CPU,ProfilerActivity.CUDA],profile_memoryTrue,record_shapesTrue,on_trace_readytorch.profiler.tensorboard_trace_handler(./profiler_log))asprof:withrecord_function(train_step):# 执行一次完整的训练step前向反向lossesmodel(**data_batch)loss,_model.module._parse_losses(losses)loss.backward()# 6. 输出并保存结果print(\n*80)print( Profiling 结果按CUDA耗时排序)print(*80)result_tableprof.key_averages().table(sort_bycuda_time_total,row_limit20)print(result_table)# 保存到文件withopen(profiler_result.txt,w,encodingutf-8)asf: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__:# 确保使用GPUasserttorch.cuda.is_available(),请确保GPU可用main()验证结果部分截图如下所示训练速度依旧很慢。总结与思考OverLoCK 的核心并不是单独提出一个更大的卷积核而是重新组织了卷积网络中的上下文流动方式DDS 将深层处理拆成 Base、Overview 和 Focus 三部分。Overview-Net 先在低分辨率上形成全局语义先验。Focus-Net 在先验指导下提取更有针对性的高层特征。GDSA 通过门控控制上下文信息。ContMix 将局部位置与全局区域中心的关系转化为动态卷积核同时保留大小核的多尺度聚合。如果只是快速回顾这篇论文可以记住一句话OverLoCK 让纯卷积网络先低成本地看懂全局再用全局上下文指导局部特征聚合。从个人复现记录看MMCV、NATTEN 和 iGEMM 的 CUDA 路径均能加载或执行但训练依然较慢。OverLoCK 值得关注的地方是它没有为了全局建模完全转向 Transformer 或状态空间模型而是通过上下文指导流和动态卷积重新挖掘 CNN 的能力。对于需要复用卷积生态、同时希望增强长程依赖的视觉任务它提供了一个有启发性的设计方向。