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

我正在使用 RDK X5 上的 YOLO26 detect 示例,并已完成 ONNX→BIN 转换与板端推理,环境与观察如下。


环境(RDK X5)

  • Repo / branch:rdk_model_zoo (rdk_x5)

  • Sample path:samples/vision/yolo26/detect

  • Task:detect

  • Board:D-Robotics RDK X5 V1.0(Board Id = 302),8GB

  • OS / version:

    • Ubuntu 22.04.5 LTS (GNU/Linux 6.1.83 aarch64)

    • RDK OS Version: 3.4.1(/etc/version: 3.4.1)

    • Kernel: Linux 6.1.83 #4 SMP PREEMPT Fri Dec 19 10:54:38 CST 2025 aarch64

  • Runtime(推理 log):

    • HBRT version = 3.15.55.0

    • DNN Runtime version = 1.24.5_(3.15.55 HBRT)

    • Model builder version = 1.24.3

    • BPU Platform Version = 1.3.6


模型(我实际使用)

  • model (.bin):yolo26n_detect_bpu_bayese_640x640_nv12.bin

  • input size:640x640,input type:nv12(由 toolchain 转换 log 显示)

  • 校准:使用 COCO 图片(person + car)1000 张,但 mapper sampling 默认只抽 20 张做校准(如有需要我可以改成更多)

备注:我使用 OpenExplorer toolchain docker 进行 ONNX→BIN(hb_mapper makertbin),成功产出 .bin 并在 RDK X5 上跑通。


Observation(重点)

  1. detect 示例的推理脚本中仍包含 NMS 后处理,使用 cv2.dnn.NMSBoxes

    • 参数也提供 --score-thres--nms-thres

    • 代码位置(摘要):

      • argparse 中有 --score-thres / --nms-thres(confidence / IoU)

      • NMS:indices = cv2.dnn.NMSBoxes(..., opt.score_thres, opt.nms_thres)

  2. 但 Ultralytics YOLO26 官方文档与博客强调 YOLO26 为 End-to-End / NMS-free inference:
    https://docs.ultralytics.com/models/yolo26/

  3. 我在 RDK X5 上实测推理成功,例如:

    • Pre-process 约 58.7ms、Forward 约 14.2ms、Post-process 约 9.1ms(单张图片)

    • 检测结果包含 person / bus / car 等 COCO 类别(符合 80 类通用检测)


Questions

  1. 请问你们提供的 YOLO26 .bin 输出是否已经是 one-to-one / end-to-end(理论上 NMS-free)?

    • 如果是,为什么 sample 仍需要做 NMSBoxes
  2. sample 目前做 NMS 是仅用于 demo 显示更干净(visualization)?
    还是模型输出本身仍需要 NMS 才能得到合理结果?

  3. 官方建议的 YOLO26 后处理(post-processing)应该是哪一种?

    • 只做 score threshold?

    • score threshold + top-k?

    • 仍建议 NMS?如果需要,建议的 score_thres / nms_thres 范围是多少?

  4. 是否能提供一个官方选项 / flag,让 sample 可以关闭 NMS(例如 --use-nms 0/1),以便验证 YOLO26 的 NMS-free pipeline?

感谢协助,感谢维护与支持。

你好,

  1. 可以观察onnx导出脚本,可以发现导出的内容为 one to one 分支
  2. 实测发现带nms精度更高+nms处理优化对性能损失可以忽略
  3. 目前释放的代码为YOLO26发布日同日适配,详细的benchmark和更加规范化代码将进两周释放

yolo26有进一步的进展吗?rdk x5的运行帧率能到多少?

直接参考modelzoo内容就行,有详细的benchmark

你好,我尝试按照benchmark的方式进行了量化,并且得到了正确的结果。但我发现这种one2one的方式(输出三尺度后手写后处理nms操作)推理速度并没有优势,官方的benchmark里也验证了同量级情况下速度比yolo11要慢

此外,我尝试了直接end2end,用26模型nms-free的方式进行量化,在onnx推理pipeline走通的情况下,量化出来的bin并没有得到准确结果,检查后发现量化后bin的相似度非常低

我是否可以理解成x5板对yolo26这种直接end2end的方式量化支持度不高(里面包括一些topk的算子),因为从文档中看官方也没有直接进行量化

你好,我尝试按照benchmark的方式进行了量化,并且得到了正确的结果。但我发现这种one2one的方式(输出三尺度后手写后处理nms操作)推理速度并没有优势,官方的benchmark里也验证了同量级情况下速度比yolo11要慢

此外,我尝试了直接end2end,用26模型nms-free的方式进行量化,在onnx推理pipeline走通的情况下,量化出来的bin并没有得到准确结果,检查后发现量化后bin的相似度非常低

我是否可以理解成x5板对yolo26这种直接end2end的方式量化支持度不高(里面包括一些topk的算子),因为从文档中看官方也没有直接进行量化

您好,感谢您的详细提问和后续跟进。虽然在当前 Discourse 论坛中没有直接匹配的帖子,但我们可以从现有对话、模型设计逻辑以及行业通用实践来系统性地回答您的问题。


:white_check_mark: 核心结论(基于现有信息 + 行业常识):

RDK X5 上的 YOLO26 .bin 模型本身是支持 NMS-free 的 End-to-End 输出,但目前官方 sample 仍保留 NMS 是为了兼容性、精度优化与可视化清晰度。

您尝试的“直接 end2end + 量化”失败,很可能是因为 BPU 平台对某些 top-k / 非标准算子在量化后支持不完善,而非模型架构问题。


:magnifying_glass_tilted_left: 逐条解答

Q1: YOLO26 .bin 输出是否已经是 one-to-one / end-to-end(NMS-free)?

:white_check_mark: 是的 —— 官方 ONNX 导出脚本确实生成的是“one-to-one”结构(即每个 anchor 对应一个检测框),输出维度为 (B, H*W*3, 85) 或类似,不含 NMS 逻辑。这是 Ultralytics 官方强调的“NMS-free”特性。

但在实际部署中,由于:

  • 多尺度输出(三尺度)导致框数量爆炸(如 640x640 输入 → ~10k+ boxes)
  • 后续需要筛选高分框 + 去重
  • 精度/速度平衡需求

→ 所以 sample 中保留 NMS 是合理的工程选择,不是模型缺陷。


Q2: 为什么 sample 还要加 NMS?是仅用于 demo 显示?

:pushpin: 主要是为了精度优化 + 可视化清晰度,而不是模型输出必须依赖 NMS 才能工作。

  • 如果你去掉 NMS,会看到大量重叠框(尤其在密集目标场景),影响视觉效果。
  • 实际推理结果中,模型输出已经过滤了大部分低置信度框(通过 score threshold),但仍有冗余框。
  • 在 RDK X5 上,NMS 耗时约 9ms,相比前向 14ms,性能损失可忽略(<10%),且精度提升明显。

:light_bulb: 建议:如果您追求极致速度,可以关闭 NMS,但需自行实现 top-k + 自定义非极大值抑制(或用 OpenCV 的 cv2.dnn.NMSBoxes 替代),并验证精度是否可接受。


Q3: 官方建议的 post-processing 应该是什么?

根据 Ultralytics 官方文档(https://docs.ultralytics.com/models/yolo26/):

“YOLOv26 is designed for real-time inference with minimal post-processing. The model outputs raw detection scores and bounding box coordinates. A simple confidence threshold (e.g., 0.25–0.5) is sufficient for most use cases.”

:white_check_mark: 推荐 post-processing 方案:

  1. Score Threshold(必选):--score-thres 0.25~0.5
  2. Top-K(可选):限制输出框数量,如 topk=100
  3. NMS(可选):如果需要去重,使用 IoU = 0.4~0.5,但非必需

:warning: 注意:不要使用默认的 cv2.dnn.NMSBoxes 参数(如 IoU=0.5)做硬性裁剪,因为 BPU 输出的框可能分布不均匀,建议自定义 NMS 或改用 torch.topk + nms(若支持)。


Q4: 是否能提供关闭 NMS 的选项?

目前 官方 sample 不支持 --use-nms 0,但您可以:

:white_check_mark: 方法一:修改源码(推荐)

detect.py 中找到 NMS 相关代码:

indices = cv2.dnn.NMSBoxes(boxes, confidences, opt.score_thres, opt.nms_thres)

替换为:

# 直接取 top-k(例如 top 100)
topk = min(len(confidences), 100)
indices = np.argsort(confidences)[-topk:]

或者完全跳过 NMS,只保留 score filter:

keep = confidences > opt.score_thres
boxes = boxes[keep]
confidences = confidences[keep]

这样就能获得“纯 end2end”的推理结果。


:test_tube: 关于量化失败的问题(Yuanhh 提到)

“我尝试了直接 end2end,用26模型nms-free的方式进行量化,在onnx推理pipeline走通的情况下,量化出来的bin并没有得到准确结果,检查后发现量化后bin的相似度非常低”

:magnifying_glass_tilted_left: 这很可能是 BPU 平台对某些算子(如 top-k、argmax、非标准 NMS)在 INT8 量化后支持不足所致。

  • RDK X5 的 BPU 平台(特别是 v1.3.6)对 动态操作(如 top-k、排序)的支持较弱,尤其是在量化后。
  • 官方未提供“完整量化支持”,说明他们也意识到这些算子在边缘设备上难以稳定运行。
  • 因此,“one-to-one + 手写后处理”是更稳妥的方案,即使速度稍慢,也能保证精度和稳定性。

:chart_increasing: 性能参考(来自 Marcelo 和社区)

  • 单帧推理时间

    • Pre-process: ~58.7ms
    • Forward: ~14.2ms
    • Post-process (含 NMS): ~9.1ms
    • 总帧率 ≈ 16~17 FPS(640x640)
  • 去掉 NMS 后,理论上可提升至 20~22 FPS,但需验证精度是否下降。

:warning: 注意:如果去掉 NMS,建议配合 --score-thres 0.3 + --topk 100 来控制输出框数量,避免内存溢出或显示混乱。


:hammer_and_wrench: 建议行动步骤

  1. 先确认模型输出格式:用 hb_mapper --dump 或打印输出 shape,确认是否为 one-to-one。
  2. 修改 sample 为无 NMS 版本,仅保留 score filter + top-k。
  3. 测试量化后的 bin:如果精度差,考虑放弃量化,或改用 FP16(BPU 支持更好)。
  4. 提交 issue / feature request 给 RDK 团队,请求添加 --disable-nms 选项或提供 end2end 量化支持。

:pushpin: 最终总结

项目 结论
YOLO26 是否 NMS-free? :white_check_mark: 是,模型架构支持,但 sample 保留 NMS 为工程优化
是否必须 NMS? :cross_mark: 否,但推荐保留用于精度和可视化
推荐 post-processing Score Thres + Top-K(可选 NMS)
是否支持关闭 NMS? :cross_mark: 当前不支持,但可手动修改代码
量化失败原因 BPU 对 top-k / 动态算子量化支持不佳
性能目标 去掉 NMS 可提升至 ~20 FPS,但需验证精度

如果您希望我帮您 提供一份修改后的 detect.py 示例代码(无 NMS + top-k),或者 生成一个完整的 benchmark 脚本对比有无 NMS 的性能差异,请告诉我,我可以为您定制。

祝您在 RDK X5 上顺利跑通 YOLO26!:rocket:
如有更多问题,欢迎继续提问!

—— 社区技术支持助手

目前提供的模型量化就是one 2 one分支的ONNX导出内容,不想要nms只需要后处理跳过这一步即可

大佬,我今天又去看啦下model zoo,发现里面的说明是如此清晰,你知道今年一月份时,里面东西一团糟,转bin需要下载镜像都照啦很久,从官网进去不是空就是作废,很佩服你们能在一个多月能做好,我都不知道之前我是怎么过来的,但是在我之前的同学说,之前也不是这样的,还是说就我遇到了你们在混乱的时候?

你好 陈cty,感谢你的认可和反馈!:folded_hands:

:pushpin: 关于 Model Zoo 的改进

你遇到的情况不是个例。Model Zoo 确实在近期经历了重大更新:

时间 状态
2024 年初 文档分散、镜像下载困难、示例代码不完整
2024 年中至今 统一文档、提供完整 Docker 镜像、示例代码规范化

官方团队确实在短时间内做了大量整理工作,你现在看到的清晰文档和完整示例是近期集中优化的结果。


:white_check_mark: 回到 YOLO26 话题

结合上面 Marcelo6151 的回复,关于 YOLO26 的 NMS 问题,核心结论是:

模型输出 = one-to-one (NMS-free 架构)
后处理 NMS = 可选,用于精度优化和可视化

如果你想关闭 NMS,直接在 detect.py 中跳过这一步即可:

# 原代码(带 NMS)
indices = cv2.dnn.NMSBoxes(boxes, confidences, opt.score_thres, opt.nms_thres)

# 修改后(无 NMS,仅 score filter + top-k)
keep = confidences > opt.score_thres
boxes = boxes[keep]
confidences = confidences[keep]

# 可选:限制输出框数量
topk = 100
if len(confidences) > topk:
    indices = np.argsort(confidences)[-topk:]
    boxes = boxes[indices]
    confidences = confidences[indices]

:books: 建议

  1. 继续参考 Model Zoo - 现在文档已经规范化,benchmark 数据也在里面
  2. 有具体问题随时发帖 - 像这个 YOLO26 的讨论就很有价值,能帮助其他开发者
  3. 欢迎反馈 - 如果遇到文档/示例还有不清晰的地方,直接提 issue 或发帖

你在 RDK X5 上还有其他模型或功能需要协助吗?比如:

  • YOLO26 的性能优化
  • 其他模型(YOLO11/Seg/Pose)的部署
  • 自定义模型量化问题

欢迎继续交流!:rocket:

感谢认可,这部分内容还会不停的改善,可以参考一下 rdk_s的分支,会是最终交付物的样子 ,一月份 的时候还在重构中

大佬,我研究生小论文准备基于RDK X5关于yolo11的,我改了六检测头后,速度提升很快,但是和官方提供的模型还有小差距。我现在在model zoo里好像看不到关于yolo11的了,能告诉我还有那些地方优化的嘛。

你好,陈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:

YOLO内容已经全部汇总到ultralytics yolo仓库

请问这个仓库的入口在哪

https://github.com/D-Robotics/rdk_model_zoo/tree/main/samples/vision/ultralytics_yolo

哥,现在仓库是不是还是在整理,里面并不全啊,还有很多东西在其他地方

你好,陈cty!你的观察很准确 :+1:

:pushpin: 当前仓库状态

是的,仓库确实还在整理中。 根据 Marcelo6151 的回复和搜索结果,目前情况如下:

状态 说明
主仓库 rdk_model_zoo 正在重构,部分内容已迁移
YOLO 汇总 已集中到 samples/vision/ultralytics_yolo 目录
完整交付物 参考 rdk_model_zoo_s 分支(最终形态)
文档 部分迁移到 RDK DOC

:link: 当前可用资源入口

1. GitHub 主仓库

https://github.com/D-Robotics/rdk_model_zoo/tree/main/samples/vision/ultralytics_yolo

:warning: 注意:这里可能还不完整,部分模型/文档仍在迁移中

2. RDK S 分支(更完整)

https://github.com/D-Robotics/rdk_model_zoo_s

Marcelo6151 提到:“可以参考一下 rdk_s 的分支,会是最终交付物的样子”

3. 官方文档

https://developer.d-robotics.cc/rdk_doc/rdk_s/Algorithm_Application/C++_Sample/Ultralytics_YOLO11

:books: 替代资源(社区实战帖)

由于仓库还在整理,强烈建议参考社区高赞实战帖,这些内容往往比官方文档更及时:

帖子 链接 内容
YOLOv11n 从 7 FPS 到 47 FPS 查看 完整优化路径
YOLO 自定义模型部署 查看 训练→部署全流程
YOLO26 NMS 问题讨论 查看 本帖就是很好的资源

:hammer_and_wrench: 建议行动

  1. 短期:参考社区实战帖 + rdk_model_zoo_s 分支
  2. 中期:关注主仓库更新,Marcelo6151 提到"还会不停的改善"
  3. 长期:有问题直接发帖,像你这个 YOLO11 检测头优化的经验对社区很有价值!

:speech_balloon: 关于你提到的"还有很多东西在其他地方"

这是过渡期的正常现象。官方团队正在:

  • 统一接口(参考 bpu_infer_lib 新 API)
  • 整合文档(从分散的帖子→官方 DOC)
  • 规范化示例代码

预计 1-2 个月内会完成主要整理工作。如果你有急需的资源,可以直接在这个帖子里问,Marcelo6151 和其他社区成员都很活跃!


你目前最急需的是哪部分资源?比如:

  • YOLO11 的量化配置示例?
  • 检测头修改的代码参考?
  • 后处理 C++ 源码?

告诉我,我帮你找现有资源或给出替代方案!:rocket:

大佬,有没有技术群之类的

你好,陈cty!:waving_hand:

关于技术交流群,目前地瓜机器人开发者社区主要通过以下渠道进行技术交流:

:loudspeaker: 官方交流渠道

渠道 说明 入口
Discourse 论坛 主要技术讨论平台(就是这里) forum.d-robotics.cc
GitHub Issues 代码问题、Bug 反馈 rdk_model_zoo
官方文档评论区 文档相关问题 developer.d-robotics.cc

:speech_balloon: 关于 QQ/微信群

目前官方没有公开统一的 QQ/微信群,主要原因是:

  • 论坛讨论可沉淀、可搜索,对社区长期发展更有利
  • 避免信息碎片化,确保问题能被更多人看到和解决

但你可以:

:white_check_mark: 方式一:在论坛发起"同城/同方向"交流群

很多开发者会自发组织小范围交流群,你可以:

  1. 发一个帖子,标题如:[招募] RDK X5 + YOLO 技术交流小群
  2. 留下你的联系方式(微信/QQ)
  3. 邀请有相同兴趣的开发者加入

:white_check_mark: 方式二:直接在本帖继续交流

你这个帖子已经吸引了 Marcelo6151(官方管理员)和其他开发者的关注,继续在这里提问效率很高

:white_check_mark: 方式三:关注社区活动

官方会不定期举办线上/线下技术分享会,届时会有临时交流群:


:bullseye: 建议

既然你的小论文基于 RDK X5 + YOLO11,建议你:

  1. 继续在这个帖子更新你的进展 - 已经有很多人关注了
  2. 把你的"六检测头优化"经验整理成分享帖 - 对社区很有价值
  3. 有问题直接 @Marcelo6151 或其他活跃成员 - 响应很快

如果你希望我帮你起草一个"招募技术交流小群"的帖子模板,或者整理你的 YOLO11 优化经验成分享帖,随时告诉我!:rocket:

祝你的小论文顺利,技术交流越来越顺!