Files
RoRD-Layout-Recognation/docs/description/Backbone_FPN_Test_Change_Notes.md
2025-10-20 13:35:13 +08:00

4.2 KiB
Raw Permalink Blame History

测试修改说明 — RoRD 多骨干 FPN 支持与基准脚本

最后更新2025-10-20 作者:项目自动化助手

概述

本次修改面向「模型架构Backbone 与 FPN」的工程化完善目标是在不破坏现有接口的前提下支持更现代的骨干网络并提供可复现的基准测试脚本。

包含内容:

  • 修复并重构 models/rord.py 的初始化与 FPN 逻辑,支持三种骨干:vgg16resnet34efficientnet_b0
  • 新增 A/B 基准脚本 tests/benchmark_backbones.py,比较不同骨干在单尺度与 FPN 前向的耗时与显存占用。
  • 为 FPN 输出添加「真实下采样步幅stride」标注避免坐标还原误差。

兼容性:

  • 公共接口未变,RoRD 的前向签名保持不变(return_pyramid 开关控制是否走 FPN
  • 默认配置仍为 vgg16,单尺度路径保持与原基线一致(处理到 relu4_3stride≈8

代码变更

  • models/rord.py
    • 修复配置解析、骨干构建、FPN 模块初始化的缩进与作用域问题。
    • 新增:按骨干类型提取中间层 C2/C3/C4VGG: relu2_2/3_3/4_3ResNet34: layer2/3/4Eff-B0: features[2]/[3]/[6])。
    • 新增FPN 输出携带每层 stride相对输入
    • 注意:非 VGG 场景下不再访问 self.features(避免未定义错误)。
  • tests/benchmark_backbones.py
    • 新增:单文件基准工具,可在相同输入下对比三种骨干在单尺度与 FPN 的推理耗时ms与显存占用MB
  • configs/base_config.yaml
    • 已存在/确认字段:
      • model.backbone.name: vgg16 | resnet34 | efficientnet_b0
      • model.backbone.pretrained: true/false
      • model.attention(默认关闭,可选 cbam/se

FPN 下采样步幅说明(按骨干)

  • vgg16P2/P3/P4 对应 stride ≈ 2 / 4 / 8
  • resnet34P2/P3/P4 对应 stride ≈ 8 / 16 / 32
  • efficientnet_b0P2/P3/P4 对应 stride ≈ 4 / 8 / 32

说明stride 用于将特征图坐标映射回原图坐标,match.py 中的坐标还原与 NMS 逻辑可直接使用返回的 stride 值。

快速验证Smoke Test

以下为在 1×3×256×256 随机张量上前向的形状验证(节选):

  • vgg16 单尺度det [1, 1, 32, 32]desc [1, 128, 32, 32]
  • vgg16 FPN
    • P4: [1, 1, 32, 32]stride 8
    • P3: [1, 1, 64, 64]stride 4
    • P2: [1, 1, 128, 128]stride 2
  • resnet34 FPN
    • P4: [1, 1, 8, 8]stride 32
    • P3: [1, 1, 16, 16]stride 16
    • P2: [1, 1, 32, 32]stride 8
  • efficientnet_b0 FPN
    • P4: [1, 1, 8, 8]stride 32
    • P3: [1, 1, 32, 32]stride 8
    • P2: [1, 1, 64, 64]stride 4

以上输出与各骨干的下采样规律一致,说明中间层选择与 FPN 融合逻辑正确。

如何运行基准测试

  • 环境准备(一次性):已在项目 pyproject.toml 中声明依赖(含 torchtorchvisionpsutil)。
  • 骨干 A/B 基准:
    • CPU 示例:
      uv run python tests/benchmark_backbones.py --device cpu --image-size 512 --runs 5
      
    • CUDA 示例:
      uv run python tests/benchmark_backbones.py --device cuda --runs 20 --backbones vgg16 resnet34 efficientnet_b0
      
  • FPN vs 滑窗对标(需版图/模板与模型权重):
    uv run python tests/benchmark_fpn.py \
      --layout /path/to/layout.png \
      --template /path/to/template.png \
      --num-runs 5 \
      --config configs/base_config.yaml \
      --model_path /path/to/weights.pth \
      --device cuda
    

影响评估与回滚

  • 影响范围:
    • 推理路径单尺度不变FPN 路径新增多骨干支持与 stride 标注。
    • 训练/评估:头部输入通道通过 1×1 适配(内部已处理),无需额外修改。
  • 回滚策略:
    • model.backbone.name 设回 vgg16,或在推理时设置 return_pyramid=False 走单尺度路径。

后续建议

  • EfficientNet 中间层可进一步调研(如 features[3]/[4]/[6] 组合)以兼顾精度与速度。
  • 增补单元测试:对三种骨干的 P2/P3/P4 输出形状和 stride 进行断言CPU 可运行,避免依赖数据集)。
  • 将 A/B 基准结果沉淀至 docs/Performance_Benchmark.md,用于跟踪优化趋势。