MMSegmentation 中基于 ConvNeXt 骨干的语义分割实践:UPerNet 配置、预训练模型与训练调优指南
MMSegmentation 中基于 ConvNeXt 骨干的语义分割实践UPerNet 配置、预训练模型与训练调优指南【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation本指南以 configs/convnext/README.md 为主体结合 MMSegmentation 仓库中的实际配置、源码与测试用例系统讲解如何在语义分割任务中使用 ConvNeXt纯卷积网络骨干涵盖环境准备、预训练权重选择、UPerNet 配置逐项拆解、层间学习率衰减layer-wise/stage-wise learning rate decay、AMP 混合精度训练与滑动窗口推理等完整实战链路。读完本文你将掌握从零复现 ADE20K 语义分割实验的完整方法并能按需调整骨干规模、输入尺寸与训练策略。ConvNeXt把 ResNet 现代化 为 Transformer 设计的纯卷积网络ConvNeXt 出自论文A ConvNet for the 2020sCVPR 2022arXiv:2201.03545。其核心动机是ViT 出现后迅速取代 ConvNet 成为图像分类的 SOTA而 vanilla ViT 在目标检测、语义分割等通用视觉任务上又面临困难正是 Swin 等层级化 Transformer 重新引入了大量卷积先验才让 Transformer 成为通用视觉骨干。然而这类混合方案的有效性往往被归功于 Transformer 的先天优越性而非卷积自身的归纳偏置。ConvNeXt 反其道而行之作者逐步将标准 ResNet 现代化 为视觉 Transformer 的设计风格从中识别出一批造成性能差异的关键组件最终产出一族完全由标准 ConvNet 模块构建的模型——ConvNeXt。论文报告其在 ImageNet 上达到 87.8% top-1 准确率在 COCO 检测与 ADE20K 分割上优于 Swin Transformer同时保持了标准卷积网络的简洁与高效。在 MMSegmentation 中ConvNeXt 被作为骨干backbone接入以 UPerNet 解码头为代表的语义分割框架并提供从 Tiny 到 XLarge 五个规模的完整配置覆盖 512x512 与 640x640 两种输入分辨率。环境准备安装 mmpretrain 以复用预训练骨干ConvNeXt 骨干实现并不在本仓库内而是由 MMClassification / MMPretrain 提供。README 明确要求使用 ConvNeXt 骨干前需先安装 MMClassification现为 mmpretrain它内置了丰富的可用于下游任务的骨干网络pip install mmpretrain1.0.0rc7这一点在配置中也有直接体现。基础模型配置 configs/base/models/upernet_convnext.py 中通过custom_imports引入了 mmpretrain 的模型注册表custom_imports dict(importsmmpretrain.models, allow_failed_importsFalse)骨干的type直接写为mmpretrain.ConvNeXt即从 mmpretrain 的命名空间解析 ConvNeXt 类。这意味着运行本目录下任何配置前务必先安装 mmpretrain 并确认版本满足要求。预训练模型从 ImageNet 权重出发做下游微调ConvNeXt 在 ImageNet-1k 或 ImageNet-21k 上预训练的权重被用于下游任务微调。README 给出了完整的预训练模型清单权重由官方仓库转换而来模型训练数据参数量 (M)计算量 (G)ConvNeXt-TImageNet-1k28.594.46ConvNeXt-SImageNet-1k50.228.69ConvNeXt-BImageNet-1k88.5915.36ConvNeXt-BImageNet-21k88.5915.36ConvNeXt-LImageNet-21k197.7734.37ConvNeXt-XLImageNet-21k350.2060.93模型与训练日志的下载地址可在 configs/convnext/metafile.yaml 中逐条查询每个条目均标注了 Weights 与 Training log 链接。各配置文件通过checkpoint_file指向对应的预训练权重例如checkpoint_file https://download.openmmlab.com/mmclassification/v0/convnext/downstream/convnext-base_3rdparty_32xb128-noema_in1k_20220301-2a0ee547.pth值得注意的是512x512 输入下 Tiny/Small/Base 使用的是 ImageNet-1k 预训练权重而 640x640 输入下的 Base/Large/XLarge 使用的是 ImageNet-21k 预训练权重这解释了后三者在更大输入下显著更高的 mIoU。配置文件深度解析以 Base UPerNet 为例以 configs/convnext/convnext-base_upernet_8xb2-amp-160k_ade20k-512x512.py 为例该配置通过_base_继承四份基础配置_base_ [ ../_base_/models/upernet_convnext.py, ../_base_/datasets/ade20k.py, ../_base_/default_runtime.py, ../_base_/schedules/schedule_160k.py ]4.1 骨干与数据预处理器基础配置 upernet_convnext.py 定义了完整的 EncoderDecoder 模型骨架norm_cfg dict(typeSyncBN, requires_gradTrue) data_preprocessor dict( typeSegDataPreProcessor, mean[123.675, 116.28, 103.53], std[58.395, 57.12, 57.375], bgr_to_rgbTrue, pad_val0, seg_pad_val255) model dict( typeEncoderDecoder, data_preprocessordata_preprocessor, pretrainedNone, backbonedict( typemmpretrain.ConvNeXt, archbase, out_indices[0, 1, 2, 3], drop_path_rate0.4, layer_scale_init_value1.0, gap_before_final_normFalse, init_cfgdict( typePretrained, checkpointcheckpoint_file, prefixbackbone.)), ...)关键字段说明archbase指定 ConvNeXt 架构规模可替换为tiny/small/large/xlargeout_indices[0, 1, 2, 3]输出四个 stage 的特征供 UPerNet 的多尺度解码使用drop_path_rateDropPath 随机深度概率。Base 及以上为 0.4Small 为 0.3见 convnext-small_upernet_8xb2-amp-160k_ade20k-512x512.pylayer_scale_init_value1.0LayerScale 初始化值gap_before_final_normFalse语义分割需要逐像素特征图因此不进行全局平均池化init_cfg以Pretrained方式加载预训练权重prefixbackbone.保证权重键名与 mmpretrain 的 backbone 命名对齐。数据预处理器使用 mmseg/models/data_preprocessor.py 中的SegDataPreProcessor其 mean/std 采用 ImageNet 统计值bgr_to_rgbTrue处理输入通道顺序。4.2 解码头UPerHead FCNHead 辅助头UPerNet 解码头实现在 mmseg/models/decode_heads/uper_head.py 中。UPerHead继承BaseDecodeHead并设置input_transformmultiple_select核心结构是PPM金字塔池化模块pool_scales(1, 2, 3, 6)加bottleneck卷积将四层骨干特征融合为逐像素预测。在基础配置中decode_headdict( typeUPerHead, in_channels[128, 256, 512, 1024], in_index[0, 1, 2, 3], pool_scales(1, 2, 3, 6), channels512, dropout_ratio0.1, num_classes19, norm_cfgnorm_cfg, align_cornersFalse, loss_decodedict(typeCrossEntropyLoss, use_sigmoidFalse, loss_weight1.0)), auxiliary_headdict( typeFCNHead, in_channels384, in_index2, ... num_classes19, loss_decodedict(typeCrossEntropyLoss, use_sigmoidFalse, loss_weight0.4)),注意in_channels[128, 256, 512, 1024]与auxiliary_head.in_channels384对应 ConvNeXt-Base 四个 stage 的通道数每个具体配置文件会按骨干规模覆盖这些值如 Tiny 为[96, 192, 384, 768]见 convnext-tiny_upernet_8xb2-amp-160k_ade20k-512x512.py并将num_classes改为 ADE20K 的 150。4.3 AMP 混合精度优化器与层间学习率衰减与常规分割配置使用 SGD 不同对比 configs/base/schedules/schedule_160k.py 中的SGD lr0.01ConvNeXt 配置完全重写了优化器采用 AdamW 混合精度 层间学习率衰减optim_wrapper dict( _delete_True, typeAmpOptimWrapper, optimizerdict( typeAdamW, lr0.0001, betas(0.9, 0.999), weight_decay0.05), paramwise_cfg{ decay_rate: 0.9, decay_type: stage_wise, num_layers: 12 }, constructorLearningRateDecayOptimizerConstructor, loss_scaledynamic)AmpOptimWrapper启用自动混合精度AMPloss_scaledynamic使用动态损失缩放。这解释了配置文件名中的amp以及结果表中显著低于同规模 Transformer 模型的内存占用Base 512x512 仅 6.33 GBLearningRateDecayOptimizerConstructor由 mmseg/engine/optimizers/layer_decay_optimizer_constructor.py 实现骨干浅层共享底层视觉特征采用更小的学习率decay_rate0.9表示逐层学习率按 0.9 的幂次衰减num_layers12对应 ConvNeXt-Base 的 12 个 block。该构造器支持两种衰减策略均由paramwise_cfg[decay_type]控制stage_wise按 stage 分组衰减由get_stage_id_for_convnext源码 L55-L77实现stem 与 downsample 层归入 id 0四个 stage 分别映射到 id 1~4layer_wise按 block 粒度衰减由get_layer_id_for_convnext源码 L12-L52实现将 12 个 block 均匀映射到更细的层 id。同时该构造器对一维参数如 bias、LayerNorm 的 weight自动免除 weight decay保证wd0组的正确划分。这一行为有单元测试直接验证tests/test_engine/test_layer_decay_optimizer_constructor.py 构造了ToyConvNeXt模型分别以stage_wise和layer_wise构建优化器并断言每个参数组的weight_decay与lr_scale与预期列表完全一致如 ConvNeXt 各层lr_scale为 128/1/64/32/16/8 的递减序列。4.4 参数调度线性预热 线性多项式衰减param_scheduler [ dict( typeLinearLR, start_factor1e-6, by_epochFalse, begin0, end1500), dict( typePolyLR, power1.0, begin1500, end160000, eta_min0.0, by_epochFalse, ) ]前 1500 个 iter 从1e-6线性预热到目标学习率随后以power1.0的 Poly 策略线性衰减到eta_min0直至 160000 iter 结束——与基础调度 schedule_160k.py 中的IterBasedTrainLoop(max_iters160000, val_interval16000)对齐。4.5 数据加载与滑动窗口测试各配置末尾统一设定 batch size8 卡 x 2 图/卡 总 batch 16与 metafile.yaml 一致与测试采样方式train_dataloader dict(batch_size2) val_dataloader dict(batch_size1) test_dataloader val_dataloader512x512 配置采用modeslide滑动窗口测试test_cfgdict(modeslide, crop_sizecrop_size, stride(341, 341))滑动窗口通过裁剪重叠子图进行预测后拼接能在大输入下获得更精细的边界结果640x640 配置的 stride 相应调整为(426, 426)见 convnext-base_upernet_8xb2-amp-160k_ade20k-640x640.py。ADE20K 上的完整结果与规模对比README 报告了全部五个规模在 ADE20K 上的结果模型与日志下载见 metafile.yaml方法骨干输入尺寸Lr schd显存 (GB)推理速度 (fps)设备mIoUmIoU (msflip)配置UPerNetConvNeXt-T512x5121600004.2319.90V10046.1146.62convnext-tiny_upernet_8xb2-amp-160k_ade20k-512x512.pyUPerNetConvNeXt-S512x5121600005.1615.18V10048.5649.02convnext-small_upernet_8xb2-amp-160k_ade20k-512x512.pyUPerNetConvNeXt-B512x5121600006.3314.41V10048.7149.54convnext-base_upernet_8xb2-amp-160k_ade20k-512x512.pyUPerNetConvNeXt-B640x6401600008.5310.88V10052.1352.66convnext-base_upernet_8xb2-amp-160k_ade20k-640x640.pyUPerNetConvNeXt-L640x64016000012.087.69V10053.1653.38convnext-large_upernet_8xb2-amp-160k_ade20k-640x640.pyUPerNetConvNeXt-XL640x64016000026.16*6.33V10053.5854.11convnext-xlarge_upernet_8xb2-amp-160k_ade20k-640x640.py阅读要点从 Tiny 到 XLargemIoU 从 46.11 提升至 53.58msflip 后达 54.11呈现清晰的规模收益曲线输入分辨率的影响同样显著同为 Base 骨干640x640 相比 512x512 提升约 3.4 个点48.71 → 52.13代价是显存从 6.33 GB 增至 8.53 GB、推理速度下降表中Mem (GB)带*的条目XLarge 的 26.16是在cudnn_benchmarkTrue条件下测得硬件为 V100。训练与测试命令行实操按 README 流程安装 mmpretrain 并确认数据就绪后可直接使用仓库提供的训练入口 tools/train.py 启动实验# 单机单卡训练 python tools/train.py configs/convnext/convnext-base_upernet_8xb2-amp-160k_ade20k-512x512.py # 单机 8 卡分布式训练与配置的 8xb2 设定一致 bash tools/dist_train.sh configs/convnext/convnext-base_upernet_8xb2-amp-160k_ade20k-512x512.py 8测试时使用 tools/test.py 加载训练好的权重并评估 mIoUpython tools/test.py configs/convnext/convnext-base_upernet_8xb2-amp-160k_ade20k-512x512.py \ work_dirs/convnext-base_upernet_8xb2-amp-160k_ade20k-512x512/iter_160000.pth \ --eval mIoU实操提醒若显存有限可优先选择 Tiny4.23 GB或 Small5.16 GB配置若要追求精度且拥有大显存设备则选用 ImageNet-21k 预训练的 640x640 系列。修改骨干规模时需同步更新arch、drop_path_rate、解码头的in_channels与辅助头的in_channelsTiny/Small/Base/Large/XLarge 对应[96,192,384,768]/[128,256,512,1024]等不同通道组合具体见各配置文件。引用若在你的工作中使用了 ConvNeXt 或本目录下的配置可引用论文article{liu2022convnet, title{A ConvNet for the 2020s}, author{Liu, Zhuang and Mao, Hanzi and Wu, Chao-Yuan and Feichtenhofer, Christoph and Darrell, Trevor and Xie, Saining}, journal{Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)}, year{2022} }总结本文围绕 configs/convnext/README.md 梳理了在 MMSegmentation 中使用 ConvNeXt 骨干完成语义分割的完整链路从 mmpretrain 环境准备、ImageNet 预训练权重选择到 UPerNet 配置的逐项解析骨干超参、双解码头、AMP 优化器、层间学习率衰减、滑动窗口测试再到 ADE20K 结果对比与训练测试命令。通过源码级佐证layer_decay_optimizer_constructor.py、uper_head.py与单元测试test_layer_decay_optimizer_constructor.py你可以在此基础上按需调整骨干规模与输入分辨率快速复现或扩展 ConvNeXt 的分割实验。【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考