8.5 AI 模型、算法与工具链
工具链问题建议优先使用最新版本。相关下载资源请参考:下载资源汇总
本节主要解答与地瓜机器人 RDK 平台上 AI 模型部署、算法开发、以及算法工具链使用相关的常见疑问。
Q1: 使用算法工具链遇到问题,在提问时需要提供哪些信息?
A: 当您在使用地瓜机器人算法工具链遇到问题并寻求技术支持时,为了帮助快速定位问题,请尽量提供以下完整信息:
- 目标 RDK 硬件平台及处理器架构: 例如 RDK X3 (BPU Bernoulli2), RDK X5 (BPU Bayes-e), Super100 (BPU Nash-e), Super100P (BPU Nash-m)。
- 算法工具链转换环境信息:
horizon_nn包版本 (通过pip list | grep horizon查看)。- Python 版本 (例如 Py3.8, Py3.10)。
- 使用的工具链 Docker 镜像版本(如果使用 Docker)。
- 原始模型文件: 提供您的 ONNX 模型文件(或其他原始格式模型文件)。
- 模型转换相关文件:
- 转换时使用的
yaml配置文件。 - 完整的
hb_mapper make_model_log或类似日志文件 (例如hb_mapper_makertbin_log_*.log)。 - 用于 PTQ 量化的校准数据集(或其生成方法和少量样本)。
- 转换时使用的
- 板端部署相关文件:
- 板端部署的代码片段或完整项目。
- 板端运行时的具体报错信息和日志。
- RDK 板卡的系统版本信息(通过
rdkos_info命令获取)。
- 详细的问题复现步骤: 清晰地描述如何一步步操作才能重现您遇到的问题。
- 预期行为与实际行为: 描述您期望得到的结果以及实际观察到的现象。
注意: 很多常见问题可能在工具链的旧版本中存在,而已在新版本中修复。建议优先使用官方最新发布的 Docker 镜像和工具链版本。
- Docker 镜像下载与挂载参考:
- 如果问题复杂,建议将完整的开发机转换项目、板端部署项目以及详细的错误复现方式,通过网盘等形式分享给技术支持人员。
Q2: 进行 AI 算法开发有哪些推荐的官方资源?
A:
- RDK 用户手册 - 算法工具链章节: 这是最基础也是最重要的参考资料,详细介绍了工具链的安装、使用流程、各项工具的功能和参数等。
- 通用入口:https://developer.d-robotics.cc/rdk_doc/04_toolchain_development (请以官方最新文档为准)
- RDK Model Zoo (模型仓库): 官方提供的模型示例库,包含了多种常见 AI 模型在 RDK 平台上的移植、优化、量化和部署示例代码及教程。
- 地瓜开发者社区 - 资源中心: 社区的资源中心板块通常会汇总各类开发资源,包括工具链、SDK、示例代码、技术文档、教程视频等。
Q3: RDK X3(旭日 X3 派)平台有哪些社区算法资源和工具链手册?
A: 针对 RDK X3 平台的算法开发,可以参考以下 OpenExplorer 社区资源:
- RDK X3 算法工具链社区手册 (OpenExplorer): https://developer.d-robotics.cc/api/v1/fileData/horizon_xj3_open_explorer_cn_doc/index.html
- RDK X3 OpenExplore 产品发布及相关资源帖: https://developer.d-robotics.cc/forumDetail/136488103547258769
Q4: RDK X5 平台有哪些社区算法资源和工具链手册?
A: 针对 RDK X5 平台的算法开发,可以参考以下 OpenExplorer 社区资源:
- RDK X5 算法工具链社区手册 (OpenExplorer): https://developer.d-robotics.cc/api/v1/fileData/x5_doc-v126cn/index.html (请注意文档版本号,以最新为准)
- RDK X5 OpenExplore 产品发布及相关资源帖: https://developer.d-robotics.cc/forumDetail/251934919646096384
Q5: 算法工具链的 Docker 镜像是基于 Ubuntu 20.04 制作的,这会影响转换产物(如.bin 或.hbm 模型文件)在 RDK 板端 Ubuntu 22.04 系统上运行吗?
A: 通常不会影响。
地瓜机器人 OpenExplorer 提供的算法工具链 Docker 镜像虽然可能基于 Ubuntu 20.04 制作,但其主要作用是提供一个隔离的、包含所有必要转换工具和依赖库的模型转换环境。
它生成的模型文件(如.bin用于 PTQ,.hbm用于 QAT)是针对 RDK 板卡上特定 BPU 架构的二进制指令和权重数据。这些模型文件本身与运行它们的 RDK 板卡操作系统的 Ubuntu 版本(无论是 20.04 还是 22.04)是解耦的,只要板卡上的 Runtime 库(如libdnn.so等 BPU 驱动和推理库)与模型转换时使用的工具链版本兼容即可。
Q6: 如何 在 RDK 平台上部署 YOLO 系列模型(如 YOLOv5, YOLOv8, YOLOv10)?
A: 地瓜机器人官方和社区提供了丰富的 YOLO 系列模型在 RDK 平台上的部署教程和示例。
-
YOLOv5 在 RDK X3 平台的部署:
- 全流程部署教程: YOLOv5 在 RDK X3 上的全流程部署
- YOLOv5s 2.0 版本训练与转化: 如果您使用的是 YOLOv5s 的 tag 2.0 版本,可以参考官方工具链入门手册配置开发环境,并参考此博客进行训练和转化:YOLOv5s v2.0 训练与转化博客
- 较高版本 YOLOv5 输出层修改: 如果您使用的是较高版本的 YOLOv5(如 v5.0, v6.0, v7.0 等,其输出层结构与 v2.0 不同),可能需要修改模型的输出层以适配 RDK BPU 的后处理要求。参考博客:高版本 YOLOv5 输出层修改指南
- 板端示例后处理注意: RDK 系统
/app/pydev_demo/07_yolov5_sample中的后处理部分可能直接摘自某个特定版本的训练代码,存在较多冗余计算,主要用于算法验证。对于追求性能的实际部署,建议参考 RDK Model Zoo 中的优化后处理实现。 - 实时视频流检测 (TROS 部署,刷满 30fps): 使用 TROS 快速部署 YOLOv5 刷满 30fps
-
YOLOv8 在 RDK X3 平台的部署:
- Python 多进程刷满 30fps 参考: CSDN 博客 - YOLOv8 RDK X3 部署
-
YOLOv10 在 Bayes 架构平台(如 RDK X5)的部署:
- Python 多线程刷满 30fps 参考: CSDN 博客 - YOLOv10 Bayes 平台部署
-
通用资源: 强烈建议查阅 RDK Model Zoo (https://github.com/D-Robotics/rdk_model_zoo),其中包含了多种 YOLO 版本(及其他主流模型)的官方部署示例、预处理/后处理代码、以及性能优化技巧。
Q7: YOLOv5 部署时遇到 can't reshape xxx in (84,84,3,85) 类似的错误,如何解决?
A: 这个错误通常是由于后处理代码中预设的类别数量 (num_classes) 与您实际模型训练和导出的类别数量不匹配导致的。
例如,85 通常代表 (x, y, w, h, confidence + num_classes),如果您的模型是基于 COCO 数据集(80 类)训练的,那么 num_classes 就是 80,总共是 5 + 80 = 85 个输出通道。如果您训练的是自定义类别数量的模型(例如 10 类),那么这里应该是 5 + 10 = 15。
- 解决方法: 找到您使用的 YOLOv5 后处理代码文件(通常是一个 Python 脚本),修改其中定义的类别数量参数,使其与您模型的实际类别数一致。
- 参考: 上述 YOLOv5s v2.0 训练与转化博客 中可能也包含了相关类别数修改的说明。
Q8: YOLOv5 部署时,检测结果出现数量非常多且不规则的检测框,是什么原因?
A: 这通常是由于 ONNX 模型的输出头结构与板端后处理代码的预期不匹配。
- 可能原因 1:输出头未按 BPU 要求修改。
- 较高版本的 YOLOv5(例如 tag 2.0 以上)官方导出的 ONNX 模型,其输出层可能包含了特征解码部分(例如直接输出检测框坐标和类别得分),或者没有将大、中、小三个特征图的输出分开。
- 地瓜机器人 RDK BPU 部署通常要求 ONNX 模型的输出是原始的特征图,并且这三个特征图是作为独立的输出节点。
- 示例图(上为错误,下为部分正确但仍需调整):
上图:未分离特征图,包含解码。下图:分离了特征图,但可能错误添加了 Sigmoid 或未转 NHWC。
- 解决方法:
- 您需要修改 YOLOv5 的导出脚本(通常是
models/yolo.py或类似文件),确保在导出 ONNX 模型时:- 移除模型末尾的检测头(解码层、NMS 等)。
- 将三个不同尺度的特征图(P3, P4, P5 或对应层)作为独立的输出节点。
- 确保输出的维度顺序符合工具链要求(例如,有时需要从 NCHW 转换为 NHWC)。
- 不要在最终输出层后错误地添加不必要的激活函数(如 Sigmoid),除非后处理代码明确需要。
- 参考教程: 高版本 YOLOv5 输出层修改指南 详细介绍了如何修改。
- 您需要修改 YOLOv5 的导出脚本(通常是