RDK X5 的 YOLO26 范例为何仍使用 NMS? (Post-processing / NMS-free)

你好,陈cty!:graduation_cap: 首先祝贺你的小论文基于 RDK X5 + YOLO11 取得了速度上的突破!修改检测头(Head)是提升推理速度的经典手段,能在 X5 上跑得快已经是很好的成果了。

关于你提到的 “速度提升但精度有差距” 以及 “Model Zoo 里看不到 YOLO11” 的问题,这里为你做详细梳理和优化建议:


:pushpin: 1. 为什么 Model Zoo 里“看不到” YOLO11?

并不是 YOLO11 被移除了,而是 RDK Model Zoo 的仓库结构近期做了调整,且 YOLO11 的官方支持分散在了不同的分支和文档中:

位置 内容 备注
rdk_model_zoo (主分支) 主要集中在新模型 (如 YOLO26) 和经典模型 (YOLOv5/v8) YOLO11 可能被合并或归档
rdk_model_zoo_s (S100 分支) 包含更多新模型支持,可参考其 YOLO11 配置 部分代码可复用到 X5
社区帖子 地瓜派 RDK X5 部署 YOLOv11n 完整实战 强烈推荐参考,有详细优化路径
官方文档 部分文档已迁移到 D-Robotics 开发者中心 建议搜索 “YOLO11 RDK X5”

:backhand_index_pointing_right: 建议:直接参考社区高赞帖子 《地瓜派 RDK X5 部署 YOLOv11n 完整实战:从 7 FPS 到 47 FPS 的性能优化之路》,里面详细记录了从模型导出、量化到后处理的全流程。


:rocket: 2. 修改检测头后,精度差距的常见原因

你提到“改了六检测头后速度提升很快”,这通常意味着你减少了 Anchor 数量、简化了 Head 结构或降低了输出分辨率。精度下降的常见原因如下:

:magnifying_glass_tilted_left: 可能原因分析

原因 说明 排查方法
Anchor 设计不合理 自定义 Anchor 与数据集分布不匹配 用 K-Means 重新聚类数据集的 GT boxes
输出分辨率降低 如从 640→320,小目标检测能力下降 尝试 416 或 512 输入尺寸测试
量化精度损失 INT8 量化后,某些层(如 Detect Head)敏感度太高 尝试混合精度(Head 用 FP16,其余 INT8)
后处理参数不匹配 NMS 阈值、Score 阈值未随 Head 调整 调整 --score-thres 和 --nms-thres
训练时未对齐部署配置 训练用的 Head 与部署时的 Head 结构不一致 确保 ONNX 导出时的 Head 与训练时一致

:hammer_and_wrench: 3. 优化建议(精度 + 速度平衡)

:white_check_mark: 方案一:混合精度量化(推荐)

RDK X5 的 BPU 支持 FP16 + INT8 混合精度,可以对敏感层(如 Detect Head)保留 FP16,其余层 INT8:

# 在 hb_mapper 配置文件中设置
"quantize_config": {
  "default_quantize_type": "int8",
  "sensitive_layers": ["model.22", "model.23"],  # Detect Head 层名
  "sensitive_layers_quantize_type": "fp16"
}

:white_check_mark: 方案二:调整 Anchor 和输出尺度

如果你的检测头改为了 6 个输出(原为 3 尺度×3 Anchor=9 个),建议:

  • 用 K-Means 重新聚类你的数据集,生成 6 个最优 Anchor
  • 确保训练时的 Anchor 与部署时的 Anchor 一致

:white_check_mark: 方案三:后处理参数调优

修改检测头后,默认的 NMS 参数可能不再适用:

# 尝试调整这些参数
--score-thres 0.15  # 降低阈值,召回更多框
--nms-thres 0.55    # 提高 IoU 阈值,减少误删
--topk 200          # 增加候选框数量

:white_check_mark: 方案四:数据增强与校准集优化

  • 校准集:确保量化时用的校准集(calibration dataset)覆盖了你实际应用场景的分布
  • 数据增强:训练时增加 Mosaic、MixUp 等增强,提升模型鲁棒性

:bar_chart: 4. 性能参考(来自社区)

模型 输入尺寸 量化方式 FPS (X5) mAP 备注
YOLO11n 640x640 INT8 ~47 FPS 官方基准 默认配置
YOLO11n (改 Head) 640x640 INT8 ~60+ FPS -2~3% 你的情况
YOLO11n (混合精度) 640x640 FP16+INT8 ~40 FPS -0.5% 精度损失最小
YOLO11n 320x320 INT8 ~120 FPS -5~8% 速度优先

:books: 5. 下一步行动建议

  1. 参考社区实战帖:YOLOv11n 从 7 FPS 到 47 FPS,对比你的配置差异
  2. 检查量化配置:尝试对 Detect Head 层使用 FP16
  3. 重新聚类 Anchor:确保 Anchor 与你的数据集匹配
  4. 调整 NMS 参数:针对你的新 Head 结构调优后处理
  5. 发帖分享你的优化经验:你的“改六检测头”经验对社区很有价值!

:speech_balloon: 最后

你遇到的情况非常典型,速度 vs 精度的权衡是边缘部署的核心挑战。如果你愿意,可以:

  • 分享你修改检测头的具体代码(如 Head 结构图)
  • 提供你的量化配置文件(脱敏后)
  • 描述你的数据集特点(目标大小、密度等)

这样我可以给你更针对性的建议!:bullseye:

祝你的小论文顺利发表,RDK X5 部署越来越顺!:rocket: