资讯动态

MMSegmentation 模型体系全解:分割器架构、核心接口与数据预处理器原理

发布时间:2026/9/16 10:19:28 来源:尧图企业网站定制
MMSegmentation 模型体系全解分割器架构、核心接口与数据预处理器原理【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation本文以 MMSegmentation 的模型设计为核心系统梳理分割器Segmentor—主干网络Backbone—颈部Neck—解码头Decode Head—辅助头Auxiliary Head的组件化架构深入剖析forward、train_step、val_step、test_step四大核心接口的调用语义并结合源码讲解SegDataPreProcessor数据预处理器与model.test_cfg的推理模式控制。读完本文你将掌握 MMSegmentation 模型的配置编写方法、训练/验证/推理阶段的完整数据流以及whole与slide两种推理模式的选取依据。模型在 MMSegmentation 中的定位在 MMSegmentation 中深度学习任务中的神经网络被统一定义为模型Model而模型即算法的核心。MMSegmentation 基于 MMEngine 抽象出的统一模型基类BaseModel构建BaseModel将训练、测试等过程标准化使不同算法共享同一套生命周期管理。MMSegmentation 实现的所有模型都继承自BaseModel并在其基础上实现了前向传播逻辑为语义分割算法添加了特有的功能。这种设计带来的直接好处是无论你使用 PSPNet、DeepLabV3、UPerNet 还是最新的 Segmenter、SAN模型在 Runner 中的训练、验证、测试流程完全一致差异仅体现在模型组件的配置上。常用组件分割器的零件库MMSegmentation 将网络架构抽象为分割器Segmentor——一个包含网络所有组件的模型。目前仓库实现了两种分割器EncoderDecoder编码器解码器见 mmseg/models/segmentors/encoder_decoder.py通常由数据预处理器、骨干网络、解码头和可选的辅助头组成CascadeEncoderDecoder级联编码器解码器见 mmseg/models/segmentors/cascade_encoder_decoder.py与前者的差异在于解码器是级联的——前一个解码头decode_head的输出会作为后一个解码头的输入典型应用如 PointRend、K-Net。两种分割器通常由以下组件拼装而成组件作用典型实现数据预处理器Data Preprocessor将数据复制到目标设备并预处理为模型输入格式SegDataPreProcessor主干网络Backbone将图像转换为特征图去掉最后全连接层的 ResNet-50颈部Neck连接主干网络与头对原始特征图做改进或重新配置Feature Pyramid NetworkFPN解码头Decode Head将特征图转换为分割掩膜PSPNet 的PSPHead、DeepLabV3 的ASPPHead辅助头Auxiliary Head可选组件仅用于计算辅助损失的分割掩膜推理时可丢弃FCNHead关于辅助头源码中有明确注释辅助头只用于训练期间的深度监督deep supervision推理阶段会被丢弃见 encoder_decoder.py。在配置中它对应model.auxiliary_head字段通过loss_weight控制辅助损失在总损失中的权重。从源码结构看BaseSegmentormmseg/models/segmentors/base.py还提供了三个便捷属性用于判断分割器是否包含对应组件with_neck是否配置了颈部with_auxiliary_head是否配置了辅助头with_decode_head是否配置了解码头EncoderDecoder构造时断言必须有解码头。基本接口forward / train_step / val_step / test_stepMMSegmentation 封装BaseModel并实现了BaseSegmentor类主要提供forward、train_step、val_step和test_step四个接口。其中train_step、val_step、test_step由BaseModel定义标准流程forward是自定义的核心前向入口。forward统一的前向入口forward方法是训练、验证、测试和简单推理的统一前向入口返回损失或预测结果。它必须支持三种模式base.pytensor前向推理整个网络并返回张量或张量数组不做任何后处理行为与常见nn.Module一致predict前向推理并返回预测值预测结果会被完整后处理为SegDataSample列表loss前向推理并根据给定输入和数据样本返回损失的字典。若传入不支持的模式forward会抛出RuntimeError仅支持 loss、predict、tensor 三种模式。注意forward方法不处理反向传播与优化器更新这两者在train_step方法中完成。参数说明inputstorch.Tensor输入张量通常形状为 (N, C, ...)data_samplelist[SegDataSample]分割数据样本通常包含metainfo和gt_sem_seg等信息默认为 Nonemodestr决定返回值类型默认为tensor。返回值说明若mode loss返回用于反向过程和日志记录的损失张量字典若mode predict返回SegDataSample的列表推理结果会被递增地添加到传入的data_sample参数中。每个SegDataSample包含以下关键词pred_sem_segPixelData语义分割的预测结果seg_logitsPixelData标准化前语义分割的预测 logits若mode tensor返回张量或张量数组的字典供自定义使用。SegDataSample是 MMSegmentation 的数据结构接口实现自mmengine.structures.BaseDataElement见 mmseg/structures/seg_data_sample.py用作不同组件之间的接口。从源码看它对外暴露gt_sem_seg、pred_sem_seg、seg_logits三个PixelData类型的属性字段。预测模式whole_inference 与 slide_inference模型配置的字段在配置文档中有简要描述这里重点展开model.test_cfg字段。model.test_cfg用于控制前向行为predict模式下的forward方法可以在两种模式下运行实现见 encoder_decoder.pywhole_inference整图推理当cfg.model.test_cfg.mode whole时模型使用完整图像进行推理EncoderDecoder.whole_inference直接对整图调用encode_decode得到 seg_logits。配置示例model dict( typeEncoderDecoder ... test_cfgdict(modewhole) )这是绝大多数配置的默认选择。例如 deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024.py 继承的基础模型中即写有test_cfgdict(modewhole)。slide_inference滑动窗口推理当cfg.model.test_cfg.mode slide时模型通过滑动窗口进行推理。注意选择slide模式时还必须指定cfg.model.test_cfg.stride和cfg.model.test_cfg.crop_size。配置示例model dict( typeEncoderDecoder ... test_cfgdict(modeslide, crop_size256, stride170) )从slide_inference的实现encoder_decoder.py可以看到其工作原理按stride在图像上划出h_grids × w_grids个重叠窗口逐窗口调用encode_decode得到局部 seg_logits通过F.pad将每个窗口的 logits 累积到整图坐标上并用count_mat记录每个像素被覆盖的次数最后以preds / count_mat取平均从而消除窗口重叠区域的边界伪影。一个真实的 slide 配置示例是 pspnet_r50-d8_4xb2-40k_cityscapes-769x769.pycrop_size (769, 769) data_preprocessor dict(sizecrop_size) model dict( data_preprocessordata_preprocessor, decode_headdict(align_cornersTrue), auxiliary_headdict(align_cornersTrue), test_cfgdict(modeslide, crop_size(769, 769), stride(513, 513)))这里crop_size(769, 769)与stride(513, 513)的搭配使相邻窗口有约 1/3 的重叠兼顾了推理质量与计算量。同时滑窗裁剪得到的局部 patch 会通过predict_by_feat中的img_shape判断见 decode_head.py被双线性插值回对应尺寸。train_step训练数据流train_step方法调用loss模式的前向接口以获得损失字典。BaseModel类实现了默认的模型训练过程包括预处理、模型前向传播、损失计算、优化和反向传播。参数datadict or tuple or list从数据集采样的数据。在 MMSegmentation 中数据字典包含inputs和data_samples两个字段optim_wrapperOptimWrapper用于更新模型参数的 OptimWrapper 实例。OptimWrapper提供了更新参数的通用接口统一了 PyTorch 优化器的使用方式。返回值Dict[str, torch.Tensor]用于记录日志的张量字典。以EncoderDecoder为例其loss方法的调用链见 encoder_decoder.py为loss(): extract_feat() - _decode_head_forward_train() - _auxiliary_head_forward_train()可选 _decode_head_forward_train(): decode_head.loss() _auxiliary_head_forward_train(): auxiliary_head.loss()可选其中extract_feat依次执行backbone(inputs)与若存在neck(x)encoder_decoder.py解码头/辅助头各自的loss方法在 decode_head.py 中实现为forward() - loss_by_feat()两步loss_by_feat会先按gt_sem_seg尺寸 resize logits再计算损失与acc_seg像素准确率。所有子模块的损失通过add_prefix加上decode、aux级联时为decode_0、decode_1…前缀后合并进同一个损失字典。val_step 与 test_step验证/测试数据流val_step方法调用predict模式的前向接口并返回预测结果预测结果将进一步被传递给评测器的进程接口和钩子的after_val_inter接口。参数datadict or tuple or list从数据集中采样的数据数据字典同样包含inputs和data_samples两个字段。返回值list给定数据的预测结果。BaseModel中test_step与val_step的实现相同因此二者的数据流完全一致。以EncoderDecoder为例其predict方法的调用链见 encoder_decoder.py为predict(): inference() - postprocess_result() inference(): whole_inference()/slide_inference() whole_inference()/slide_inference(): encode_decode() encode_decode(): extract_feat() - decode_head.predict()推理得到的 seg_logits 会交给postprocess_resultbase.py做最终后处理根据metainfo中的padding_size裁剪掉 padding 区域、按flip与flip_direction还原翻转、用双线性插值 resize 回ori_shape原始尺寸当类别数 C 1 时用argmax得到pred_sem_seg当 C 1二分类时用sigmoid配合decode_head.threshold阈值生成二值掩膜最后将seg_logits与pred_sem_seg写入SegDataSample返回。数据预处理器SegDataPreProcessor详解MMSegmentation 实现的SegDataPreProcessormmseg/models/data_preprocessor.py继承自 MMEngine 的BaseDataPreprocessor提供数据预处理和将数据复制到目标设备的功能。设备迁移时机Runner 在构建阶段将模型传送到指定设备而SegDataPreProcessor在train_step、val_step和test_step中将数据传送到指定设备之后处理后的数据才被进一步传递给模型。构造函数参数参数类型默认值说明meanSequence[Number]NoneR、G、B 通道的像素平均值stdSequence[Number]NoneR、G、B 通道的像素标准差sizetupleNone固定的填充大小size_divisorintNone填充尺寸的除法因子填充后尺寸为 divisor 的整数倍pad_valfloat0图像填充值seg_pad_valfloat255分割图的填充值255 在语义分割中约定为 ignore indexbgr_to_rgbboolFalse是否将图像从 BGR 转换为 RGBrgb_to_bgrboolFalse是否将图像从 RGB 转换为 BGRbatch_augmentslist[dict]None批量级数据增强配置从源码实现看有几个值得注意的行为data_preprocessor.pybgr_to_rgb与rgb_to_bgr互斥二者不能同时为 True否则触发断言归一化可选仅当同时指定mean和std时才启用归一化_enable_normalize True若只给mean不给std会直接断言报错归一化在堆叠成 batch 之后进行额外的test_cfg参数支持在测试阶段单独指定size或size_divisor来控制 padding 方式。数据处理流程数据按如下方式处理与源码 docstring 一致收集数据并将其移动到目标设备cast_data用定义的pad_val将输入填充到目标尺寸并用定义的seg_pad_val填充分割图由stack_batch完成将输入堆叠为batch_inputs如果输入形状为 (3, H, W)则将输入从 BGR 转换为 RGBchannel_conversion开启时使用定义的std和mean标准化图像在训练期间进行 Mixup、Cutmix 等批量级数据增强batch_augments。forward 方法参数datadict从数据加载器采样的数据trainingbool是否启用训练时数据增强。返回值Dict与模型输入格式相同的数据。训练与测试分支的行为不同data_preprocessor.py训练时必须存在data_samples经过stack_batch后若配置了batch_augments再执行批量增强测试时则要求 batch 内图像尺寸一致若配置了test_cfg则按其中size/size_divisor做 padding并把 padding 信息通过set_metainfo写回data_samples这正是postprocess_result裁剪 padding 区域所需的信息来源否则直接torch.stack成 batch。配置示例在真实配置中数据预处理器通常写在模型基础配置里。以 deeplabv3_r50-d8.py 为例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, pretrainedopen-mmlab://resnet50_v1c, backbonedict( typeResNetV1c, depth50, num_stages4, out_indices(0, 1, 2, 3), dilations(1, 1, 2, 4), strides(1, 2, 1, 1), norm_cfgnorm_cfg, norm_evalFalse, stylepytorch, contract_dilationTrue), decode_headdict( typeASPPHead, in_channels2048, in_index3, channels512, dilations(1, 12, 24, 36), dropout_ratio0.1, num_classes19, norm_cfgnorm_cfg, align_cornersFalse, loss_decodedict( typeCrossEntropyLoss, use_sigmoidFalse, loss_weight1.0)), auxiliary_headdict( typeFCNHead, in_channels1024, in_index2, channels256, num_convs1, concat_inputFalse, dropout_ratio0.1, num_classes19, norm_cfgnorm_cfg, align_cornersFalse, loss_decodedict( typeCrossEntropyLoss, use_sigmoidFalse, loss_weight0.4)), train_cfgdict(), test_cfgdict(modewhole))该配置同时演示了data_preprocessor使用 ImageNet 统计的 mean/std 并开启 BGR→RGB 转换bgr_to_rgbTruedecode_head使用ASPPHead并以loss_weight1.0的交叉熵作为主损失auxiliary_head使用FCNHead且loss_weight0.4作为辅助损失test_cfg默认modewhole。若需要固定输入尺寸如 Cityscapes 的 512×1024可在具体实验配置中覆盖data_preprocessorcrop_size (512, 1024) data_preprocessor dict(sizecrop_size) model dict(data_preprocessordata_preprocessor)总结MMSegmentation 的模型设计遵循一切皆组件、一切皆可配置的原则BaseModel提供统一生命周期BaseSegmentor抽象分割器接口EncoderDecoder/CascadeEncoderDecoder提供两种可组合的架构范式SegDataPreProcessor屏蔽了设备迁移、padding、归一化与批量增强等重复劳动。理解forward的三种模式与test_cfg的推理模式是正确编写模型配置、排查推理性能问题的关键。后续可进一步阅读配置文档了解完整的字段体系或在 configs 目录中对照各算法的真实配置加深理解。【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价