PaddleDetection 新增模型算法实战:从 Backbone 到配置文件的完整建模指南

发布时间:2026/9/23 3:32:50
PaddleDetection 新增模型算法实战:从 Backbone 到配置文件的完整建模指南 人工智能深度学习计算机视觉【免费下载链接】PaddleDetectionObject Detection toolkit based on PaddlePaddle. It supports object detection, instance segmentation, multiple object tracking and real-time multi-person keypoint detection.项目地址https://gitcode.com/gh_mirrors/pa/PaddleDetection点击查看免费下载本指南以 PaddleDetection 官方新增模型教程为骨架系统讲解在该框架中新增一个检测模型所需的全部技术环节如何按组件化规范注册并实现 Backbone、Neck、Head、Loss、后处理与 Architecture以及如何通过 YAML 配置将各组件组装成可训练的完整模型。文中所有代码与配置均取自当前仓库源码读者可按步骤自行搭建出 YOLOv3 乃至任意自定义检测网络。1. 概览PaddleDetection 的模型组织方式PaddleDetection 中每一种模型对应一个文件夹以 YOLOv3 为例yolov3 系列的模型对应configs/yolov3文件夹。其中 yolov3_darknet 的总配置文件configs/yolov3/yolov3_darknet53_270e_coco.yml的内容如下_BASE_: [ ../datasets/coco_detection.yml, # 数据集配置文件所有模型共用 ../runtime.yml, # 运行时相关配置 _base_/optimizer_270e.yml, # 优化器相关配置 _base_/yolov3_darknet53.yml, # yolov3网络结构配置文件 _base_/yolov3_reader.yml, # yolov3 Reader模块配置 ] # 定义在此处的相关配置可以覆盖上述文件中的同名配置 snapshot_epoch: 5 weights: output/yolov3_darknet53_270e_coco/model_final从上面的配置可以看出配置文件中的模块进行了清晰的划分除了公共的数据集配置datasets/coco_detection.yml以及运行时配置runtime.yml其他配置被划分为优化器optimizer_270e.yml、网络结构yolov3_darknet53.yml以及 Reader 模块yolov3_reader.yml三大部分。PaddleDetection 中支持丰富的优化器、学习率调整策略、预处理算子等因此大多数情况下不需要编写优化器以及 Reader 相关的代码而只需要在配置文件中配置即可。因此新增一个模型的主要工作在于搭建网络结构。网络结构的所有代码位于ppdet/modeling/中所有网络结构以组件的形式进行定义与组合。其主要构成如下ppdet/modeling/ ├── architectures │ ├── faster_rcnn.py # Faster Rcnn模型 │ ├── ssd.py # SSD模型 │ ├── yolo.py # YOLOv3模型 │ │ ... ├── heads # 检测头模块 │ ├── xxx_head.py # 定义各类检测头 │ ├── roi_extractor.py #检测感兴趣区域提取 ├── backbones # 基干网络模块 │ ├── resnet.py # ResNet网络 │ ├── mobilenet.py # MobileNet网络 │ │ ... ├── losses # 损失函数模块 │ ├── xxx_loss.py # 定义注册各类loss函数 ├── necks # 特征融合模块 │ ├── xxx_fpn.py # 定义各种FPN模块 ├── proposal_generator # anchor proposal生成与匹配模块 │ ├── anchor_generator.py # anchor生成模块 │ ├── proposal_generator.py # proposal生成模块 │ ├── target.py # anchor proposal的匹配函数 │ ├── target_layer.py # anchor proposal的匹配模块 ├── tests # 单元测试模块 │ ├── test_xxx.py # 对网络中的算子以及模块结构进行单元测试 ├── ops.py # 封装各类PaddlePaddle物体检测相关公共检测组件/算子 ├── layers.py # 封装及注册各类PaddlePaddle物体检测相关公共检测组件/算子 ├── bbox_utils.py # 封装检测框相关的函数 ├── post_process.py # 封装及注册后处理相关模块 ├── shape_spec.py # 定义模块输出shape的类上述目录在当前仓库中均可找到对应实现ppdet/modeling/backbones含 darknet、resnet、mobilenet_v1、csp_darknet 等 30 余个骨干网络、ppdet/modeling/necks含 yolo_fpn、fpn、csp_pan、bifpn 等、ppdet/modeling/heads、ppdet/modeling/losses、ppdet/modeling/architectures、ppdet/modeling/post_process.py等目录结构与上图完全一致。架构总览图下图展示了 PaddleDetection 中数据流 组件化网络的整体模型构建思想即输入经 Backbone 提取多尺度特征、经 Neck 融合、由 Head 产生预测、再经后处理输出最终结果。2. 新增模型接下来以单阶段检测器 YOLOv3 为例对建立模型的过程进行详细描述。按照此思路你可以快速搭建新的模型。整个流程分为两大部分新增网络结构6 类组件与新增配置文件3 类配置。2.1 新增网络结构2.1.1 新增 BackbonePaddleDetection 中现有所有 Backbone 网络代码都放置在ppdet/modeling/backbones目录下真实的darknet.py即位于该目录所以我们仿照其在其中新建darknet.py如下import paddle.nn as nn from ppdet.core.workspace import register, serializable register serializable class DarkNet(nn.Layer): __shared__ [norm_type] def __init__(self, depth53, return_idx[2, 3, 4], norm_typebn, norm_decay0.): super(DarkNet, self).__init__() # 省略内容 def forward(self, inputs): # 省略处理逻辑 pass property def out_shape(self): # 省略内容 pass然后在backbones/__init__.py中加入引用from . import darknet from .darknet import *在仓库的实际实现ppdet/modeling/backbones/darknet.py中DarkNet由ConvBNLayerconv bn activation 组合默认actleaky与DownSample等基础子层堆叠而成forward中按depth依次串联残差块并按return_idx[2, 3, 4]返回三个尺度的特征图最终通过out_shape属性输出各尺度 feature map 的ShapeSpecchannel/stride 信息供后续 Neck 的from_config自动推导输入通道。这些细节可以参照源码深入阅读。几点说明为了在 yaml 配置文件中灵活配置网络所有 Backbone 需要利用ppdet.core.workspace里的register进行注册形式请参考如上示例。此外可以使用serializable使 backbone 支持序列化所有的 Backbone 需继承paddle.nn.Layer类并实现forward函数。此外还需实现out_shape属性定义输出的 feature map 的 channel 信息具体可参见源码__shared__用于实现一些参数的配置全局共享这些参数可以被 backbone、neck、head、loss 等所有注册模块共享。例如 YOLOv3 系列统一在配置顶层声明norm_type: sync_bn各组件无需重复填写。从ppdet/core/workspace.py的register与create源码可以看出register会把类名登记进global_config并抽取其参数 schemaextract_schemacreate在实例化时会先解析shared注解__shared__——若配置中未显式给值则从全局配置读取同名 key如norm_type或使用默认值随后若类存在from_config类方法会优先调用以推导参数最后解析inject注解__inject__注入全局字典中已封装好的模块实例。理解这一机制是看懂整个配置即组装流程的关键。2.1.2 新增 Neck特征融合模块放置在ppdet/modeling/necks目录下真实的yolo_fpn.py即位于该目录我们在其中新建yolo_fpn.py如下import paddle.nn as nn from ppdet.core.workspace import register, serializable register serializable class YOLOv3FPN(nn.Layer): __shared__ [norm_type] def __init__(self, in_channels[256, 512, 1024], norm_typebn): super(YOLOv3FPN, self).__init__() # 省略内容 def forward(self, blocks): # 省略内容 pass classmethod def from_config(cls, cfg, input_shape): # 省略内容 pass property def out_shape(self): # 省略内容 pass然后在necks/__init__.py中加入引用from . import yolo_fpn from .yolo_fpn import *几点说明neck 模块需要使用register进行注册可以使用serializable进行序列化neck 模块需要继承paddle.nn.Layer类并实现forward函数。除此之外还需要实现out_shape属性用于定义输出的 feature map 的 channel 信息还需要实现类函数from_config用于在配置文件中推理出输入 channel并用于YOLOv3FPN的初始化neck 模块可以使用__shared__实现一些参数的配置全局共享。在真实实现ppdet/modeling/necks/yolo_fpn.py中YOLOv3FPN使用YoloDetBlock包含conv_module与tip两个分支输出 route 与 tip 两组特征完成自顶向下的多尺度融合其from_config会结合 backbone 的out_shape自动计算出in_channels这正体现了上一节提到的组件间 channel 自动配置机制。2.1.3 新增 HeadHead 模块全部存放在ppdet/modeling/heads目录下真实的yolo_head.py即位于该目录我们在其中新建yolo_head.py如下import paddle.nn as nn from ppdet.core.workspace import register register class YOLOv3Head(nn.Layer): __shared__ [num_classes] __inject__ [loss] def __init__(self, anchors[[10, 13], [16, 30], [33, 23], [30, 61], [62, 45],[59, 119], [116, 90], [156, 198], [373, 326]], anchor_masks[[6, 7, 8], [3, 4, 5], [0, 1, 2]], num_classes80, lossYOLOv3Loss, iou_awareFalse, iou_aware_factor0.4): super(YOLOv3Head, self).__init__() # 省略内容 def forward(self, feats, targetsNone): # 省略内容 pass然后在heads/__init__.py中加入引用from . import yolo_head from .yolo_head import *几点说明Head 模块需要使用register进行注册Head 模块需要继承paddle.nn.Layer类并实现forward函数__inject__表示引入全局字典中已经封装好的模块如 loss 等。例如lossYOLOv3Loss表示从全局配置中取出已注册的YOLOv3Loss实例注入到 Head 中。2.1.4 新增 LossLoss 模块全部存放在ppdet/modeling/losses目录下真实的yolo_loss.py即位于该目录我们在其中新建yolo_loss.pyimport paddle.nn as nn from ppdet.core.workspace import register register class YOLOv3Loss(nn.Layer): __inject__ [iou_loss, iou_aware_loss] __shared__ [num_classes] def __init__(self, num_classes80, ignore_thresh0.7, label_smoothFalse, downsample[32, 16, 8], scale_x_y1., iou_lossNone, iou_aware_lossNone): super(YOLOv3Loss, self).__init__() # 省略内容 def forward(self, inputs, targets, anchors): # 省略内容 pass然后在losses/__init__.py中加入引用from . import yolo_loss from .yolo_loss import *几点说明loss 模块需要使用register进行注册loss 模块需要继承paddle.nn.Layer类并实现forward函数可以使用__inject__表示引入全局字典中已经封装好的模块使用__shared__可以实现一些参数的配置全局共享。例如ignore_thresh控制负样本忽略阈值downsample[32, 16, 8]对应三个预测尺度的下采样倍数。2.1.5 新增后处理模块后处理模块定义在ppdet/modeling/post_process.py中其中定义了BBoxPostProcess类来进行后处理操作如下所示from ppdet.core.workspace import register register class BBoxPostProcess(object): __shared__ [num_classes] __inject__ [decode, nms] def __init__(self, num_classes80, decodeNone, nmsNone): # 省略内容 pass def __call__(self, head_out, rois, im_shape, scale_factor): # 省略内容 pass几点说明后处理模块需要使用register进行注册__inject__注入了全局字典中封装好的模块如 decode 和 nms 等。decode 和 nms 定义在ppdet/modeling/layers.py中如YOLOBox解码与MultiClassNMS多类别 NMS。2.1.6 新增 Architecture所有 architecture 网络代码都放置在ppdet/modeling/architectures目录下真实的yolo.py、faster_rcnn.py等即位于该目录。meta_arch.py中定义了BaseArch类代码如下import paddle.nn as nn from ppdet.core.workspace import register register class BaseArch(nn.Layer): def __init__(self): super(BaseArch, self).__init__() def forward(self, inputs): self.inputs inputs self.model_arch() if self.training: out self.get_loss() else: out self.get_pred() return out def model_arch(self, ): pass def get_loss(self, ): raise NotImplementedError(Should implement get_loss method!) def get_pred(self, ): raise NotImplementedError(Should implement get_pred method!)对照仓库中真实的ppdet/modeling/architectures/meta_arch.pyBaseArch还额外支持data_formatNCHW/NHWC、use_extra_data、fuse_norm将 Normalize 融合进网络以减少部署算子以及多尺度输入测试merge_multi_scale_predictions当前支持 CascadeRCNN、FasterRCNN、MaskRCNN 的多尺度合并等扩展能力。其核心逻辑不变forward先保存输入、调用model_arch构建前向图训练时走get_loss推理时走get_pred。所有的 architecture 需要继承BaseArch类如yolo.py中的YOLOv3定义如下register class YOLOv3(BaseArch): __category__ architecture __inject__ [post_process] def __init__(self, backboneDarkNet, neckYOLOv3FPN, yolo_headYOLOv3Head, post_processBBoxPostProcess): super(YOLOv3, self).__init__() self.backbone backbone self.neck neck self.yolo_head yolo_head self.post_process post_process classmethod def from_config(cls, cfg, *args, **kwargs): # 省略内容 pass def get_loss(self): # 省略内容 pass def get_pred(self): # 省略内容 pass几点说明所有的 architecture 需要使用register进行注册在组建一个完整的网络时必须要设定__category__ architecture来表示一个完整的物体检测模型backbone、neck、yolo_head 以及 post_process 等检测组件传入到 architecture 中组成最终的网络。像这样将检测模块化提升了检测模型的复用性可以通过组合不同的检测组件得到多个模型from_config类函数实现了模块间组合时 channel 的自动配置即依据各组件注册的out_shape推导下一组件的输入尺寸。2.2 新增配置文件2.2.1 网络结构配置文件上面详细地介绍了如何新增一个 architecture接下来演示如何配置一个模型。yolov3 关于网络结构的配置在configs/yolov3/_base_/文件夹中定义如yolov3_darknet53.yml定义了 yolov3_darknet 的网络结构其定义如下architecture: YOLOv3 pretrain_weights: https://paddledet.bj.bcebos.com/models/pretrained/DarkNet53_pretrained.pdparams norm_type: sync_bn YOLOv3: backbone: DarkNet neck: YOLOv3FPN yolo_head: YOLOv3Head post_process: BBoxPostProcess DarkNet: depth: 53 return_idx: [2, 3, 4] # use default config # YOLOv3FPN: YOLOv3Head: anchors: [[10, 13], [16, 30], [33, 23], [30, 61], [62, 45], [59, 119], [116, 90], [156, 198], [373, 326]] anchor_masks: [[6, 7, 8], [3, 4, 5], [0, 1, 2]] loss: YOLOv3Loss YOLOv3Loss: ignore_thresh: 0.7 downsample: [32, 16, 8] label_smooth: false BBoxPostProcess: decode: name: YOLOBox conf_thresh: 0.005 downsample_ratio: 32 clip_bbox: true nms: name: MultiClassNMS keep_top_k: 100 score_threshold: 0.01 nms_threshold: 0.45 nms_top_k: 1000可以看到在配置文件中首先需要指定网络的architecturepretrain_weights指定训练模型的 url 或者路径norm_type等可以作为全局参数共享对应__shared__机制。模型的定义自上而下依次在文件中定义与上一节的模型组件一一对应。对于一些模型组件如果采用默认的参数可以不用配置如上文中的yolo_fpn配置中将其注释掉即使用YOLOv3FPN的默认参数。通过改变相关配置我们可以轻易地组合出另一个模型比如configs/yolov3/_base_/yolov3_mobilenet_v1.yml将 backbone 从 Darknet 切换成 MobileNet。仓库中configs/yolov3/_base_目录下还提供了yolov3_r34.yml、yolov3_r50vd_dcn.yml、yolov3_mobilenet_v3_large.yml、yolov3_mobilenet_v3_small.yml等多个 backbone 变体都是通过这种换组件的方式实现的充分体现了组件化的复用价值。配置加载机制ppdet/core/workspace.py中的load_config会递归解析_BASE_引用的所有 yaml 并逐层 merge外层配置优先级高于基类配置最终合并进全局配置global_config。训练时由create(YOLOv3)依据各组件 schema 自动实例化完成从配置到网络的组装。2.2.2 优化器配置文件优化器配置文件定义模型使用的优化器以及学习率的调度策略。目前 PaddleDetection 中已经集成了多种多样的优化器和学习率策略具体可参见ppdet/optimizer/optimizer.py其中定义了LearningRate与OptimizerBuilder并实现了CosineDecay等学习率调度器旧版单文件ppdet/optimizer.py的实现已迁移至该目录。比如yolov3 的优化器配置文件定义在configs/yolov3/_base_/optimizer_270e.yml其定义如下epoch: 270 LearningRate: base_lr: 0.001 schedulers: - !PiecewiseDecay gamma: 0.1 milestones: # epoch数目 - 216 - 243 - !LinearWarmup start_factor: 0. steps: 4000 OptimizerBuilder: optimizer: momentum: 0.9 type: Momentum regularizer: factor: 0.0005 type: L2几点说明可以通过OptimizerBuilder.optimizer指定优化器的类型及参数目前支持的优化器可以参考 PaddlePaddle 官方文档paddle.optimizer系列可以设置LearningRate.schedulers设置不同学习率调整策略的组合PaddlePaddle 目前支持多种学习率调整策略。需要注意的是你需要对 PaddlePaddle 中的学习率调整策略进行简单的封装具体可参考源码ppdet/optimizer/optimizer.py。!PiecewiseDecay与!LinearWarmup为 yaml 中通过!标签实例化已注册调度器对象的写法先线性 warmup 4000 步再在 216/243 epoch 处将学习率乘以 0.1 分段衰减。2.2.3 Reader 配置文件关于 Reader 的配置可以参考 Reader 配置文档。此处以configs/yolov3/_base_/yolov3_reader.yml为例简要说明其结构文件顶部设置worker_num数据加载进程数然后分TrainReader、EvalReader、TestReader三段配置每段又分为sample_transforms单样本变换如Decode、Mixup、RandomDistort、RandomCrop、RandomFlip、batch_transforms批变换如BatchRandomResize多尺度训练、NormalizeImage、Gt2YoloTarget将 GT 转换为 YOLOv3 的网格目标以及batch_size、shuffle等数据加载参数。训练时通过Gt2YoloTarget中的anchor_masks、anchors、downsample_ratios与网络结构配置保持一致确保标签编码与模型输出对齐。3. 结语至此您应该对 PaddleDetection 中模型搭建与配置有了一定经验核心方法论是注册组件 配置组装——先用register/serializable将 Backbone、Neck、Head、Loss、后处理、Architecture 六类模块注册进全局字典再通过_BASE_继承与各组件配置块将它们组合成完整模型。结合ppdet/modeling源码与configs/yolov3/_base_下的真实配置阅读会理解得更加透彻。关于模型技术如您有其他问题或建议欢迎反馈。赞分享人工智能深度学习计算机视觉【免费下载链接】PaddleDetectionObject Detection toolkit based on PaddlePaddle. It supports object detection, instance segmentation, multiple object tracking and real-time multi-person keypoint detection.项目地址https://gitcode.com/gh_mirrors/pa/PaddleDetection点击查看免费下载相关推荐MMPose 自定义模型实现指南Backbone、Head 与新算法范式的完整实战MMPose 自定义模型实现指南Backbone、Head 与新算法范式的完整实战 本指南基于 MMPoseOpenMMLab 姿态估计工具箱官方教程系计算机视觉人工智能深度学习GitHub Copilot SDK会话事件40种事件类型的详细解析GitHub Copilot SDK会话事件40种事件类型的详细解析 GitHub Copilot SDK是一款多平台软件开发工具包专为将GitHub C人工智能AI AgentAgent 框架工具调用CLIP模型训练硬件配置从诊断到实战的完整指南CLIP模型训练硬件配置从诊断到实战的完整指南 当您计划训练CLIP模型时是否曾为GPU选择而困惑面对从个人研究到企业部署的不同需求如何精准匹配硬件资源人工智能基础模型大模型多模态计算机视觉创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考