PaddleDetection 中的 FCOS 全卷积单阶段检测器:模型配置、训练调优与源码原理解析
人工智能深度学习计算机视觉【免费下载链接】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点击查看免费下载FCOSFully Convolutional One-Stage Object Detection是一种无锚框anchor-free的单阶段目标检测算法通过逐像素pixel-wise预测分类与回归目标省去了锚框设计与超参数调优的负担。本指南以 PaddleDetection 仓库中 configs/fcos/README.md 为骨架结合 配置目录 下的全部真实配置文件与 ppdet/modeling/heads/fcos_head.py、ppdet/modeling/losses/fcos_loss.py、ppdet/data/transform/batch_operators.py 中的源码实现系统讲解 FCOS 在 PaddleDetection 中的模型结构、COCO 模型库与精度、配置逐项拆解、训练/评估/推理全流程以及 iou 质量分支、DCN、多尺度训练、SSLD 预训练等进阶调优方案。读完本文你将能够独立复现官方 FCOS 基线并在此基础上按需组合精度增强技巧。1 FCOS 在 PaddleDetection 中的定位与整体结构FCOS 将目标检测视为逐点per-pixel的稠密预测问题对 FPN 输出的每一层特征图上的每个位置直接回归该点到目标框四边的距离l、t、r、b 四维并预测类别与 centerness中心度分数再通过后处理阈值过滤 NMS得到最终检测框。在 PaddleDetection 中FCOS 的完整结构由 configs/fcos/base/fcos_r50_fpn.yml 定义其组成如下architecture: FCOS pretrain_weights: https://paddledet.bj.bcebos.com/models/pretrained/ResNet50_cos_pretrained.pdparams FCOS: backbone: ResNet neck: FPN fcos_head: FCOSHeadarchitecture指定整体架构为FCOS对应 ppdet/modeling/architectures/fcos.py 中的装配逻辑backboneResNet默认 ResNet50variantbneckFPN负责将骨干网络多尺度特征融合并补充 P5 以上的高层级特征fcos_headFCOSHead即 FCOS 特有的检测头在 ppdet/modeling/heads/fcos_head.py 中实现。1.1 从源码看 FCOSHead 的组成FCOSHead由__inject__ [fcos_feat, fcos_loss, nms]注入三个子模块见 fcos_head.pyFCOSFeat分类与回归两个共享 tower。默认每个 tower 由 4 个3x3卷积组成num_convs: 4卷积后接 ReLU 激活norm_type: gn表示使用 GroupNormuse_dcn可控制是否在 tower 中启用可变形卷积见 fcos_head.py分类/回归输出层fcos_head_cls输出num_classes通道的分类 logits其 bias 初始化为-log((1-prior_prob)/prior_prob)prior_prob: 0.01用于缓解正负样本严重不均衡导致的训练初期不稳定见 fcos_head.pyfcos_head_reg输出 4 维回归目标fcos_head_centerness输出 1 维 centerness或 iou质量分数FCOSLoss分类用 Focal Loss回归用 IoU 系列损失默认 GIoU质量分支默认用 centerness 计算损失见 fcos_loss.pyMultiClassNMSNMS 后处理配置在 fcos_r50_fpn.yml。2 COCO 模型库与精度对照configs/fcos/README.md 给出了 PaddleDetection 官方在 COCO train2017 上训练、COCO val2017 上评估的 FCOS 系列模型结果推理环境Tesla V100每卡 2 张图骨架网络网络类型每张GPU图片个数学习率策略推理时间(fps)Box APResNet50-FPNFCOS21x----39.6ResNet50-FPNFCOS iou21x----40.0ResNet50-FPNFCOS DCN21x----44.3ResNet50-FPNFCOS multiscale_train22x----41.8ResNet50-FPNFCOS multiscale_train iou22x----42.6各配置对应的完整配置文件为FCOS 基线fcos_r50_fpn_1x_coco.ymlFCOS ioufcos_r50_fpn_iou_1x_coco.ymlFCOS DCNfcos_dcn_r50_fpn_1x_coco.ymlFCOS 多尺度训练fcos_r50_fpn_multiscale_2x_coco.ymlFCOS 多尺度训练 ioufcos_r50_fpn_iou_multiscale_2x_coco.yml从上表可以看出三个关键趋势iou 质量分支替代 centerness 可带来约 0.4 AP 的提升DCN可变形卷积是提升最大的单项技巧基线 39.6 直接提升到 44.3 AP4.7代价是推理速度与显存开销**多尺度训练2x 调度**在 1x 基础上额外带来约 2 AP 的提升且可与 iou 分支叠加。需要注意上表推理时间(fps)在原文档中未给出具体数值说明官方未在当前模型库中公布该批模型的实测 fps实际推理速度与硬件、输入尺寸、批大小强相关不应引用未经验证的数值。3 配置文件逐项拆解FCOS 系列配置采用 PaddleDetection 的_BASE_继承机制以 fcos_r50_fpn_1x_coco.yml 为例_BASE_: [ ../datasets/coco_detection.yml, ../runtime.yml, _base_/fcos_r50_fpn.yml, _base_/optimizer_1x.yml, _base_/fcos_reader.yml, ] weights: output/fcos_r50_fpn_1x_coco/model_final继承链说明configs/datasets/coco_detection.ymlCOCO 数据集路径、类别数80与 train/val 标注configs/runtime.yml训练轮次快照、日志、VisualDL 等运行时配置base/fcos_r50_fpn.ymlFCOS 模型结构backbone/neck/head/损失/NMSbase/optimizer_1x.yml1x12 epoch学习率调度与优化器base/fcos_reader.yml数据读取与预处理流水线。weights指定训练完成后保存的模型路径model_final训练结束后在output目录下生成。3.1 骨干网络与 FPN模型结构基座base/fcos_r50_fpn.yml 中 backbone 与 neck 配置如下ResNet: depth: 50 variant: b norm_type: bn freeze_at: 0 # res2 return_idx: [1, 2, 3] num_stages: 4 FPN: out_channel: 256 spatial_scales: [0.125, 0.0625, 0.03125] extra_stage: 2 has_extra_convs: True use_c5: False要点解析freeze_at: 0默认不冻结任何 stage# res2注释提示若需冻结可将值设为 1return_idx: [1, 2, 3]返回 ResNet 第 2、3、4 个 stage 的特征图对应下采样 8x/16x/32x即spatial_scales: [0.125, 0.0625, 0.03125]extra_stage: 2在 P5 之上再额外生成 P664x stride与 P7128x stride两层特征与fpn_stride: [8, 16, 32, 64, 128]对应has_extra_convs: True额外层级使用 1x1 卷积降维并参与上采样融合保证特征一致性use_c5: False不直接使用 C5 作为 P5而是从 C4 上采样得到 P5原版 FCOS 的做法。3.2 FCOSHead检测头细节FCOSHead: fcos_feat: name: FCOSFeat feat_in: 256 feat_out: 256 num_convs: 4 norm_type: gn use_dcn: False fpn_stride: [8, 16, 32, 64, 128] prior_prob: 0.01 norm_reg_targets: True centerness_on_reg: True num_shift: 0.5 fcos_loss: name: FCOSLoss loss_alpha: 0.25 loss_gamma: 2.0 iou_loss_type: giou reg_weights: 1.0 nms: name: MultiClassNMS nms_top_k: 1000 keep_top_k: 100 score_threshold: 0.025 nms_threshold: 0.6各参数含义与作用参数默认值说明fcos_feat.num_convs4分类/回归 tower 的卷积层数越大感受野与容量越大、显存开销越高fcos_feat.norm_typegntower 内归一化方式FCOS 原论文使用 GroupNorm分组数为 32fcos_feat.use_dcnFalse是否在 tower 中使用可变形卷积fpn_stride[8,16,32,64,128]五层特征对应的下采样倍数prior_prob0.01分类层 bias 初始化依据缓解类别不平衡norm_reg_targetsTrue回归目标按 stride 归一化后再训练centerness_on_regTruecenterness 分支挂在回归 tower 上而非分类 towernum_shift0.5特征点相对图像左上角的偏移量半个像素Gt2FCOSTarget._compute_points中以shift stride * num_shift计算采样点位置见 batch_operators.pyfcos_loss.loss_alpha0.25Focal Loss 的 alpha 平衡因子fcos_loss.loss_gamma2.0Focal Loss 的 gamma 聚焦参数fcos_loss.iou_loss_typegiou回归损失类型源码支持linear_iou/giou/iou见 fcos_loss.pyfcos_loss.reg_weights1.0回归损失的权重系数nms.nms_top_k1000NMS 前每个类别保留的最高分框数nms.keep_top_k100NMS 后每张图最终保留的框数上限nms.score_threshold0.025分数阈值低于该值的框直接丢弃nms.nms_threshold0.6NMS 的 IoU 阈值值得说明的是FCOS 的回归目标在Gt2FCOSTarget中生成。该算子见 batch_operators.py通过object_sizes_boundary构造各层级的感兴趣目标尺寸区间[-1, 64]、[64, 128]、[128, 256]、[256, 512]、[512, inf)将不同大小的目标分配给不同 stride 的特征层center_sampling_radius: 1.5表示仅在目标中心 1.5 倍 stride 范围内采样正样本这是 FCOS 降低低质量预测框的关键设计。3.3 数据读取与预处理Reader 配置base/fcos_reader.yml 定义了训练/评估/测试三套数据流水线worker_num: 2 TrainReader: sample_transforms: - Decode: {} - Resize: {target_size: [800, 1333], keep_ratio: True, interp: 1} - NormalizeImage: {mean: [0.485, 0.456, 0.406], std: [0.229, 0.224, 0.225], is_scale: True} - RandomFlip: {} batch_transforms: - Permute: {} - PadBatch: {pad_to_stride: 128} - Gt2FCOSTarget: object_sizes_boundary: [64, 128, 256, 512] center_sampling_radius: 1.5 downsample_ratios: [8, 16, 32, 64, 128] norm_reg_targets: True batch_size: 2 shuffle: True drop_last: True use_shared_memory: True关键点训练输入尺寸Resize: {target_size: [800, 1333], keep_ratio: True}表示短边缩放到 800、长边不超过 1333保持宽高比归一化使用 ImageNet 统计的 mean/std0.485,0.456,0.406/0.229,0.224,0.225is_scale: True表示除以 255PadBatch 对齐pad_to_stride: 128将 batch 内图像 padding 到 128 的整数倍与五层特征最大 stride 128 对齐保证特征图尺寸整数化而fcos_r50_fpn_iou_1x_coco.yml中该值改为 32可显著节省 padding 带来的显存与计算开销Gt2FCOSTarget在 batch 维度为每个采样点生成分类标签、回归目标与中心度标签downsample_ratios必须与fcos_feat.fpn_stride保持一致EvalReader / TestReader均不包含RandomFlip与Gt2FCOSTarget测试时fuse_normalize: True将归一化融合进模型中便于导出推理。3.4 优化器与学习率1x 与 2x 调度base/optimizer_1x.yml 定义了 1x12 epoch调度epoch: 12 LearningRate: base_lr: 0.01 schedulers: - !PiecewiseDecay gamma: 0.1 milestones: [8, 11] - !LinearWarmup start_factor: 0.3333333333333333 steps: 500 OptimizerBuilder: optimizer: momentum: 0.9 type: Momentum regularizer: factor: 0.0001 type: L2要点base_lr: 0.01是适配8 卡训练的学习率若改用单卡训练应相应缩小学习率官方建议除以 8否则容易发散前 500 步线性 warmup起始系数 1/3在第 8 与第 11 个 epoch 各衰减 0.1 倍优化器为带 0.9 动量的 Momentum配合 0.0001 的 L2 权重衰减。多尺度训练配置 fcos_r50_fpn_multiscale_2x_coco.yml 将调度改为 2x24 epochmilestones: [16, 22]同时把训练Resize替换为多尺度随机采样- RandomResize: {target_size: [[640, 1333], [672, 1333], [704, 1333], [736, 1333], [768, 1333], [800, 1333]], keep_ratio: True, interp: 1}即短边在 640~800 之间按 32 像素步长随机取值增强模型对尺度变化的鲁棒性。注意评估/推理仍使用固定 800x1333 输入保证与官方精度可比。4 实战训练、评估与推理以下命令均基于 PaddleDetection 官方安装流程参考 INSTALL_cn.md在项目根目录下执行。当前仓库中该系列配置均以 COCO 数据集为前提训练前需先按 configs/datasets/coco_detection.yml 中的路径放置好数据可通过 dataset/coco/download_coco.py 下载。4.1 训练单卡训练 FCOS 基线export CUDA_VISIBLE_DEVICES0 python tools/train.py -c configs/fcos/fcos_r50_fpn_1x_coco.yml多卡训练8 卡与官方学习率匹配export CUDA_VISIBLE_DEVICES0,1,2,3,4,5,6,7 python -m paddle.distributed.launch --gpus 0,1,2,3,4,5,6,7 tools/train.py -c configs/fcos/fcos_r50_fpn_1x_coco.yml常用参数-o命令行覆盖配置项例如-o LearningRate.base_lr0.00125适配单卡训练-r output/fcos_r50_fpn_1x_coco/10000从指定 checkpoint 恢复训练--eval边训练边评估评估在每个 epoch 结束后进行最优 mAP 模型保存到best_model目录--use_vdlTrue --vdl_log_dirvdl_dir/scalar开启 VisualDL 可视化训练曲线与 mAP 趋势。4.2 评估使用官方预训练权重评估也可替换为本地weightsoutput/fcos_r50_fpn_1x_coco/model_finalexport CUDA_VISIBLE_DEVICES0 python tools/eval.py -c configs/fcos/fcos_r50_fpn_1x_coco.yml \ -o weightshttps://paddledet.bj.bcebos.com/models/fcos_r50_fpn_1x_coco.pdparams如需输出 COCO 格式的 json 结果文件可追加--json_eval结果文件须命名为bbox.json或mask.json。评估默认加载配置中weights指定的最后一轮模型。4.3 推理对单张图片推理python tools/infer.py -c configs/fcos/fcos_r50_fpn_1x_coco.yml \ --infer_imgdemo/000000014439.jpg \ -o weightshttps://paddledet.bj.bcebos.com/models/fcos_r50_fpn_1x_coco.pdparams常用参数--infer_dir对目录下所有图片批量推理--output_dirinfer_output/指定结果输出目录--draw_threshold0.5可视化时仅绘制分数高于该阈值的框注意与配置中 NMS 的score_threshold是两回事--use_vdlTrue推理结果可通过 VisualDL 查看。5 进阶调优iou 质量分支、DCN 与 SSLD 预训练5.1 iou 质量分支FCOS iou原版 FCOS 使用 centerness中心度作为质量分数训练时对质量分数计算 BCE 损失。PaddleDetection 提供的quality: iou变体见 fcos_r50_fpn_iou_1x_coco.yml改为使用预测框与真值框的 IoU作为质量分支的学习目标使质量分数与最终框定位质量直接对齐从而在 NMS 阶段更准确地排序候选框FCOSHead: fcos_loss: name: FCOSLoss loss_alpha: 0.25 loss_gamma: 2.0 iou_loss_type: giou reg_weights: 1.0 quality: iou # default centerness从源码看FCOSLoss构造函数中quality参数默认值为centerness当设为iou时质量分支的监督信号由 centerness 切换为 IoU见 fcos_loss.py。官方 1x 配置下该改动带来约 0.4 AP 的提升且几乎不增加计算量是性价比最高的单项优化。5.2 可变形卷积FCOS DCNfcos_dcn_r50_fpn_1x_coco.yml 仅通过两处增量开启 DCNResNet: dcn_v2_stages: [1, 2, 3] FCOSHead: fcos_feat: use_dcn: Truedcn_v2_stages: [1, 2, 3]在 ResNet 的第 2~4 个 stage索引 1、2、3的 3x3 卷积上替换为 DCNv2use_dcn: True同时在 FCOS 分类/回归 tower 的卷积中启用 DCN。DCN 通过可学习的偏移量让卷积核自适应目标几何形变官方结果从 39.6 提升到 44.3 AP但会明显增加显存占用与计算量部署前需结合实际硬件评估。5.3 SSLD 预训练权重R50-vd 方案原 README 特别提示PaddleDetection 默认使用R50-vb预训练ResNet50_cos_pretrained.pdparams见 fcos_r50_fpn.yml。如果改用R50-vd结合 SSLD 蒸馏预训练模型可进一步显著提升检测精度同时需要同步修改 backbone 配置pretrain_weights: https://paddledet.bj.bcebos.com/models/pretrained/ResNet50_vd_ssld_v2_pretrained.pdparams ResNet: depth: 50 variant: d norm_type: bn freeze_at: 0 return_idx: [1, 2, 3] num_stages: 4 lr_mult_list: [0.05, 0.05, 0.1, 0.15]其中variant: d将骨干切换为 ResNet-vd 结构lr_mult_list按 stage 设置不同的学习率倍率浅层更小、深层更大这是迁移 SSLD 预训练权重时的推荐做法。关于 SSLD 预训练模型与精度收益的完整说明可参考 docs/feature_models/SSLD_PRETRAINED_MODEL.md。5.4 组合策略multiscale_train ioufcos_r50_fpn_iou_multiscale_2x_coco.yml 将多尺度训练2x与 iou 质量分支组合达到 42.6 AP为当前模型库中不含 DCN精度最高的配置。其与 multiscale 单变体的差异仅在quality: iou与PadBatch.pad_to_stride: 32说明各增强技巧可自由叠加用户可按精度/速度权衡自由组合。6 半监督扩展与引用6.1 基于 FCOS 的半监督检测DenseTeacher原 README 指出基于 FCOS 的半监督检测方法DenseTeacher可以直接复用 configs/semi_det/denseteacher 下的配置利用无标签数据进一步提升检测性能。该目录提供了以 FCOS 系列为检测头基于FCOSHead_ARSL等扩展见 ppdet/modeling/heads/fcos_head.py的半监督训练方案适合标注数据不足、但拥有大量无标注数据的场景。6.2 引用若在学术工作中使用 FCOS请引用原论文ICCV 2019inproceedings{tian2019fcos, title {{FCOS}: Fully Convolutional One-Stage Object Detection}, author {Tian, Zhi and Shen, Chunhua and Chen, Hao and He, Tong}, booktitle {Proc. Int. Conf. Computer Vision (ICCV)}, year {2019} }7 关键文件索引用途路径FCOS 模型库总览本文主文档configs/fcos/README.mdFCOS 模型结构基座configs/fcos/base/fcos_r50_fpn.yml数据读取与预处理configs/fcos/base/fcos_reader.yml1x 优化器与学习率configs/fcos/base/optimizer_1x.ymlFCOS 基线配置configs/fcos/fcos_r50_fpn_1x_coco.ymlFCOS iou 配置configs/fcos/fcos_r50_fpn_iou_1x_coco.ymlFCOS DCN 配置configs/fcos/fcos_dcn_r50_fpn_1x_coco.ymlFCOS 多尺度训练配置configs/fcos/fcos_r50_fpn_multiscale_2x_coco.ymlFCOS 多尺度 iou 配置configs/fcos/fcos_r50_fpn_iou_multiscale_2x_coco.yml检测头源码ppdet/modeling/heads/fcos_head.py损失函数源码ppdet/modeling/losses/fcos_loss.py标签生成算子源码ppdet/data/transform/batch_operators.py半监督 DenseTeacher 配置configs/semi_det/denseteacherSSLD 预训练模型说明docs/feature_models/SSLD_PRETRAINED_MODEL.md使用入门指南训练/评估/推理通用命令docs/tutorials/GETTING_STARTED_cn.md赞分享人工智能深度学习计算机视觉【免费下载链接】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 中的 TOOD 任务对齐单阶段检测器原理、配置与训练实战PaddleDetection 中的 TOOD 任务对齐单阶段检测器原理、配置与训练实战 导读 TOODTask aligned One stage Obj人工智能深度学习计算机视觉如何快速掌握FCOS完全卷积单阶段目标检测器从安装到实战的完整指南如何快速掌握FCOS完全卷积单阶段目标检测器从安装到实战的完整指南 FCOSFully Convolutional One Stage Object DetPaddleDetection 半监督检测 ARSL-FCOS原理、配置与训练实战指南PaddleDetection 半监督检测 ARSL FCOS原理、配置与训练实战指南 ARSLAmbiguity Resistant Semi Super人工智能深度学习计算机视觉创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考