十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

PaddleDetection Faster R-CNN 系列模型参数配置详解:以 faster_rcnn_r50_fpn_1x_coco.yml 为例

PaddleDetection Faster R-CNN 系列模型参数配置详解:以 faster_rcnn_r50_fpn_1x_coco.yml 为例 PaddleDetection Faster R-CNN 系列模型参数配置详解以 faster_rcnn_r50_fpn_1x_coco.yml 为例【免费下载链接】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 仓库中的 faster_rcnn_r50_fpn_1x_coco.yml 为主线逐层拆解 Faster R-CNN 系列模型完整的参数配置体系。通过阅读本文你将掌握该配置文件通过_BASE_机制聚合的五个子配置文件数据、优化器、数据读取、模型结构、运行时的每个字段含义与取值依据理解 ResNet-FPN 骨干、RPN 候选框生成、RoI 分类回归等模块的配置与源码对应关系并能够独立修改配置以适配自己的数据集与训练任务。一、配置文件的总体结构与_BASE_继承机制Faster R-CNN 的完整训练配置并非写在一个文件里而是通过_BASE_字段继承五个子配置组成。主文件 faster_rcnn_r50_fpn_1x_coco.yml 内容如下_BASE_: [ ../datasets/coco_detection.yml, ../runtime.yml, _base_/optimizer_1x.yml, _base_/faster_rcnn_r50_fpn.yml, _base_/faster_fpn_reader.yml, ] weights: output/faster_rcnn_r50_fpn_1x_coco/model_final其中五个子配置文件分别承担不同职责子配置文件仓库相对路径职责数据配置coco_detection.yml数据集类型、类别数、训练/评估/测试数据路径优化器配置optimizer_1x.yml训练总 epoch、学习率调度、优化器与正则化数据读取配置faster_fpn_reader.yml数据增强变换、批大小、读取进程数模型结构配置faster_rcnn_r50_fpn.yml骨干网络、FPN、RPN、检测头与后处理运行时配置runtime.yml设备选择、日志间隔、模型保存策略_BASE_支持列表形式的多文件继承子配置中的字段会被合并进最终配置主文件中的字段如weights优先级更高可覆盖子配置中的同名项。weights指定训练结束后输出权重的保存路径注意model_final是无扩展名的路径前缀实际保存时仓库会追加.pdparams、.pdopt等后缀。这种主文件 多个 base 文件的组织方式使不同实验如更换 backbone、调整 reader只需新建一个几行的主文件即可复用公共配置这正是 PaddleDetection 大量模型共享_base_子目录配置的原因例如 mask_rcnn、cascade_rcnn 等系列均采用同样的结构。二、数据配置文件coco_detection.yml数据配置定义训练、评估、测试三套数据集对应文件为 coco_detection.ymlmetric: COCO num_classes: 80 TrainDataset: name: COCODataSet image_dir: train2017 anno_path: annotations/instances_train2017.json dataset_dir: dataset/coco data_fields: [image, gt_bbox, gt_class, is_crowd] EvalDataset: name: COCODataSet image_dir: val2017 anno_path: annotations/instances_val2017.json dataset_dir: dataset/coco allow_empty: true TestDataset: name: ImageFolder anno_path: annotations/instances_val2017.json dataset_dir: dataset/coco关键字段说明metric: COCO评估指标类型PaddleDetection 使用 COCO 官方的 mAP 评估协议实现见 ppdet/metrics/coco_utils.py。num_classes: 80数据集类别数COCO 检测任务为 80 类。该值会被模型结构中的检测头共享源码中BBoxHead通过__shared__ [num_classes, ...]机制自动注入该值见 ppdet/modeling/heads/bbox_head.py。TrainDataset训练数据集。dataset_dir是数据根目录image_dir与anno_path均为相对于dataset_dir的路径实际拼接为os.path.join(dataset_dir, image_dir)与os.path.join(dataset_dir, anno_path)。data_fields声明加载到样本中的字段训练阶段至少需要image图像、gt_bbox真实框、gt_class类别、is_crowd是否群体标注。EvalDataset评估数据集allow_empty: true允许出现无标注的图像避免评估中断。TestDataset测试/推理数据集使用ImageFolder类型直接读取文件夹下的所有图片进行推理anno_path仅作为辅助标注路径同样支持 VOC 的label_list.txt形式。关于数据集的下载与组织方式可参考仓库 dataset/coco/download_coco.py 与 docs/tutorials/data 目录下的数据准备文档。三、优化器配置文件optimizer_1x.yml训练超参数集中在 optimizer_1x.ymlepoch: 12 LearningRate: base_lr: 0.01 schedulers: - !PiecewiseDecay gamma: 0.1 milestones: [8, 11] - !LinearWarmup start_factor: 0.1 steps: 1000 OptimizerBuilder: optimizer: momentum: 0.9 type: Momentum regularizer: factor: 0.0001 type: L2逐项解读epoch: 12总训练轮数这也是文件名中1x的由来1x 表示 12 epoch 的训练计划。LearningRate.base_lr: 0.01基础学习率。注释明确说明该值是默认 8 卡 GPU 训练的学习率若改变 GPU 卡数通常需要按线性缩放规则调整如 4 卡可设为 0.005单卡设为 0.00125。!PiecewiseDecay分段衰减调度器milestones: [8, 11]表示在第 8、11 个 epoch 结束时学习率乘以gamma: 0.1即训练过程中学习率依次变为 0.001、0.0001。!LinearWarmup线性预热start_factor: 0.1表示从base_lr * 0.1 0.001开始steps: 1000表示在 1000 步内线性增长到完整学习率。预热可以稳定训练初期。OptimizerBuilder优化器构建器。type: Momentum使用带动量的 SGDmomentum: 0.9regularizer配置权重衰减type: L2、factor: 0.0001即常用的 L2 正则weight decay 1e-4。这些调度器与优化器均由 ppdet/optimizer 目录下的实现注册通过!类名语法从配置实例化。上述默认参数组合Momentum 0.9 L2 1e-4 分段衰减 线性预热是目标检测训练的标准配置也可在 ppdet/optimizer/optimizers.py 与 ppdet/optimizer/regularizer.py 中查阅更多可用类型如 Adam、CosineDecay 等以便自定义。四、数据读取配置文件faster_fpn_reader.yml数据读取与增强配置定义在 faster_fpn_reader.yml包含TrainReader、EvalReader、TestReader三组worker_num: 2 TrainReader: sample_transforms: - Decode: {} - RandomResize: {target_size: [[640, 1333], [672, 1333], [704, 1333], [736, 1333], [768, 1333], [800, 1333]], interp: 2, keep_ratio: True} - RandomFlip: {prob: 0.5} - NormalizeImage: {is_scale: true, mean: [0.485,0.456,0.406], std: [0.229, 0.224,0.225]} - Permute: {} batch_transforms: - PadBatch: {pad_to_stride: 32} batch_size: 1 shuffle: true drop_last: true collate_batch: false EvalReader: sample_transforms: - Decode: {} - Resize: {interp: 2, target_size: [800, 1333], keep_ratio: True} - NormalizeImage: {is_scale: true, mean: [0.485,0.456,0.406], std: [0.229, 0.224,0.225]} - Permute: {} batch_transforms: - PadBatch: {pad_to_stride: 32} batch_size: 1 shuffle: false drop_last: false TestReader: sample_transforms: - Decode: {} - Resize: {interp: 2, target_size: [800, 1333], keep_ratio: True} - NormalizeImage: {is_scale: true, mean: [0.485,0.456,0.406], std: [0.229, 0.224,0.225]} - Permute: {} batch_transforms: - PadBatch: {pad_to_stride: 32} batch_size: 1 shuffle: false drop_last: false关键点worker_num: 2每个 GPU 上数据读取的子进程数增大可加快数据加载但会占用更多内存。训练增强TrainReaderRandomResize多尺度随机缩放。target_size给出了 6 组候选尺寸短边 640800长边固定 1333每个样本随机选取一组keep_ratio: True保持长宽比缩放interp: 2为双线性插值对应 OpenCVINTER_LINEAR。多尺度训练是 Faster R-CNN 在 COCO 上取得更好精度的关键技巧。RandomFlip以prob: 0.5概率随机水平翻转。NormalizeImage图像归一化is_scale: true表示先除以 255 将像素值缩放到 [0,1]再按 ImageNet 统计均值[0.485,0.456,0.406]与方差[0.229,0.224,0.225]标准化。Permute将 HWC 布局转为 CHW满足 Paddle 张量格式要求。PadBatchpad_to_stride: 32将 batch 内图像 padding 到 32 的整数倍——由于 FPN 的 stride 为 32从 stride 4 到 stride 64 的金字塔保证特征图对齐这是pad_to_stride必须为 32 的底层原因。batch_size: 1、shuffle: true、drop_last: true批大小 1、打乱训练数据、丢弃无法凑整 batch 的尾部数据。collate_batch: false关闭 batch 合并后GT 以List[Tensor]序列形式提供给模型即每个样本独立一个 TensorFaster R-CNN 这类需要逐图 RoI 采样的模型依赖此设置。评估与测试读取器EvalReader / TestReader增强链固定为单尺度Resize短边 800、长边 1333不翻转、不打乱、不丢弃数据保证评估结果可复现。训练与评估增强差异的合理性在于评估时希望以固定分辨率衡量模型能力多尺度与翻转会引入不确定性。这些变换算子Decode、RandomResize、PadBatch等的实现在 ppdet/data/transform 目录RandomResize的多尺度逻辑可在 ppdet/data/transform/ops.py 中查看。五、模型结构配置文件faster_rcnn_r50_fpn.yml这是配置体系的核心完整定义了 Faster R-CNN 的每个组件对应 faster_rcnn_r50_fpn.yml。5.1 整体架构architecture: FasterRCNN pretrain_weights: https://paddledet.bj.bcebos.com/models/pretrained/ResNet50_cos_pretrained.pdparams FasterRCNN: backbone: ResNet neck: FPN rpn_head: RPNHead bbox_head: BBoxHead bbox_post_process: BBoxPostProcessarchitecture: FasterRCNN指定整体架构运行时框架据此创建模型。FasterRCNN类的实现在 ppdet/modeling/architectures/faster_rcnn.py其from_config方法会按配置依次create出 backbone、neck、rpn_head、bbox_head见 faster_rcnn.py而bbox_post_process通过__inject__注入。pretrain_weights骨干网络的预训练权重地址ResNet50 在 ImageNet 上的预训练参数。首次训练时框架会下载该权重用于初始化。FasterRCNN下的五个子模块共同构成完整前向流程backbone 提取特征 → FPN 构建多尺度特征金字塔 → RPN 生成候选框proposal→ BBoxHead 对 RoI 做分类与回归 → BBoxPostProcess 解码并执行 NMS 得到最终检测结果。这一调用链对应_forward方法faster_rcnn.py训练时返回 RPN loss 与 bbox loss预测时经bbox_post_process解码并缩放回原图坐标。5.2 骨干网络 ResNetResNet: depth: 50 norm_type: bn freeze_at: 0 return_idx: [0,1,2,3] num_stages: 4depth: 50ResNet 层数50 表示 ResNet50对应 res2res5 四个阶段。norm_type: bn归一化类型可选bnBatchNorm或sync_bn同步批归一化多卡训练时推荐。freeze_at: 0冻结阶段索引0 表示不冻结任何层索引从 res2 开始计数若设为 2 则冻结前两个阶段。return_idx: [0,1,2,3]返回 4 个阶段的特征图供 FPN 使用FPN 需要多尺度输入。num_stages: 4骨干共 4 个阶段res2、res3、res4、res5。5.3 特征金字塔 FPNFPN: out_channel: 256out_channel: 256指定 FPN 每层输出通道数C2C5 经 1x1 卷积统一到 256 通道并做自上而下融合再生成 P2P5 特征层同时由 P5 下采样得到 P6 供 RPN 使用。return_idx: [0,1,2,3]返回的 4 层特征正是 FPN 的输入。5.4 RPN 候选框生成RPNHeadRPNHead: anchor_generator: aspect_ratios: [0.5, 1.0, 2.0] anchor_sizes: [[32], [64], [128], [256], [512]] strides: [4, 8, 16, 32, 64] rpn_target_assign: batch_size_per_im: 256 fg_fraction: 0.5 negative_overlap: 0.3 positive_overlap: 0.7 use_random: True train_proposal: min_size: 0.0 nms_thresh: 0.7 pre_nms_top_n: 2000 post_nms_top_n: 1000 topk_after_collect: True test_proposal: min_size: 0.0 nms_thresh: 0.7 pre_nms_top_n: 1000 post_nms_top_n: 1000anchor_generator锚框生成器实现见 ppdet/modeling/proposal_generator/anchor_generator.py。strides: [4, 8, 16, 32, 64]对应 5 个特征层每个像素的步长anchor_sizes为每层的基准尺寸32/64/128/256/512逐层对应 stride×8 的惯例aspect_ratios: [0.5, 1.0, 2.0]为每个位置的 3 种宽高比。综合起来每个特征位置生成 3 个锚框共 5 个尺度层级。rpn_target_assignRPN 正负样本分配。每张图采样batch_size_per_im: 256个锚框其中前景比例fg_fraction: 0.5即 128 正、128 负与 GT 的 IoU 大于positive_overlap: 0.7为正样本小于negative_overlap: 0.3为负样本介于两者之间忽略use_random: True允许随机采样。train_proposal/test_proposal候选框生成参数。nms_thresh: 0.7为 proposal NMS 阈值训练时pre_nms_top_n: 2000、post_nms_top_n: 1000NMS 前后各保留 2000/1000 个评估时收敛为 1000/1000min_size: 0.0不限制最小框尺寸topk_after_collect: True表示在跨 batch 汇总后再取 top-k。RPNHead类的定义见 ppdet/modeling/proposal_generator/rpn_head.py。5.5 检测头BBoxHead 与 TwoFCHeadBBoxHead: head: TwoFCHead roi_extractor: resolution: 7 sampling_ratio: 0 aligned: True bbox_assigner: BBoxAssigner TwoFCHead: out_channel: 1024head: TwoFCHeadRoI 分类/回归头采用经典的两层全连接结构实现见 ppdet/modeling/heads/bbox_head.pyout_channel: 1024为每层 FC 的输出维度。roi_extractorRoI Align 配置。resolution: 7将每个 RoI 池化为 7×7 特征图sampling_ratio: 0表示由实现自动决定采样点通常为自适应aligned: True启用 RoI Align 的像素对齐offset 修正相比 RoI Pooling 提升小目标定位精度。bbox_assigner: BBoxAssigner为 RoI 分配训练标签正负样本参数见下节。5.6 样本分配BBoxAssignerBBoxAssigner: batch_size_per_im: 512 bg_thresh: 0.5 fg_thresh: 0.5 fg_fraction: 0.25 use_random: Truebatch_size_per_im: 512每张图采样 512 个 RoI 参与训练。fg_thresh: 0.5/bg_thresh: 0.5与某个 GT 的 IoU 大于 0.5 判定为正样本前景与所有 GT 的 IoU 都小于 0.5 判定为背景fg_fraction: 0.25限制正样本最多占 25%即 128 个正样本、384 个负样本缓解正负样本不平衡。use_random: True在候选池中随机采样以满足上述数量与比例。5.7 后处理BBoxPostProcessBBoxPostProcess: decode: RCNNBox nms: name: MultiClassNMS keep_top_k: 100 score_threshold: 0.05 nms_threshold: 0.5decode: RCNNBox将检测头输出的回归增量解码为真实框坐标。nms多类别 NMS。name: MultiClassNMS表示按类别分别执行 NMSnms_threshold: 0.5为 NMS 的 IoU 阈值score_threshold: 0.05过滤置信度低于 0.05 的框keep_top_k: 100每张图最终最多保留 100 个检测框。六、运行时配置文件runtime.yml运行时配置runtime.yml控制训练/评估的执行环境与输出use_gpu: true use_xpu: false use_mlu: false use_npu: false log_iter: 20 save_dir: output snapshot_epoch: 1 print_flops: false print_params: false export: post_process: True nms: True benchmark: False fuse_conv_bn: False设备开关use_gpu、use_xpu、use_mlu、use_npu分别对应 GPU、百度昆仑 XPU、寒武纪 MLU、华为昇腾 NPU同一时刻仅启用一个。log_iter: 20每 20 个 iter 打印一次训练日志loss、学习率等。save_dir: output权重与日志的根输出目录最终权重实际保存在output/模型名/下与主文件weights前缀一致。snapshot_epoch: 1每隔 1 个 epoch 保存一次 checkpoint。print_flops/print_params是否打印模型 FLOPs 与参数量。export模型导出Paddle Inference 格式时的行为post_process: True与nms: True表示导出时把后处理与 NMS 编入网络benchmark: False为性能测试开关置True时导出的模型不含后处理与 NMSfuse_conv_bn: False控制是否融合 Conv-BN 层。七、配置的实际使用训练、评估与推理完成上述五类配置的理解后即可通过命令行工具直接使用该配置。仓库的入口脚本位于 tools 目录# 训练默认 8 卡单卡时需按 5.1 节说明同步下调 base_lr python tools/train.py -c configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.yml # 评估需先完成训练或用 -o 覆盖权重路径 python tools/eval.py -c configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.yml \ -o weightsoutput/faster_rcnn_r50_fpn_1x_coco/model_final # 单张图片推理 python tools/infer.py -c configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.yml \ -o weightsoutput/faster_rcnn_r50_fpn_1x_coco/model_final \ --infer_imgdemo/000000014439.jpg-c指定配置文件-o用于在命令行覆盖配置字段如-o use_gpuTrue、-o LearningRate.base_lr0.00125无需修改文件即可做小规模实验这是_BASE_继承体系之外的另一种灵活覆盖方式。训练入口 tools/train.py 读取配置后创建数据读取器、构建模型、执行训练循环模型权重默认保存在save_dir下以模型名命名的目录中。使用自有数据集时通常只需① 参照 coco_detection.yml 新建数据配置并修改num_classes、路径与metricVOC 数据可参考 voc.yml② 在_BASE_中替换数据配置③ 按需调整 optimizer_1x.yml 中的epoch、milestones与base_lr④ 如需更换骨干网络如 ResNet101直接替换模型子配置即可。八、小结从配置到源码的完整链路本文以 faster_rcnn_r50_fpn_1x_coco.yml 为例完整解析了 PaddleDetection Faster R-CNN 系列的五层配置体系。理解这条链路的关键在于配置即对象图!类名语法让每个配置块直接映射到注册过的 Python 类如!PiecewiseDecay→ 调度器、!COCODataSet→ 数据集、FasterRCNN→ 架构类而_BASE_继承与-o命令行覆盖提供了两种灵活组装配置的方式。当你需要修改任何训练细节时都可以沿着本文的五个子配置定位到对应源码架构在 ppdet/modeling/architectures/faster_rcnn.py、RPN 在 ppdet/modeling/proposal_generator、检测头在 ppdet/modeling/heads/bbox_head.py、数据变换在 ppdet/data/transform实现从改参数到懂原理的完整闭环。【免费下载链接】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创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表