mmsegmentation 中的 CGNet:轻量级上下文引导语义分割网络的实现与配置详解
发布时间:2026/9/15 15:32:37 锦皓数字建站

mmsegmentation 中的 CGNet轻量级上下文引导语义分割网络的实现与配置详解【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation导读本文以 configs/cgnet/README.md 为核心结合 mmsegmentation 仓库中 CGNet 的源码、配置与测试系统讲解这一面向移动端/嵌入式场景的轻量级语义分割网络从论文核心思想Context Guided Block 的局部特征 上下文联合 全局上下文增强到开源实现的三阶段结构、核心超参数语义、Cityscapes 上的复现配置与训练/推理命令。读完本文你将掌握如何在 mmsegmentation 中加载 CGNet 模型、读懂其完整配置链backbone → decode head → 数据管线 → 优化器并能在自己项目中按需调整网络宽度、深度与上下文感受野。CGNet 是什么轻量化与分割精度的平衡CGNetContext Guided Network是发表在IEEE Transactions on Image Processing2020上的轻量级语义分割网络论文题为CGNet: A Light-weight Context Guided Network for Semantic SegmentationarXiv:1811.08201。其出发点非常明确见 README 中 Abstract移动设备对语义分割模型的需求持续增长但当时 SOTA 网络参数量巨大不适合移动端部署而一些低内存占用模型又沿袭了分类网络的思路忽略了语义分割上下文关系至关重要这一内在特性。CGNet 的核心主张是在所有网络阶段都捕获上下文信息并用精心设计控制参数量与内存占用。论文报告在 Cityscapes 上不做任何后处理与多尺度测试CGNet 以不到 0.5 M 参数即可取得 64.8% 的 mean IoU原文数据供背景参考。在 mmsegmentation 仓库中CGNet 以 backbone 的形式接入标准EncoderDecoder框架configs/base/models/cgnet.py配合FCNHead作为分割头并提供了两套 Cityscapes 训练配置与对应权重模型集合记录于 configs/cgnet/metafile.yaml。核心模块Context Guided Block 的源码级解析CGNet 的构建基础是 CG Block完整实现在 mmseg/models/backbones/cgnet.py。从代码结构看CG Block 由四个组件构成对应源码 docstring 中的说明局部特征提取器f_loc3x3卷积padding1groupschannels深度可分离卷积捕获当前位置的局部细节周围上下文提取器f_sur3x3空洞卷积paddingdilation、dilationdilation同样按通道分组通过扩张率扩大感受野以捕获周围上下文联合特征提取将局部与上下文特征在通道维拼接torch.cat([loc, sur], 1)经 BN 与 PReLU 激活后得到联合特征joi_feat全局上下文提取器f_glo即GlobalContextExtractor类先做AdaptiveAvgPool2d(1)全局池化再经Linear(channel → channel/reduction) → ReLU → Linear(channel/reduction → channel) → Sigmoid生成逐通道权重对联合特征做通道级重标定x * y类似轻量的 SE 模块。# mmseg/models/backbones/cgnet.py 中 ContextGuidedBlock 的核心前向逻辑简化 out self.conv1x1(x) # 1x1 降维/升维投影 loc self.f_loc(out) # 局部特征 sur self.f_sur(out) # 周围上下文空洞卷积 joi_feat torch.cat([loc, sur], 1) # 联合特征 joi_feat self.bn(joi_feat) joi_feat self.activate(joi_feat) out self.f_glo(joi_feat) # 全局上下文增强 if self.skip_connect: return x out # 残差连接代码细节上还有几个值得注意的点均有测试覆盖见 tests/test_models/test_backbones/test_cgnet.py深度可分离卷积f_loc与f_sur均为groupschannels的分组卷积且biasFalse这是 CGNet 控制参数量的关键手段之一下采样模式downsampleTrue时conv1x1变为3x3、stride2的卷积并通过bottleneck1x1 卷积把拼接后的2*channels通道映射回out_channelsskip_connect仅在下采样块中关闭self.skip_connect skip_connect and not downsample普通块保留残差连接可选 checkpointwith_cpTrue时使用torch.utils.checkpoint以显存换速度训练期生效参数约束GlobalContextExtractor要求reduction 1 and channel reduction测试用例中ContextGuidedBlock(8, 8)会因此触发AssertionError。网络整体结构三阶段 原始输入注入CGNet主干mmseg/models/backbones/cgnet.py整体分为三个阶段Stage 0stem3 个3x3卷积组成的下采样堆叠同时用InputInjectionAvgPool2d(3, stride2, padding1)把原始输入分别下采样 2 倍inject_2x与 4 倍inject_4x与主干特征torch.cat后经 BNPReLU保留原始图像高频信息——这是 CGNet 的设计特点之一原始输入注入Stage 1num_blocks[0]个 CG Block默认 3 个首个块downsampleTrue将分辨率降为 1/2第一个块的输出down1会与当前特征、inject_4x注入的原始输入拼接Stage 2num_blocks[1]个 CG Block默认 21 个首个块再次下采样最终输出为2*num_channels[2]默认 256通道。forward返回三阶段特征列表output其中第三阶段in_index2被FCNHead用作分割头的输入。测试用例验证了默认配置下输入2x3x224x224时三阶段输出形状分别为[2, 35, 112, 112]、[2, 131, 56, 56]、[2, 256, 28, 28]——注意拼接输入注入后通道数并不等于num_channels本身35 32 3131 128 3。CGNet类的关键构造参数及默认值如下参数默认值含义in_channels3输入图像通道数num_channels(32, 64, 128)三阶段特征通道数num_blocks(3, 21)Stage 1 与 Stage 2 中 CG Block 的数量dilations(2, 4)两阶段f_sur空洞卷积的扩张率决定上下文感受野reductions(8, 16)两阶段GlobalContextExtractor的通道压缩比norm_cfgdict(typeBN, requires_gradTrue)归一化层配置act_cfgdict(typePReLU)激活函数PReLU 会自动注入num_parametersnorm_evalFalse为True时训练中冻结 BN 统计量with_cpFalse是否启用梯度 checkpoint 以节省显存构造参数有严格校验num_channels必须为长度 3 的 tuple、num_blocks/dilations/reductions必须为长度 2 的 tuple非法输入会抛AssertionError测试用例对此做了覆盖。完整配置解读以 Cityscapes 复现配置为例模型与数据基础配置CGNet 的基础模型配置位于 configs/base/models/cgnet.py它定义了归一化SyncBNeps1e-03适合多卡训练数据预处理器SegDataPreProcessor使用 Cityscapes 的均值[72.39, 82.91, 73.16]且std[1,1,1]即仅做减均值、bgr_to_rgbTruebackboneCGNet默认(32, 64, 128)通道、(3, 21)个块、dilations(2, 4)、reductions(8, 16)decode_headFCNHeadin_channels256对应 Stage 2 输出、num_convs0、concat_inputFalse、dropout_ratio0、num_classes19Cityscapes 类别数并配CrossEntropyLoss与一份 Cityscapes 类别权重class_weight用于缓解类别不平衡推理模式test_cfgdict(modewhole)即整图前向推理不做滑动窗口。训练配置一680x680 裁剪configs/cgnet/cgnet_fcn_4xb4-60k_cityscapes-680x680.py 继承了模型/数据集/运行时三份基础配置并做了以下定制crop_size (680, 680) data_preprocessor dict(sizecrop_size) model dict(data_preprocessordata_preprocessor) train_pipeline [ dict(typeLoadImageFromFile), dict(typeLoadAnnotations), dict(typeRandomResize, scale(2048, 1024), ratio_range(0.5, 2.0), keep_ratioTrue), dict(typeRandomCrop, crop_sizecrop_size), dict(typeRandomFlip, prob0.5), dict(typePackSegInputs) ] test_pipeline [ dict(typeLoadImageFromFile), dict(typeResize, scale(2048, 1024), keep_ratioTrue), dict(typeLoadAnnotations), # 注释在 Resize 之后加载GT 不做缩放 dict(typePackSegInputs) ] train_dataloader dict(batch_size8, num_workers4, datasetdict(pipelinetrain_pipeline))训练采用迭代制IterBasedTrainLooptotal_iters60000每 4000 次迭代验证并保存 checkpoint优化器为 Adamlr0.001, eps1e-08, weight_decay0.0005学习率调度使用 PolyLRpower0.9、eta_min1e-4、按迭代衰减。训练配置二512x1024 全分辨率configs/cgnet/cgnet_fcn_4xb8-60k_cityscapes-512x1024.py 与上一份配置差异很小但值得对比crop_size (512, 1024)直接采用 Cityscapes 原生分辨率而非 680x680 方形裁剪因此没有重写 train/test pipeline直接继承基础数据集的默认管线train_dataloader dict(batch_size8)batch size 从 4 提升到 8配合 4 卡共 32以补偿更大输入尺寸带来的迭代吞吐差异优化器、PolyLR、60000 次迭代、4000 间隔验证等设置与 680x680 版本完全一致。从 configs/cgnet/metafile.yaml 可以确认两套配置在 4 张 V100 上的训练资源680x680 版本4x416 总 batch显存约 7.5 GB512x1024 版本4x832 总 batch显存约 8.3 GB。官方复现结果README 的 Results 表格记录了在 Cityscapes 上的复现成绩单尺度 mIoU 与多尺度翻转 mIoU方法BackboneCrop SizeLr schdMem (GB)Inf time (fps)设备mIoUmIoU(msflip)配置CGNetM3N21680x680600007.530.51V10065.6368.04cgnet_fcn_4xb4-60k_cityscapes-680x680.pyCGNetM3N21512x1024600008.331.14V10068.2770.33cgnet_fcn_4xb8-60k_cityscapes-512x1024.py其中 512x1024 配置的 mIoU68.27 / 70.33明显高于 680x68065.63 / 68.04说明输入分辨率对分割精度的直接影响两套配置的权重与训练日志下载地址均记录在 configs/cgnet/metafile.yaml 中。值得注意的是上述推理速度约 30 fps与显存数据以 V100 单卡为基准实际部署到移动端/嵌入式设备时需要结合具体硬件重新评估。实战训练、测试与推理mmsegmentation 的标准工具入口位于 tools/train.py 与 tools/test.py训练 CGNet 的最小命令为# 单卡训练680x680 配置 python tools/train.py configs/cgnet/cgnet_fcn_4xb4-60k_cityscapes-680x680.py # 多卡分布式训练4 卡对应 metafile 中的官方设置 bash tools/dist_train.sh configs/cgnet/cgnet_fcn_4xb4-60k_cityscapes-680x680.py 4 # 测试并输出 mIoU python tools/test.py configs/cgnet/cgnet_fcn_4xb4-60k_cityscapes-680x680.py /path/to/checkpoint.pth如需在推理时启用多尺度 翻转README 中的mIoU(msflip)指标可在测试命令中追加--tta参数依赖配置中提供的 TTA 数据管线具体以当前仓库版本支持为准。演示脚本 demo/image_demo.py 提供了对单张图片直接调用模型进行分割可视化的入口。训练前请先按照 README.md 的安装指引准备环境mmengine、mmcv 等依赖并确保 Cityscapes 数据集已按 configs/base/datasets/cityscapes.py 的路径约定放置。如何针对自己的场景调整 CGNet基于上文对源码与配置的拆解可以给出以下可落地的调参思路均有代码依据控制模型大小num_channels(32, 64, 128)是论文默认的 M3N2121 对应num_blocks[1]配置。减小num_channels或num_blocks可进一步压缩参数量需要注意的是 backbone 输出通道需与decode_head.in_channels保持一致默认 256 2 × 128。调整上下文感受野dilations直接决定f_sur空洞卷积的扩张率reductions决定全局上下文提取器的压缩比。它们分别控制周围上下文与全局上下文的强度。显存受限时开启with_cpTrue梯度 checkpoint或用norm_evalTrue冻结 BN 统计量训练阶段仍可保持较低 batch size。更换数据集修改num_classes、class_weight如无先验可置None以及 configs/base/datasets 下的数据管线与预处理器均值/方差。引用如果研究中使用了 CGNetREADME 提供了论文 BibTeX即Wu et al., IEEE TIP 2020的 CGNet 论文。在 mmsegmentation 中引用 CGNet 模型时也可参考 CITATION.cff 中对整个项目的引用方式并在论文中标注复现配置模型、训练迭代数、batch size、输入分辨率等以保证实验可复现。【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。