新闻详情

新闻详情

首页 / 资讯中心 / 详情

PaddleSeg 组件扩展指南:用 manager 注册机制添加自定义 Model、Loss、Transform、Backbone 与 Dataset

发布时间:2026/9/25 2:36:36来源:尧图网络
PaddleSeg 组件扩展指南:用 manager 注册机制添加自定义 Model、Loss、Transform、Backbone 与 Dataset
人工智能计算机视觉预训练【免费下载链接】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 通过paddleseg/cvlibs/manager.py中的ComponentManager提供了一套统一的组件注册机制将 Model、Loss、Transform、Backbone、Dataset 五类组件以“类名即键”的方式注册进全局容器再由 YAML 配置文件按名称动态实例化。读完本文你将掌握为 PaddleSeg 添加自定义模型、损失函数、数据增强、主干网络和数据集的完整四步流程理解manager.MODELS.add_component这类装饰器背后的源码实现并能正确配置多输出模型主损失 辅助损失的 loss 对齐规则。一、扩展机制总览ComponentManager 与五类组件PaddleSeg 官方扩展文档add_new_model.md指出框架提供五种可扩展组件类型MODELS、LOSSES、TRANSFORMS、BACKBONES、DATASETS。五类组件共享同一套注册入口——paddleseg/cvlibs包中导出的manager对象。从 manager.py 源码可以看到框架实际定义了六个全局容器MODELS ComponentManager(models) BACKBONES ComponentManager(backbones) DATASETS ComponentManager(datasets) TRANSFORMS ComponentManager(transforms) LOSSES ComponentManager(losses) OPTIMIZERS ComponentManager(optimizers)ComponentManager的核心行为见 manager.py包括注册即返回原对象add_component接受单个类/函数或类/函数的序列list/tuple注册完成后原样返回输入因此既能作为普通函数调用manager.MODELS.add_component(NewNet)也能作为类定义上方的装饰器使用manager.MODELS.add_component文档示例中两种写法均有效以类名为键注册时使用component.__name__作为字典键存入components_dict这决定了 YAML 中type:字段填写的就是类名本身如PSPNet、CrossEntropyLoss重名覆盖并告警若同名组件再次注册_add_single_component会发出xxx exists already! It is now updated to xxx !!!警告并用新类覆盖旧类这意味着你可以在自定义项目中覆盖内置组件的同名实现按名取用__getitem__在键不存在时抛出带当前容器全部可用组件名的KeyError便于排查 YAML 中type:拼写错误类型校验仅接受class或function类型其他类型抛出TypeError。这套机制与配置文件的关系是tools/train.py、tools/val.py等脚本读取 YAML 后依据type字段到对应容器中取出类再用其余字段作为构造参数实例化。下面分组件类型逐一说明扩展步骤。二、添加一个新模型A New Model2.1 标准四步流程假设你要实现一个名为NewNet的自定义分割网络放在newnet.py中import paddle.nn as nn from paddleseg.cvlibs import manager manager.MODELS.add_component class NewNet(nn.Layer): def __init__(self, param1, param2, param3): pass def forward(self, x): passStep 1将newnet.py放到 paddleseg/models/ 目录下。该目录已内置 ANN、DeepLab、PSPNet、OCRNet、UNet、BiSeNet 等 50 余种分割模型实现可参照其结构编写。Step 2在模型类上方添加manager.MODELS.add_component装饰器。如前所述manager是组件容器包含MODELS、BACKBONES、DATASETS、TRANSFORMS、LOSSES。Step 3在 paddleseg/models/__init__.py 中导入你的类保证包被加载时类定义被注册from .newnet import NewNetStep 4在 YAML 配置文件中按类名指定模型model: type: NewNet param1: ... param2: ... param3: ...2.2 以 PSPNet 为例看真实实现PSPNet 实现是文档示例的完整样板manager.MODELS.add_component class PSPNet(nn.Layer): def __init__(self, num_classes, backbone, backbone_indices(2, 3), pp_out_channels1024, bin_sizes(1, 2, 3, 6), enable_auxiliary_lossTrue, align_cornersFalse, pretrainedNone): ... def forward(self, x): feat_list self.backbone(x) logit_list self.head(feat_list) return [F.interpolate(...) for logit in logit_list]其中值得注意的约定写自定义模型时应遵循backbone作为构造参数注入而非内部自建PSPNet 在__init__中直接接收backbone对象并通过backbone.feat_channels[i]查询指定 stage 的输出通道数。这对应 YAML 中model.backbone子配置由框架先行实例化后注入的模式见 pspnet_resnet50_os8_cityscapes_1024x512_80k.ymlmodel: type: PSPNet backbone: type: ResNet50_vd output_stride: 8 pretrained: https://bj.bcebos.com/paddleseg/dygraph/resnet50_vd_ssld_v2.tar.gz enable_auxiliary_loss: True align_corners: Falseforward返回 logits 列表PSPNet 的forward返回长度为 1 或 2 的 list主 logit 可选辅助 logit框架训练循环按列表逐元素与 loss 配置对齐这正是后文“多输出模型”一节讨论的机制。2.3 多输出模型的 loss 配置要点重要若模型有多个输出主损失 辅助损失必须同步修改 YAML 中的loss配置否则训练时会抛出类似The length of logits should equal to the types of loss config: 2!1.的错误。该检查来自训练主循环 paddleseg/core/train.pydef check_logits_losses(logits_list, losses): len_logits len(logits_list) len_losses len(losses[types]) if len_logits ! len_losses: raise RuntimeError( The length of logits_list should equal to the types of loss config: {} ! {}. .format(len_logits, len_losses))以 PSPNet 为例它输出两个 logits主 辅助两项均用CrossEntropyLoss辅助损失权重 0.4因此 loss 配置为真实配置见上文 PSPNet 配置文件第 12-15 行loss: types: - type: CrossEntropyLoss coef: [1, 0.4]从 loss_computation 源码还可以看到损失计算的两条规则供自定义 loss 时参考每个 loss 计算结果会乘以coef[i]即loss_list.append(coef_i * loss_i(logits, labels))框架对特殊 loss 类有专门分支MixedLoss会展开为多个损失项KLLoss直接使用logits_list[0]与logits_list[1].detach()蒸馏场景BCELoss且edge_labelTrue时以 edge 图作为标签。自定义 loss 若需要类似的多输入或标签替换行为需要在此处兼容否则按标准loss_i(logits, labels)双参数调用。三、添加一个新损失函数A New Loss3.1 标准四步流程假设实现NewLoss放在new_loss.pyimport paddle.nn as nn from paddleseg.cvlibs import manager manager.LOSSES.add_component class NewLoss(nn.Layer): def __init__(self, param1, ignore_index255): pass def forward(self, x): passStep 1将new_loss.py放到 paddleseg/models/losses/ 目录下。Step 2在 loss 类上方添加manager.LOSSES.add_component装饰器。Step 3在 paddleseg/models/losses/__init__.py 中导入from .new_loss import NewLossStep 4在 YAML 中指定 lossloss: types: - type: NewLoss param1: ... coef: [1]3.2 损失函数的接口约定框架内置的 CrossEntropyLoss 展示了标准 loss 的构造参数与forward签名约定构造参数常见项weight每类权重长度须等于类别数、ignore_index255忽略标签值不贡献梯度、top_k_percent_pixels难像素挖掘只对 top k 百分比像素计损失、avg_non_ignore是否只对非忽略像素取平均、data_formatNCHW/NHWCforward(self, logit, label, semantic_weightsNone)logit形状为(N, C, D1, ..., Dk)label为(N, D1, ..., Dk)semantic_weights是与 label 同形的逐像素权重可选。自定义 loss 建议保持该签名因为loss_computation默认即以loss_i(logits, labels)方式调用。内置损失清单可从 losses/__init__.py 查看包括CrossEntropyLoss、DistillCrossEntropyLoss、LovaszSoftmaxLoss、LovaszHingeLoss、OhemCrossEntropyLoss、DiceLoss、BCELoss、FocalLoss、KLLoss、RMILoss、MaskFormerLoss等约 20 种编写新 loss 前可先确认是否已有可用实现。四、添加一个新 Transform数据增强4.1 标准流程只需三步与模型不同Transform 是可调用对象而非 nn.Layer 子类且直接写在一个既有文件里因此无需新建文件与导入manager.TRANSFORMS.add_component class NewTrans(nn.Layer): def __init__(self, param1): pass def __call__(self, im, labelNone): ... if label is None: return (im, ) else: return (im, label)Step 1在 paddleseg/transforms/transforms.py 中定义NewTrans类。该文件已包含十余个内置 transform均以manager.TRANSFORMS.add_component注册文件内可检索到大量该装饰器使用点。Step 2添加manager.TRANSFORMS.add_component装饰器至此完成注册——文档特别强调 “Thats all”因为 transforms 模块被整体导入无需在\_\_init\_\_.py中追加导入语句。Step 3在 YAML 的数据集transforms列表中使用train_dataset: transforms: - type: NewTrans param1: ...文档同时建议为保持可读性具体的图像变换运算函数应实现在 paddleseg/transforms/functional.py 中transform 类只做参数管理与编排。4.2 接口约定自定义 transform 的__call__需返回元组无标签时返回(im, )有标签时返回(im, label)。框架 DataLoader 依赖该约定把增强结果重新组装为{img: ..., label: ...}字典送入模型。五、添加一个新 Backbone主干网络5.1 标准四步流程import paddle.nn as nn from paddleseg.cvlibs import manager manager.BACKBONES.add_component class NewBackbone(nn.Layer): def __init__(self, param1): pass def forward(self, x): passStep 1将new_backbone.py放到 paddleseg/models/backbones/ 目录下。Step 2在 backbone 类上方添加manager.BACKBONES.add_component。Step 3在 paddleseg/models/backbones/__init__.py 中导入from .new_backbone import NewBackboneStep 4在 YAML 的model.backbone子配置中指定model: backbone: type: NewBackbone param1: ...5.2 与分割头的对接约定从源码结构看PaddleSeg 的 backbone 需要满足两个约定才能被上层分割模型使用一是forward返回多个 stage 的特征列表分割头按backbone_indices取值如 PSPNet 的backbone_indices(2, 3)二是暴露feat_channels属性供分割头在 pspnet.py 中以backbone.feat_channels[i]查询各 stage 通道数。编写自定义 backbone 时建议遵循同样约定这样可直接复用仓库内已有的分割头配置模式。六、添加一个新 Dataset数据集6.1 标准四步流程from paddleseg..dataset import Dataset from paddleseg.cvlibs import manager manager.DATASETS.add_component class NewData(Dataset): def __init__(self, dataset_rootNone, transformsNone, modetrain): passStep 1将new_data.py放到 paddleseg/datasets/ 目录下。Step 2在数据集类上方添加manager.DATASETS.add_component装饰器。Step 3在 paddleseg/datasets/__init__.py 中导入from .new_data import NewDataStep 4在 YAML 中指定数据集原文此处写作 “Specify the backbone name”实为笔误应为 dataset nametrain_dataset: type: NewData dataset_root: ... mode: train6.2 接口约定自定义数据集类应继承paddleseg.datasets中的基类Dataset构造参数约定为dataset_root数据根目录、transforms由 YAMLtransforms列表实例化后注入的增强链、modetrain/val。实现__getitem__时返回与 DataLoader 约定一致的字典结构如{img: ..., label: ...}框架训练循环即从data[img]、data[label]取数见 paddleseg/core/train.py。七、五类组件扩展流程速查表组件类型注册容器代码放置位置是否需补充 importYAML 挂载点接口关键约定Modelmanager.MODELSpaddleseg/models/xxx.py是paddleseg/models/__init__.pymodel.typeforward返回 logits可为列表Lossmanager.LOSSESpaddleseg/models/losses/xxx.py是losses/__init__.pyloss.types[]forward(logit, label, semantic_weightsNone)Transformmanager.TRANSFORMSpaddleseg/transforms/transforms.py否train_dataset.transforms[]__call__(im, labelNone)返回元组Backbonemanager.BACKBONESpaddleseg/models/backbones/xxx.py是backbones/__init__.pymodel.backbone.type多 stage 特征输出 feat_channelsDatasetmanager.DATASETSpaddleseg/datasets/xxx.py是datasets/__init__.pytrain_dataset.type继承基类Datasetdataset_root/transforms/mode常见问题排查YAML 中type填错报KeyErrorComponentManager.__getitem__的报错信息会列出该容器当前所有已注册组件名xxx does not exist in availabel ...据此核对类名拼写同时确认对应的__init__.py已完成 import未 import 则类定义根本没执行、组件未注册。多输出模型报2 ! 1损失长度错误按 2.3 节所述loss.types列表长度必须与模型forward返回的 logits 列表长度一致coef长度需为 1 或与types等长。同名组件被静默覆盖自定义类与内置类同名时注册会发出exists already警告并用新类覆盖可用于“打补丁”式替换内置实现但应尽量避免意外重名。八、小结PaddleSeg 的组件扩展体系以 ComponentManager 为核心装饰器注册、类名作键、YAML 按名实例化三类组件Model/Loss/Backbone/Dataset遵循“放文件—加装饰器—补 import—写 YAML”的四步流程Transform 因集中定义在 transforms.py 而只需两步。自定义组件只要遵循各自forward/__call__/__getitem__的接口约定尤其是 logits 列表与 loss 配置长度对齐即可无缝接入 tools/train.py、tools/val.py 等标准训练评估流程无需改动框架核心代码。赞分享人工智能计算机视觉预训练【免费下载链接】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项目扩展指南如何添加自定义模型组件PaddleSeg项目扩展指南如何添加自定义模型组件 前言 PaddleSeg作为一款优秀的图像分割开发套件其强大的可扩展性让开发者能够轻松集成自定义组件。人工智能计算机视觉预训练MMDetection 模型自定义完全指南从 Backbone 到 Loss 的五类组件扩展实战MMDetection 模型自定义完全指南从 Backbone 到 Loss 的五类组件扩展实战 本文是 MMDetection 模型自定义Customiz人工智能计算机视觉深度学习模型评测MMDetection 自定义模型完全指南从 Backbone 到 Loss 的五类组件扩展实战MMDetection 自定义模型完全指南从 Backbone 到 Loss 的五类组件扩展实战 本篇技术指南以 MMDetection 的组件化设计为主线人工智能计算机视觉深度学习模型评测上一篇disposable-email-domains的数据库性能调优索引设计与查询优化下一篇Earthworm 游戏化连词成句开源英语练习场十分钟本地跑起来创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

内蒙联通E900V21D盒子刷Armbian完整指南,让盒子变成7×24小时家庭Linux服务器 2026/9/25 4:04:35

内蒙联通E900V21D盒子刷Armbian完整指南,让盒子变成7×24小时家庭Linux服务器

内蒙联通E900V21D盒子刷Armbian完整指南,让盒子变成724小时家庭Linux服务器 【免费下载链接】amlogic-s9xxx-armbian Supports running Armbian on Amlogic, Allwinner, and Rockchip devices. Support a311d, s922x, s905x3, s905x2, s912, s905d, s905x, s905w, s…

阅读更多 →
Icecream Ebook Reader评测:回归专注的本地电子书阅读体验 2026/9/25 4:04:35

Icecream Ebook Reader评测:回归专注的本地电子书阅读体验

1. 从一次“反向折腾”说起:为什么我换回了本地阅读器我先坦白一件事:过去几年我几乎把主流阅读App装了个遍。手机里躺着三四个“书城”,每个都声称自己拥有海量资源和智能推荐,但用下来却越来越不对劲。打开App要先看开屏广告&am…

阅读更多 →
自研综合网络安全扫描工具:从端口探测到指纹识别源码解析 2026/9/25 4:04:35

自研综合网络安全扫描工具:从端口探测到指纹识别源码解析

简介:一份基于Python3开发的多功能网络安全扫描工具源码,面向安全测试人员、甲方自测团队及网络安全学习者,适用于敏感文件探测、WAF/CDN识别、端口扫描、服务识别、操作系统识别、弱口令检测、漏洞扫描、绕过CDN及旁站查询等授权安全评估场景…

阅读更多 →
从空字段日期标题到内容补全:信息稀疏下的创作方法论 2026/9/25 4:04:29

从空字段日期标题到内容补全:信息稀疏下的创作方法论

1. 先别急着查“历史上的今天”:把孤立的日期当线索,而不是答案接手这个任务时,我面前的输入只有一个:标题是“2026-01-08”,项目正文、关键词、摘要描述、热搜词、网络热词全为空。放在真实的创作场景里,这…

阅读更多 →
你的微服务网关还只在用负载均衡吗?TaoToken 统一 Key 接入与流量管控配置骨架 2026/9/25 4:04:23

你的微服务网关还只在用负载均衡吗?TaoToken 统一 Key 接入与流量管控配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
javascript-state-machine 版本演进与升级指南:从 1.0 到 3.1 的特性全景、破坏性变更与源码印证 2026/9/25 4:04:17

javascript-state-machine 版本演进与升级指南:从 1.0 到 3.1 的特性全景、破坏性变更与源码印证

开发工具 【免费下载链接】javascript-state-machine A javascript finite state machine library 项目地址: https://gitcode.com/gh_mirrors/ja/javascript-state-machine 点击查看 免费下载 本文以 RELEASE_NOTES.md 为骨架,完整梳理 javascript-sta…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉