ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

PaddleSeg 配置文件完全解读:从模块化结构到 `_base_` 继承机制

PaddleSeg 配置文件完全解读:从模块化结构到 `_base_` 继承机制 人工智能计算机视觉预训练【免费下载链接】PaddleSegEasy-to-use image segmentation library with awesome pre-trained model zoo, supporting wide-range of practical tasks in Semantic Segmentation, Interactive Segmentation, Panoptic Segmentation, Image Matting, 3D Segmentation, etc.项目地址https://gitcode.com/gh_mirrors/pa/PaddleSeg点击查看免费下载PaddleSeg 将训练所需的全部信息超参、数据集、数据预处理、优化器、学习率调度、损失函数、模型与主干网络以模块化方式组织在 YAML 配置文件中训练、评估与模型导出均直接由该文件驱动。本文以 configs/quick_start/pp_liteseg_optic_disc_512x512_1k.yml 为范例逐模块解读字段含义与修改方法并结合 paddleseg/cvlibs/config.py 与 paddleseg/cvlibs/manager.py 的源码深入剖析type字段的组件注册机制、多损失配置规则、_base_配置继承与覆盖逻辑帮助你掌握编写和复用 PaddleSeg 配置文件的核心能力。一、配置文件的作用与整体结构PaddleSeg 中所有语义分割模型都针对公开数据集提供了对应的配置文件统一保存在configs目录下。配置文件按照模块化方式定义包含以下模块信息超参batch_size单卡批次大小与iters训练迭代轮数单个 batch 完成一次前向与反向即为一轮训练数据集train_dataset与验证数据集val_dataset数据预处理transforms优化器optimizer与学习率调度器lr_scheduler损失函数loss模型model与其主干网络backbone。每个模块信息中type字段对应 PaddleSeg 代码中的模块类名Python class name其余字段则对应该类__init__函数的初始化参数。因此修改配置前需要先查阅对应模块类的源码定义。PaddleSeg 基于这些配置信息构建对应的模块进而完成模型训练、评估和导出——这一点在 paddleseg/cvlibs/config.py 的Config类 docstring 中有明确的说明。二、组件注册机制type字段背后的 ComponentManager配置文件中的type: Dataset、type: SGD、type: PPLiteSeg等字符串之所以能对应到真实的 Python 类依赖的是 PaddleSeg 的统一组件注册框架 paddleseg/cvlibs/manager.py。该文件定义了ComponentManager类它维护一个components_dict字典通过add_component方法可作为装饰器使用把类或函数以类名 - 类对象的形式注册进去。在模块底部创建了六个全局管理器实例MODELS ComponentManager(models) BACKBONES ComponentManager(backbones) DATASETS ComponentManager(datasets) TRANSFORMS ComponentManager(transforms) LOSSES ComponentManager(losses) OPTIMIZERS ComponentManager(optimizers)各模块的注册位置与配置文件中的字段一一对应配置模块支持类所在位置注册装饰器数据集train_dataset/val_datasetpaddleseg/datasets如Dataset、Cityscapes、optic_disc_seg等manager.DATASETS.add_component数据预处理transformspaddleseg/transforms/transforms.pymanager.TRANSFORMS.add_component优化器optimizerpaddleseg/optimizersmanager.OPTIMIZERS.add_component学习率调度lr_scheduler支持 PaddlePaddle 提供的所有 lr_scheduler 类由 Paddle 框架提供损失函数losspaddleseg/models/lossesmanager.LOSSES.add_component模型modelpaddleseg/modelsmanager.MODELS.add_component主干网络model.backbonepaddleseg/models/backbonesmanager.BACKBONES.add_component需要特别说明的是lr_scheduler模块与其它模块不同它不经过 PaddleSeg 的 manager 注册而是直接支持 PaddlePaddle 框架提供的全部学习率调度器如PolynomialDecay、CosineAnnealingDecay等。为什么可以这样设计从 paddleseg/cvlibs/config.py 的parse_from_yaml到构建阶段的调用链可以看出配置解析后各模块的type字符串会通过对应 manager 的__getitem__见 manager.py在注册表中查找类对象。若type不在注册表中会抛出KeyError并列出当前可用的全部组件名。这也是为什么新增自定义模块时只需在类上方添加对应的manager.XXX.add_component装饰器即可被配置文件引用。三、逐模块解读示例配置视盘分割 PP-LiteSeg下面以PaddleSeg/configs/quick_start/pp_liteseg_optic_disc_512x512_1k.yml为例进行详细解读。这是官方提供的最简入门配置用 PP-LiteSeg 在视盘分割数据集optic disc segmentation上训练 1000 轮。batch_size: 4 # 单卡 batch size一般显卡显存越大batch_size 可以越大多卡训练时总 batch size 等于该值乘以卡数 iters: 1000 # 模型训练迭代轮数 train_dataset: # 训练数据设置 type: Dataset # 指定加载数据集的类代码位于 paddleseg/datasets 目录下 dataset_root: data/optic_disc_seg # 数据集路径 train_path: data/optic_disc_seg/train_list.txt # 训练样本标识文件每行是 图像路径标注路径 num_classes: 2 # 类别个数背景也算作一类 mode: train # 表示用于训练 transforms: # 训练时的数据预处理方式 - type: ResizeStepScaling # 将原始图像和标注图像随机缩放为 0.5~2.0 倍 min_scale_factor: 0.5 max_scale_factor: 2.0 scale_step_size: 0.25 - type: RandomPaddingCrop # 从原始图像和标注图像中随机裁剪 512x512 大小 crop_size: [512, 512] - type: RandomHorizontalFlip # 对原始图像和标注图像随机进行水平翻转 - type: RandomDistort # 对原始图像做亮度、对比度、饱和度随机扰动标注图像不变 brightness_range: 0.5 contrast_range: 0.5 saturation_range: 0.5 - type: Normalize # 对原始图像归一化标注图像保持不变 val_dataset: # 验证数据设置 type: Dataset dataset_root: data/optic_disc_seg val_path: data/optic_disc_seg/val_list.txt # 验证样本标识文件 num_classes: 2 mode: val # 表示用于验证 transforms: - type: Normalize # 验证时只需归一化不做数据增强 optimizer: # 优化器设置 type: SGD # 采用随机梯度下降Stochastic Gradient Descent momentum: 0.9 # SGD 动量 weight_decay: 4.0e-5 # 权值衰减用于防止过拟合 lr_scheduler: # 学习率调度设置 type: PolynomialDecay # 多项式衰减学习率 learning_rate: 0.01 # 初始学习率 power: 0.9 end_lr: 0 # 训练结束时的学习率 loss: # 损失函数设置 types: - type: CrossEntropyLoss # 交叉熵损失 coef: [1, 1, 1] # PP-LiteSeg 有 1 个主 loss 和 2 个辅助 losscoef 表示各损失权重 # total_loss coef_1 * loss_1 ... coef_n * loss_n model: # 模型设置 type: PPLiteSeg # 模型类别 backbone: # 主干网络包括名称与预训练权重 type: STDC2 pretrained: https://bj.bcebos.com/paddleseg/dygraph/PP_STDCNet2.tar.gz3.1 数据集模块Dataset 与数据列表文件type: Dataset对应 paddleseg/datasets/dataset.py 中的通用数据集类。除通用Dataset外PaddleSeg 还针对 Cityscapes、ADE20K、Pascal VOC 等公开数据集提供了专用类如 paddleseg/datasets/cityscapes.py、paddleseg/datasets/voc.py它们同样通过manager.DATASETS.add_component注册。dataset_root指向数据集根目录train_path/val_path指向标识文件list 文件其中每行记录一张图像的路径及其标注路径。num_classes指定类别总数背景也计为一类mode取train/val分别用于训练与验证。3.2 数据预处理模块transforms 及其默认参数transforms是一个列表每个元素是一个 transform 配置块。上述示例用到的各 transform 在 paddleseg/transforms/transforms.py 中均有对应实现可通过manager.TRANSFORMS.add_component查找其类定义与默认参数ResizeStepScaling在min_scale_factor与max_scale_factor之间按scale_step_size步长随机缩放默认区间为 0.75~1.25RandomPaddingCrop随机裁剪crop_size大小的子图若目标尺寸大于原图则进行右下角填充默认crop_size为 (512, 512)RandomHorizontalFlip以prob默认 0.5概率水平翻转图像与标注RandomDistort对图像的亮度、对比度、饱和度进行随机扰动默认范围均为 0.5含brightness_prob等概率参数只作用于原始图像不影响标注Normalize使用mean与std默认均为 0.5对图像做归一化标注保持不变。3.3 优化器与学习率调度模块optimizer模块由 paddleseg/optimizers/optimizer.py 中的类支持示例使用的SGD通过manager.OPTIMIZERS.add_component注册。以该文件中的SGD类为例optimizer.py它包装了paddle.optimizer.SGD其__init__接受weight_decay、grad_clip_cfg梯度裁剪与custom_cfg参数分组自定义例如可为 backbone 设置lr_mult: 0.1实现分层学习率等参数。除 SGD 外同一文件还提供了Momentum、Adam等优化器。lr_scheduler直接使用 Paddle 框架提供的学习率调度器。示例中的PolynomialDecay以learning_rate0.01为初始学习率通过power0.9控制衰减曲线最终衰减到end_lr0。若要复现公开数据集指标需注意学习率对应的训练卡数详见第五节。3.4 损失函数模块types 与 coef 的对应关系loss模块是理解多损失配置的关键types下列出使用的损失函数类如CrossEntropyLosspaddleseg/models/losses/cross_entropy_loss.py可通过ignore_index、weight、top_k_percent_pixels等参数启用忽略像素或难例挖掘coef定义每个损失函数的权重total_loss coef_1 * loss_1 ... coef_n * loss_ntypes中损失函数个数必须等于coef数组的长度如果多个网络输出使用同一种损失可以只写一个损失名称如示例中 PP-LiteSeg 有 1 个主输出和 2 个辅助输出均使用CrossEntropyLoss因此types只需一个而coef为[1, 1, 1]分别对应三个输出的权重。从 paddleseg/cvlibs/config.py 的Configdocstring 可以印证这一规则coef的数量必须与模型输出数量一致若各输出使用相同的损失类型则可只配置一个损失类型否则损失类型的数量必须与coef一致。3.5 模型模块model 与 backbonemodel模块定义分割网络及其主干网络。示例中type: PPLiteSeg对应 paddleseg/models/pp_liteseg 中的 PP-LiteSeg 模型类backbone子模块通过type: STDC2指定主干网络并通过pretrained指定预训练权重下载地址。模型类通过manager.MODELS.add_component注册主干网络通过manager.BACKBONES.add_component注册。四、配置文件如何被加载与覆盖更新4.1 命令行加载与--opts动态覆盖训练入口 tools/train.py 通过--config参数指定配置文件路径并由paddleseg.cvlibs.Config解析。Config在解析时支持通过opts参数命令行--opts动态修改任意字段update_config_dict会解析形如batch_size2或test_config.scales0.75,1.0,1.25的keyvalue键值对以.分隔逐级定位并覆盖配置项见 config.py。这意味着无需修改 YAML 文件即可在命令行微调超参例如python tools/train.py \ --config configs/quick_start/pp_liteseg_optic_disc_512x512_1k.yml \ --opts batch_size2 iters5004.2 配置校验器Config构造时还会运行默认的配置校验器_build_default_checker见 config.py对主键完整性、num_classes一致性、损失与输出数量匹配、ignore_index同步等规则进行检查提前拦截配置错误避免训练中途失败。五、使用配置文件时必须注意的默认行为5.1 自动添加的图像读取与通道变换对于训练和验证数据集的预处理流程PaddleSeg默认会在最前面添加读取图像操作、在最后添加 HWC 转 CHW 操作因此这两个操作不需要写入transforms配置字段。这也是示例中验证集transforms只写Normalize一个操作仍能正确运行的原因。5.2 学习率与 GPU 卡数的对应关系只有configs/quick_start目录下配置文件中的学习率是单卡学习率其它配置文件中的学习率均为 4 卡训练的学习率。如果使用单卡训练来复现公开数据集上的指标学习率应调整为原来的 1/4。相应地batch_size为单卡批次大小多卡训练时的总 batch size 等于该值乘以卡数。六、_base_配置继承提升配置复用性为了更好的复用性PaddleSeg 的配置文件支持包含继承机制一个配置文件可以通过_base_字段引用另一个配置文件。以 configs/deeplabv3p/deeplabv3p_resnet50_os8_cityscapes_1024x512_80k.yml 为例_base_: ../_base_/cityscapes.yml # 被包含配置相对于该配置文件的路径 batch_size: 2 iters: 80000 model: type: DeepLabV3P backbone: type: ResNet50_vd output_stride: 8 multi_grid: [1, 2, 4] pretrained: https://bj.bcebos.com/paddleseg/dygraph/resnet50_vd_ssld_v2.tar.gz num_classes: 19 backbone_indices: [0, 3] aspp_ratios: [1, 12, 24, 36] aspp_out_channels: 256 align_corners: False pretrained: null它通过_base_: ../_base_/cityscapes.yml包含 configs/base/cityscapes.yml后者定义了 Cityscapes 数据集的train_dataset/val_dataset、optimizer、lr_scheduler与loss等公共配置而前者只需声明差异化内容model、batch_size、iters。该机制的底层实现在 paddleseg/cvlibs/config.py 的parse_from_yaml与merge_config_dicts函数中解析时发现_base_键后会以被包含配置文件相对于当前配置文件的路径为基准递归解析基础配置再调用merge_config_dicts进行合并。合并遵循两条关键规则字段覆盖规则如果两个配置文件包含方 A 与被包含方 B中存在相同的字段X则B中的X会被A中的X覆盖。例如上例中batch_size、iters、model会覆盖 cityscapes.yml 中的同名字段递归合并规则当某字段在两侧都是字典如model、train_dataset时会递归地合并子字段只有当子键也冲突时才以包含方的值为准。从 config.py 的源码还可以看到合并行为受_inherited_键控制若包含方显式设置_inherited_: false则不再继承基础配置仅使用自身字段。此外_base_也支持传入列表以同时继承多个基础配置。七、小结PaddleSeg 的配置文件是一份模块装配清单type通过 ComponentManager 注册表映射到真实的 Python 类其余字段对应类初始化参数loss.types与loss.coef完成多输出损失装配_base_实现配置的继承复用与字段覆盖。掌握这些机制后你可以在configs目录已有配置基础上通过修改train_dataset/val_dataset快速迁移到自定义数据集通过--opts在命令行动态调整batch_size、iters等超参而无需改动文件利用_base_抽离公共配置像 DeepLabV3P 之于 cityscapes 一样为不同模型复用同一套数据与训练设置依据单卡/4 卡学习率规则正确设置learning_rate并利用默认的读取图像与 HWC→CHW 自动操作精简transforms。最后建议在实际动手前结合 configs 目录中的各模型配置与 paddleseg 源码中对应类的__init__签名进行核对确保配置字段与类参数一一对应。赞分享人工智能计算机视觉预训练【免费下载链接】PaddleSegEasy-to-use image segmentation library with awesome pre-trained model zoo, supporting wide-range of practical tasks in Semantic Segmentation, Interactive Segmentation, Panoptic Segmentation, Image Matting, 3D Segmentation, etc.项目地址https://gitcode.com/gh_mirrors/pa/PaddleSeg点击查看免费下载相关推荐WeKan 如何为卡片设置每日、每周或每月的自动重复复制WeKan 如何为卡片设置每日、每周或每月的自动重复复制 如果你有一张卡片代表周期性工作——每周的状态汇报、每月的发票——又不想每次都手动重建它WeKan人工智能计算机视觉预训练MMSegmentation 配置系统全解析从 _base_ 模块化继承到 --cfg-options 命令行覆盖MMSegmentation 配置系统全解析从 _base_ 模块化继承到 cfg options 命令行覆盖 本文是 MMSegmentation 配置系统人工智能深度学习计算机视觉如何构建模块化Zellij配置5个实用继承示例与最佳实践如何构建模块化Zellij配置5个实用继承示例与最佳实践 Zellij作为一款功能强大的终端工作区工具其配置系统支持模块化设计让用户能够轻松管理复杂的终端开发工具CLI上一篇终极Mermaid.js图表绘制指南从新手到专家的快速上手教程下一篇深入解析 turf/metaTurf 中统一的 GeoJSON 遍历、归约与定位工具箱创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表