
MMSegmentation 配置系统全解析从base模块化继承到 --cfg-options 命令行覆盖【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation本文是 MMSegmentation 配置系统Config的完整实战指南。它系统讲解config/_base_四大基础模块的构成、配置文件命名规范、以 PSPNet 为样例的逐字段拆解以及_delete_、中间变量、--cfg-options等进阶用法帮助你从零看懂、修改并复用自己的分割实验配置。读完本文你将能够独立阅读仓库内任意一个配置文件掌握通过继承快速搭建新方法、通过命令行临时覆盖超参的完整能力。配置系统的设计思想模块化与继承MMSegmentation 的配置系统融合了**模块化modular与继承inheritance**两种设计把一次实验拆成若干可复用的零件再用继承把零件组合成完整配置。这样的设计极大地方便了开展各类对比实验。在 configs/base目录下配置被划分为 4 种基础组件类型组件目录作用datasets/数据集配置数据路径、加载与增强流水线、dataloader、评估指标等models/模型配置backbone、decode head、auxiliary head、损失函数等schedules/训练计划优化器、学习率调度器、训练循环、默认钩子等default_runtime.py默认运行环境注册表作用域、环境变量、日志、断点续训等从仓库实际内容看datasets/下包含 Cityscapes、ADE20K、PASCAL VOC、COCO-Stuff 等 31 个数据集文件如ade20k.py、pascal_voc12_aug.pymodels/下包含 PSPNet、DeepLabV3、FCN、UperNet 等 50 个模型文件schedules/下则提供20k/40k/80k/160k/240k/320k等不同迭代数目的训练计划。很多方法如 DeepLabV3、PSPNet只需要从四类组件中各取其一即可轻松拼装成一个完整配置。由_base_组件组合而成的配置称为primitive原始配置。官方对配置组织提出两条建议同一目录下的所有配置只保留一个 primitive 配置其余配置一律从该 primitive 配置继承从而把继承层级控制在最多 3 层以内优先从已有方法继承例如在 DeepLabV3 基础上做改动只需先通过_base_ ../deeplabv3/deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024.py继承其基本结构再修改必要字段即可。如果要从零构建一个与现有方法结构完全不同的新方法可以在configs下新建一个xxxnet目录。关于 mmengine 配置系统的更底层细节如继承合并规则、_delete_语义官方建议参阅 mmengine 的 config 教程。配置文件命名规范MMSegmentation 遵循如下风格为配置文件命名贡献者也应遵循同样风格{algorithm name}_{model component names [component1]_[component2]_[...]}_{training settings}_{training dataset information}_{testing dataset information}文件名分为五个部分各部分及组件之间用_连接每个部分或组件内部的单词用-连接{algorithm name}算法名称如deeplabv3、pspnet等。{model component names}算法中用到的组件名如 backbone、head 等。例如r50-d8表示使用 ResNet50 作为 backbone且以 backbone 输出 8 倍下采样特征作为输入。{training settings}训练设置信息如 batch size、增强、损失、学习率调度器、epoch/迭代数。例如4xb4-ce-linearlr-40K表示 4 卡 × 每卡 4 图、CrossEntropy 损失、Linear 学习率调度器、训练 40K 迭代。常用缩写如下{gpu x batch_per_gpu}GPU 数量与每卡样本数。bN表示每卡 N 个 batch。例如8xb2是 8 卡 × 每卡 2 图的缩写未注明时默认采用4xb4。{schedule}训练计划取值为20k、40k等分别表示 20000 次、40000 次迭代。{training dataset information}训练数据集名称如cityscapes、ade20k与输入分辨率。例如cityscapes-768x768表示在 Cityscapes 上训练、输入尺寸为768x768。{testing dataset information}可选当模型在一个数据集训练、在另一个数据集测试时记录测试数据集名称。未标注则默认训练与测试使用同一类数据集。以仓库中的 pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py 为例文件名完整传达了PSPNet 算法 ResNet50 骨干8 倍下采样 4 卡 × 每卡 2 图 40K 迭代 Cityscapes 数据集 512x1024 输入分辨率。查看完整配置print_config.py由于继承会让最终生效的配置分散在多个文件中官方提供了工具 tools/misc/print_config.py 来打印某个配置合并后的完整内容python tools/misc/print_config.py /PATH/TO/CONFIG也可以追加--cfg-options xxx.yyyzzz查看临时覆盖后的更新配置。从该工具源码可以看到它支持两个核心参数--graph额外在 CPU 上初始化模型调用mmseg.apis.init_model打印模型结构图并写入example-graph.txt--cfg-options以xxxyyy键值对形式合并进配置基于 mmengine 的DictAction。无论是否指定参数工具都会在解析后打印cfg.pretty_text并把合并结果dump到当前目录的example.py方便直接查看继承展开后的完整配置内容。以 PSPNet 为例拆解完整配置为了让你对现代语义分割系统中的完整配置和各模块有基本认知下面逐块注释使用 ResNet50V1c 的 PSPNet 配置。每个模块更详细的用法与可选替代可参阅对应 API 文档。顶层配置四件套继承pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py 的完整内容如下_base_ [ ../_base_/models/pspnet_r50-d8.py, ../_base_/datasets/cityscapes.py, ../_base_/default_runtime.py, ../_base_/schedules/schedule_40k.py ] # 构建新配置所依赖的基础配置文件 crop_size (512, 1024) data_preprocessor dict(sizecrop_size) model dict(data_preprocessordata_preprocessor)它一次性继承模型、数据集、默认运行时、训练计划四类基础配置再通过覆盖data_preprocessor.size为(512, 1024)来与数据集的crop_size保持一致保证训练时输入图与分割标签的尺寸对齐。模型配置base/models/pspnet_r50-d8.pyconfigs/base/models/pspnet_r50-d8.py 是使用 ResNet50V1c 的 PSPNet 基础模型配置# model settings norm_cfg dict(typeSyncBN, requires_gradTrue) # 分割任务通常使用 SyncBN data_preprocessor dict( # 数据预处理器配置通常包含图像归一化与增强 typeSegDataPreProcessor, # 数据预处理器类型 mean[123.675, 116.28, 103.53], # 输入图像归一化使用的均值 std[58.395, 57.12, 57.375], # 输入图像归一化使用的标准差 bgr_to_rgbTrue, # 是否将图像从 BGR 转为 RGB pad_val0, # 图像填充值 seg_pad_val255) # 分割图填充值 model dict( typeEncoderDecoder, # 分割器segmentor名称 data_preprocessordata_preprocessor, pretrainedopen-mmlab://resnet50_v1c, # 要加载的 ImageNet 预训练 backbone backbonedict( typeResNetV1c, # backbone 类型详见 mmseg/models/backbones/resnet.py depth50, # backbone 深度通常使用 50、101 num_stages4, # backbone 的 stage 数量 out_indices(0, 1, 2, 3), # 各 stage 输出的特征图索引 dilations(1, 1, 2, 4), # 各层的空洞率 strides(1, 2, 1, 1), # 各层的步长 norm_cfgnorm_cfg, # 归一化层配置 norm_evalFalse, # 是否冻结 BN 中的统计量 stylepytorch, # backbone 风格pytorch 表示 stride 2 层在 3x3 卷积中caffe 表示在 1x1 卷积中 contract_dilationTrue), # 当 dilation 1 时是否收缩 dilation 的第一层 decode_headdict( typePSPHead, # 解码头类型详见 mmseg/models/decode_heads 下可用选项 in_channels2048, # 解码头输入通道数 in_index3, # 选择的特征图索引 channels512, # 解码头中间通道数 pool_scales(1, 2, 3, 6), # PSPHead 的池化尺度详见论文 dropout_ratio0.1, # 最终分类层前的 dropout 比例 num_classes19, # 分割类别数Cityscapes 通常 19、VOC 21、ADE20K 150 norm_cfgnorm_cfg, # 归一化层配置 align_cornersFalse, # 解码中 resize 的 align_corners 参数 loss_decodedict( # decode_head 的损失函数配置 typeCrossEntropyLoss, # 分割使用的损失类型 use_sigmoidFalse, # 分割是否使用 sigmoid 激活 loss_weight1.0)), # decode_head 的损失权重 auxiliary_headdict( typeFCNHead, # 辅助头类型详见 mmseg/models/decode_heads 下可用选项 in_channels1024, # 辅助头输入通道数 in_index2, # 选择的特征图索引 channels256, # 辅助头中间通道数 num_convs1, # FCNHead 中卷积数量辅助头通常为 1 concat_inputFalse, # 分类层前是否将卷积输出与输入拼接 dropout_ratio0.1, # 最终分类层前的 dropout 比例 num_classes19, # 分割类别数 norm_cfgnorm_cfg, # 归一化层配置 align_cornersFalse, # 解码中 resize 的 align_corners 参数 loss_decodedict( # auxiliary_head 的损失函数配置 typeCrossEntropyLoss, # 损失类型 use_sigmoidFalse, # 是否使用 sigmoid loss_weight0.4)), # 辅助头损失权重 # 模型训练与测试设置 train_cfgdict(), # train_cfg 目前只是一个占位符 test_cfgdict(modewhole)) # 测试模式可选 whole 与 slidewhole 为整图全卷积测试slide 为滑动窗口测试对照仓库源码可以进一步印证两个核心模块的实现数据预处理器mmseg/models/data_preprocessor.py 中注册了SegDataPreProcessor与 mmengine 的ImgDataPreprocessor相比它有三点差异未指定mean时不做归一化先 stack batch 再做归一化与颜色空间转换支持 mixup、cutmix 等 batch 级增强。其完整处理流程包括collate 并搬运数据到目标设备、按pad_val/seg_pad_val填充输入与分割图、stack 成batch_inputs、按需 BGR→RGB 转换、按mean/std归一化。PSPHeadmmseg/models/decode_heads/psp_head.py 中pool_scales参数被传入PPMPyramid Pooling Module内部对每个尺度执行AdaptiveAvgPool2d(pool_scale)后接 1x1ConvModule再bilinear上采样回原尺寸_forward_feature会把原特征与各尺度池化特征cat后送入bottleneck3x3 卷积最后经cls_seg完成逐像素分类。数据集配置base/datasets/cityscapes.pyconfigs/base/datasets/cityscapes.py 是 Cityscapes 数据集配置# dataset settings dataset_type CityscapesDataset # 数据集类型用于定义数据集 data_root data/cityscapes/ # 数据根路径 crop_size (512, 1024) # 训练时的裁剪尺寸 train_pipeline [ # 训练流水线 dict(typeLoadImageFromFile), # 第一步从文件路径加载图像 dict(typeLoadAnnotations), # 第二步为当前图像加载标注 dict(typeRandomResize, # 增强缩放图像及其标注 scale(2048, 1024), # 图像缩放尺度 ratio_range(0.5, 2.0), # 缩放比例范围 keep_ratioTrue), # 缩放时是否保持宽高比 dict(typeRandomCrop, # 增强从当前图像随机裁剪一块 crop_sizecrop_size, # 裁剪块尺寸 cat_max_ratio0.75), # 单一类别可占的最大面积比例 dict(typeRandomFlip, # 增强翻转图像与标注 prob0.5), # 翻转概率 dict(typePhotoMetricDistortion), # 增强使用多种光度学方法扰动图像 dict(typePackSegInputs) # 打包语义分割输入数据 ] test_pipeline [ dict(typeLoadImageFromFile), # 第一步从文件路径加载图像 dict(typeResize, # 使用 resize 增强 scale(2048, 1024), # 缩放尺度 keep_ratioTrue), # 是否保持宽高比 # 在 Resize 之后加载标注因为 ground truth 不需要做 resize 数据变换 dict(typeLoadAnnotations), # 加载数据集提供的语义分割标注 dict(typePackSegInputs) # 打包语义分割输入数据 ] train_dataloader dict( # 训练 dataloader 配置 batch_size2, # 单卡 batch size num_workers2, # 每卡用于预取数据的 worker 数 persistent_workersTrue, # 每个 epoch 结束后不关闭 worker 进程可加速训练 samplerdict(typeInfiniteSampler, shuffleTrue), # 训练时随机打乱 datasetdict( # 训练数据集配置 typedataset_type, # 数据集类型详见 mmseg/datasets/ data_rootdata_root, # 数据集根目录 data_prefixdict( img_pathleftImg8bit/train, seg_map_pathgtFine/train), # 训练数据前缀 pipelinetrain_pipeline)) # 处理流水线传入上面定义的 train_pipeline val_dataloader dict( batch_size1, # 单卡 batch size num_workers4, # 每卡 worker 数 persistent_workersTrue, # 跨 epoch 保留 worker加速测试 samplerdict(typeDefaultSampler, shuffleFalse), # 验证与测试不打乱 datasetdict( # 测试数据集配置 typedataset_type, # 数据集类型 data_rootdata_root, # 数据集根目录 data_prefixdict( img_pathleftImg8bit/val, seg_map_pathgtFine/val), # 测试数据前缀 pipelinetest_pipeline)) # 处理流水线传入上面定义的 test_pipeline test_dataloader val_dataloader # 衡量精度的指标这里使用 IoUMetric val_evaluator dict(typeIoUMetric, iou_metrics[mIoU]) test_evaluator val_evaluator仓库中的该文件还在test_pipeline之后额外定义了img_ratios与tta_pipeline多尺度缩放 水平翻转的 TestTimeAug 组合供tools/test.py --tta测试时增强使用test_dataloader val_dataloader表明测试与验证共享同一份数据加载配置val_evaluator/test_evaluator均采用IoUMetric与mIoU指标。训练计划配置base/schedules/schedule_40k.pyconfigs/base/schedules/schedule_40k.py 定义了 40k 迭代的训练计划# optimizer optimizer dict(typeSGD, # 优化器类型 lr0.01, # 优化器学习率各参数详细用法见 PyTorch 文档 momentum0.9, # 动量 weight_decay0.0005) # SGD 的权重衰减 optim_wrapper dict(typeOptimWrapper, # 优化器包装器提供统一的参数更新接口 optimizeroptimizer, # 用于更新模型参数的优化器 clip_gradNone) # 若 clip_grad 非 None则为 torch.nn.utils.clip_grad 的参数 # learning policy param_scheduler [ dict( typePolyLR, # 调度器策略还支持 Step、CosineAnnealing、Cyclic 等 eta_min1e-4, # 调度结束时的最小学习率 power0.9, # 多项式衰减的幂 begin0, # 开始更新参数的步数 end40000, # 停止更新参数的步数 by_epochFalse) # 是否按 epoch 计数 ] # 40k 迭代训练计划 train_cfg dict(typeIterBasedTrainLoop, max_iters40000, val_interval4000) val_cfg dict(typeValLoop) test_cfg dict(typeTestLoop) # 默认钩子 default_hooks dict( timerdict(typeIterTimerHook), # 记录迭代耗时 loggerdict(typeLoggerHook, interval50, log_metric_by_epochFalse), # 收集并写入 Runner 各组件的日志 param_schedulerdict(typeParamSchedulerHook), # 更新优化器中的超参数如学习率 checkpointdict(typeCheckpointHook, by_epochFalse, interval4000), # 周期保存 checkpoint sampler_seeddict(typeDistSamplerSeedHook)) # 分布式训练的取数 sampler仓库实际文件在default_hooks中还追加了visualizationdict(typeSegVisualizationHook)用于训练过程中可视化分割结果该钩子会被tools/test.py的trigger_visualization_hook在--show/--show-dir时激活。PolyLR是语义分割最常用的学习率策略by_epochFalse表明整个train_cfg采用基于迭代iteration的训练循环。默认运行环境base/default_runtime.pyconfigs/base/default_runtime.py 提供默认运行环境# 将注册表的默认作用域设置为 mmseg default_scope mmseg # environment env_cfg dict( cudnn_benchmarkTrue, mp_cfgdict(mp_start_methodfork, opencv_num_threads0), dist_cfgdict(backendnccl), ) log_level INFO log_processor dict(by_epochFalse) load_from None # 从文件加载 checkpoint resume False # 是否从已有模型恢复训练仓库实际文件在此基础上还声明了vis_backends[dict(typeLocalVisBackend)]、visualizerdict(typeSegLocalVisualizer, ...)以及tta_modeldict(typeSegTTAModel)——前者供SegVisualizationHook落盘可视化结果后者被tools/test.py --tta用作测试时增强的模型包装器。用 MMEngine Config 加载与解析配置以上便是训练和测试 PSPNet 所需的全部配置。要加载并解析它们可以使用 mmengine 实现的Configfrom mmengine.config import Config cfg Config.fromfile(configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py) print(cfg.train_dataloader)输出{batch_size: 2, num_workers: 2, persistent_workers: True, sampler: {type: InfiniteSampler, shuffle: True}, dataset: {type: CityscapesDataset, data_root: data/cityscapes/, data_prefix: {img_path: leftImg8bit/train, seg_map_path: gtFine/train}, pipeline: [{type: LoadImageFromFile}, {type: LoadAnnotations}, {type: RandomResize, scale: (2048, 1024), ratio_range: (0.5, 2.0), keep_ratio: True}, {type: RandomCrop, crop_size: (512, 1024), cat_max_ratio: 0.75}, {type: RandomFlip, prob: 0.5}, {type: PhotoMetricDistortion}, {type: PackSegInputs}]}}可以看到继承展开后train_dataloader的字段被完整解析为普通 dict。cfg是mmengine.config.Config的实例其接口与 dict 对象一致同时允许以属性方式访问配置值如cfg.train_dataloader并支持merge_from_dict等方法。这正是 tools/train.py 与 tools/test.py 内部加载配置的底层机制。进阶 FAQ忽略基类中的某些字段deleteTrue有时需要在子配置中忽略基类的部分字段可以设置_delete_True。例如想基于以下配置文件pspnet.py修改 PSPNet 的 backbonenorm_cfg dict(typeSyncBN, requires_gradTrue) model dict( typeEncoderDecoder, pretrainedtorchvision://resnet50, 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( typePSPHead, in_channels2048, in_index3, channels512, pool_scales(1, 2, 3, 6), dropout_ratio0.1, num_classes19, norm_cfgnorm_cfg, align_cornersFalse, loss_decodedict( typeCrossEntropyLoss, use_sigmoidFalse, loss_weight1.0)))在代码中加载并解析pspnet.pyfrom mmengine.config import Config cfg Config.fromfile(pspnet.py) print(cfg.model)输出{type: EncoderDecoder, pretrained: torchvision://resnet50, backbone: {type: ResNetV1c, depth: 50, num_stages: 4, out_indices: (0, 1, 2, 3), dilations: (1, 1, 2, 4), strides: (1, 2, 1, 1), norm_cfg: {type: SyncBN, requires_grad: True}, norm_eval: False, style: pytorch, contract_dilation: True}, decode_head: {type: PSPHead, in_channels: 2048, in_index: 3, channels: 512, pool_scales: (1, 2, 3, 6), dropout_ratio: 0.1, num_classes: 19, norm_cfg: {type: SyncBN, requires_grad: True}, align_corners: False, loss_decode: {type: CrossEntropyLoss, use_sigmoid: False, loss_weight: 1.0}}}ResNet与HRNet使用了不同的构造关键字这时需要编写新的配置文件hrnet.py_base_ pspnet.py norm_cfg dict(typeSyncBN, requires_gradTrue) model dict( pretrainedopen-mmlab://msra/hrnetv2_w32, backbonedict( _delete_True, typeHRNet, norm_cfgnorm_cfg, extradict( stage1dict( num_modules1, num_branches1, blockBOTTLENECK, num_blocks(4, ), num_channels(64, )), stage2dict( num_modules1, num_branches2, blockBASIC, num_blocks(4, 4), num_channels(32, 64)), stage3dict( num_modules4, num_branches3, blockBASIC, num_blocks(4, 4, 4), num_channels(32, 64, 128)), stage4dict( num_modules3, num_branches4, blockBASIC, num_blocks(4, 4, 4, 4), num_channels(32, 64, 128, 256)))))加载并解析hrnet.pyfrom mmengine.config import Config cfg Config.fromfile(hrnet.py) print(cfg.model)输出{type: EncoderDecoder, pretrained: open-mmlab://msra/hrnetv2_w32, backbone: {type: HRNet, norm_cfg: {type: SyncBN, requires_grad: True}, extra: {stage1: {num_modules: 1, num_branches: 1, block: BOTTLENECK, num_blocks: (4,), num_channels: (64,)}, stage2: {num_modules: 1, num_branches: 2, block: BASIC, num_blocks: (4, 4), num_channels: (32, 64)}, stage3: {num_modules: 4, num_branches: 3, block: BASIC, num_blocks: (4, 4, 4), num_channels: (32, 64, 128)}, stage4: {num_modules: 3, num_branches: 4, block: BASIC, num_blocks: (4, 4, 4, 4), num_channels: (32, 64, 128, 256)}}}, decode_head: {type: PSPHead, in_channels: 2048, in_index: 3, channels: 512, pool_scales: (1, 2, 3, 6), dropout_ratio: 0.1, num_classes: 19, norm_cfg: {type: SyncBN, requires_grad: True}, align_corners: False, loss_decode: {type: CrossEntropyLoss, use_sigmoid: False, loss_weight: 1.0}}}_delete_True会用backbone字段中的新键替换掉基类中的所有旧键。注意decode_head与auxiliary_head若未重新声明则仍沿用基类中的定义。在配置中使用中间变量配置文件中会使用一些中间变量如数据集配置中的train_pipeline/test_pipeline。需要注意在子配置中修改中间变量后必须把中间变量重新传回对应字段。例如想修改多尺度策略来训练/测试 PSPNet就需要重新定义train_pipeline/test_pipeline并传入dataset_base_ ../pspnet/pspnet_r50-d8_4xb4-40k_cityscpaes-512x1024.py crop_size (512, 1024) img_norm_cfg dict( mean[123.675, 116.28, 103.53], std[58.395, 57.12, 57.375], to_rgbTrue) train_pipeline [ dict(typeLoadImageFromFile), dict(typeLoadAnnotations), dict(typeRandomResize, img_scale(2048, 1024), ratio_range(1., 2.), keep_rationTrue), dict(typeRandomCrop, crop_sizecrop_size, cat_max_ratio0.75), dict(typeRandomFlip, flip_ratio0.5), dict(typePhotoMetricDistortion), dict(typePackSegInputs), ] test_pipeline [ dict(typeLoadImageFromFile), dict(typeResize, scale(2048, 1024), keep_ratioTrue), dict(typeLoadAnnotations), dict(typePackSegInputs) ] train_datasetdict( typedataset_type, data_rootdata_root, data_prefixdict( img_pathleftImg8bit/train, seg_map_pathgtFine/train), pipelinetrain_pipeline) test_datasetdict( typedataset_type, data_rootdata_root, data_prefixdict( img_pathleftImg8bit/val, seg_map_pathgtFine/val), pipelinetest_pipeline) train_dataloader dict(datasettrain_dataset) val_dataloader dict(datasettest_dataset) test_dataloader val_dataloader类似地如果想把SyncBN换成BN或MMSyncBN需要替换配置中每一处norm_cfg_base_ ../pspnet/pspnet_r50-d8_4xb4-40k_cityscpaes-512x1024.py norm_cfg dict(typeBN, requires_gradTrue) model dict( backbonedict(norm_cfgnorm_cfg), decode_headdict(norm_cfgnorm_cfg), auxiliary_headdict(norm_cfgnorm_cfg))之所以要显式传回是因为 mmengine 的继承机制只负责合并配置顶层字段子配置中重新定义的同名变量会覆盖基类但基类模型中引用旧norm_cfg的位置不会自动跟随新变量更新必须逐处显式覆盖。通过命令行参数修改配置--cfg-options在 tools/train.py 与 tools/test.py 中都支持脚本参数--cfg-options它允许用户覆盖所用配置中的部分设置xxxyyy形式的键值对会被合并进配置文件。下面用一个简化的demo_script.py演示其原理import argparse from mmengine.config import Config, DictAction def parse_args(): parser argparse.ArgumentParser(descriptionScript Example) parser.add_argument(config, helptrain config file path) parser.add_argument( --cfg-options, nargs, actionDictAction, helpoverride some settings in the used config, the key-value pair in xxxyyy format will be merged into config file. If the value to be overwritten is a list, it should be like key[a,b] or keya,b It also allows nested list/tuple values, e.g. key[(a,b),(c,d)] Note that the quotation marks are necessary and that no white space is allowed.) args parser.parse_args() return args def main(): args parse_args() cfg Config.fromfile(args.config) if args.cfg_options is not None: cfg.merge_from_dict(args.cfg_options) print(cfg) if __name__ __main__: main()示例配置文件demo_config.py如下backbone dict( typeResNetV1c, depth50, num_stages4, out_indices(0, 1, 2, 3), dilations(1, 1, 2, 4), strides(1, 2, 1, 1), norm_evalFalse, stylepytorch, contract_dilationTrue)运行demo_script.pypython demo_script.py demo_config.pyConfig (path: demo_config.py): {backbone: {type: ResNetV1c, depth: 50, num_stages: 4, out_indices: (0, 1, 2, 3), dilations: (1, 1, 2, 4), strides: (1, 2, 1, 1), norm_eval: False, style: pytorch, contract_dilation: True}}通过脚本参数修改配置python demo_script.py demo_config.py --cfg-options backbone.depth101Config (path: demo_config.py): {backbone: {type: ResNetV1c, depth: 101, num_stages: 4, out_indices: (0, 1, 2, 3), dilations: (1, 1, 2, 4), strides: (1, 2, 1, 1), norm_eval: False, style: pytorch, contract_dilation: True}}更新 list/tuple 类型的值如果需要更新的值本身是 list 或 tuple例如demo_config.py中backbone的strides(1, 2, 1, 1)有两种指定方式使用引号包裹以支持 list/tuple 数据类型引号必不可少python demo_script.py demo_config.py --cfg-options backbone.strides(1, 1, 1, 1)Config (path: demo_config.py): {backbone: {type: ResNetV1c, depth: 50, num_stages: 4, out_indices: (0, 1, 2, 3), dilations: (1, 1, 2, 4), strides: (1, 1, 1, 1), norm_eval: False, style: pytorch, contract_dilation: True}}使用逗号分隔值中不允许出现空格此时若原类型为 tuple会在此方式下被自动转换为 listpython demo_script.py demo_config.py --cfg-options backbone.strides1,1,1,1Config (path: demo_config.py): {backbone: {type: ResNetV1c, depth: 50, num_stages: 4, out_indices: (0, 1, 2, 3), dilations: (1, 1, 2, 4), strides: [1, 1, 1, 1], norm_eval: False, style: pytorch, contract_dilation: True}}注意--cfg-options只支持修改 string、int、float、boolean、None、list 和 tuple 类型的配置项更进一步对于 list 和 tuple 类型其内部元素也必须是以上七种类型之一。结语从config/_base_的四类基础组件到命名规范、_delete_字段替换、中间变量传递再到--cfg-options的命令行覆盖MMSegmentation 的配置系统构成了一个完整而灵活的实验编排框架。理解这套机制后你可以借助 tools/misc/print_config.py 快速核对继承展开结果通过修改_base_字段快速搭建新方法变体并在不修改任何文件的情况下用一行命令完成超参对比实验从而把更多精力聚焦在模型本身的设计与验证上。【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考