8.5 AI模型、算法与工具链
本节主要解答与地平线RDK平台上AI模型部署、算法开发、以及算法工具链使用相关的常见疑问。
Q1: 使用算法工具链遇到问题,在提问时需要提供哪些信息?
A: 当您在使用地平线算法工具链遇到问题并寻求技术支持时,为了帮助快速定位问题,请尽量提供以下完整信息:
- 目标RDK硬件平台及处理器架构: 例如 RDK X3 (BPU Bernoulli2), RDK Ultra (BPU Bayes), 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 Ultra平台有哪些社区算法资源和工具链手册?
A: 针对RDK Ultra平台的算法开发,可以参考以下OpenExplorer社区资源:
- RDK Ultra 算法工具链社区手册 (OpenExplorer): https://developer.d-robotics.cc/api/v1/fileData/horizon_j5_open_explorer_cn_doc/index.html
- RDK Ultra OpenExplore 产品发布及相关资源帖: https://developer.d-robotics.cc/forumDetail/118363912788935318
Q5: 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
Q6: 算法工具链的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驱动和推理库)与模型转换时使用的工具链版本兼容即可。
Q7: 如何在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/Ultra)的部署:
- Python多线程刷满30fps参考: CSDN博客 - YOLOv10 Bayes平台部署
-
通用资源: 强烈建议查阅 RDK Model Zoo (https://github.com/D-Robotics/rdk_model_zoo),其中包含了多种YOLO版本(及其他主流模型)的官方部署示例、预处理/后处理代码、以及性能优化技巧。
Q8: 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训练与转化博客 中可能也包含了相关类别数修改的说明。
Q9: 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的导出脚本(通常是
Q10: YOLOv5部署时,检测结果出现有周期性排列规律的异常检测框,是什么原因?
A:
- 可能原因:输出维度与后处理不匹配。
- 如果您使用的YOLOv5模型(例如公版的tag 2.0以下版本)在导出ONNX时,每个输出头的维度是5维的(例如
[batch, num_anchors, grid_h, grid_w, (x,y,w,h,conf+classes)]
或者 是[batch, num_anchors* (5+num_classes), grid_h, grid_w]
展平的形式)。 - 而地平线BPU工具链在编译这类模型时,如果直接使用,可能会因为维度处理或后处理代码的预期,导致将某个维度截断或错误解析,从而出现周期性排列的异常检测框。
- 示例图:
* 解决方法:
- 推荐的做法是在导出ONNX模型时,将输出转换为明确的四维张量(例如NHWC格式:
[batch, grid_h, grid_w, num_anchors*(5+num_classes)]
),并且在板端的后处理代码中,再根据这个NHWC的输出格式进行正确的解析和解码(例如,将其reshape回5维或进行相应的anchors计算)。 - 确保您的后处理逻辑与ONNX模型的最终输出维度和排列方式完全匹配。
- 如果您使用的YOLOv5模型(例如公版的tag 2.0以下版本)在导出ONNX时,每个输出头的维度是5维的(例如
Q11: YOLOv5部署时,检测框的位置出现整体偏移,是什么原因?
A:
- 渲染尺寸与图像原始尺寸不匹配:
- 后处理代码计算出的检测框坐标通常是相对于模型输入图像的尺寸(例如640x640)。如果您在显示结果时,将这些坐标直接绘制在一个不同尺寸的原始图像或显示画布上,而没有进行相应的缩放和平移变换,就会导致检测框位置偏移。
- 解决方法: 确保在渲染检测框之前,将模型输出的坐标按比例(
原始图像宽/模型输入宽
,原始图像高/模型输入高
)映射回原始图像的坐标系。如果模型输入前有padding操作,反向映射时也需要考虑去除padding的影响。
- Anchors不匹配:
- YOLOv5的检测框解码依赖于预设的锚框(anchors)。如果在模型训练时使用了一组anchors,但在后处理代码中使用了另一组不同的anchors(或者anchors的顺序、缩放方式不一致),会导致解码出的检测框位置和大小不正确。
- 解决方法: 确保后处理代码中使用的anchors参数(通常是18个数字,代表3个特征图上每层3个anchors的宽高)与模型训练时使用的anchors完全一致。
Q12: YOLOv5部署时,检测框都异常地聚集在图像的左上角,可能是什么原因?
A:
- 可能原因:后处理库参数传递问题 (特指某些系统版本中的示例)。
- 在RDK OS 3.0.0及以上版本系统中,
/app/pydev_demo/07_yolov5_sample
等示例中可能使用了CPython封装的后处理库。如果模型训练的类别数量等关键参数没有正确地传递给这个后处理库的初始化或调用接口,可能会导致解码逻辑错误,出现检测框聚集在左上角的 现象。 - 示例图:
* 解决方法:
- 推荐使用RDK Model Zoo中的后处理: 对于YOLOv5等模型的验证和部署,强烈建议参考或直接使用 RDK Model Zoo (https://github.com/D-Robotics/rdk_model_zoo) 中提供的后处理代码。Model Zoo中的实现通常更健壮、更优化,并且与工具链的配合更紧密。
- 检查参数传递: 如果您坚持使用板载示例的后处理,请仔细检查示例代码,确保所有必要的参数(如类别数、输入分辨率、anchors、置信度阈值、NMS阈值等)都已正确配置并传递给了后处理函数或类。
- 在RDK OS 3.0.0及以上版本系统中,
Q13: 运行RDK板载的 /app/pydev_demo/07_yolov5_sample
示例时,如果使用自己的模型,报 Segmentation fault
(段错误),怎么办?
A:
- 原因: 板载的官方示例程序(如
07_yolov5_sample
)通常是针 对其自带的预转换好的.bin
模型进行适配和测试的。这个示例的预处理、模型加载、BPU推理调用以及后处理逻辑,都是围绕那个特定的自带模型设计的。 - 如果您用自己的(可能结构、输入输出、后处理逻辑都不同的)YOLOv5模型替换了示例中的
.bin
文件,而没有相应地修改示例代码中的预处理、后处理或模型参数部分,就非常容易因为数据格式不匹配、内存访问越界等原因导致Segmentation fault
。 - 解决方法:
- 不要直接替换bin文件就期望能运行: 原则上,对于自己训练和转换的模型,您需要编写或修改与之配套的完整推理程序(包括预处理、BPU推理接口调用、后处理)。
- 参考RDK Model Zoo: 对于YOLOv5这类常见模型,强烈建议参考 RDK Model Zoo (https://github.com/D-Robotics/rdk_model_zoo) 中对应模型的部署示例。Model Zoo通常会提供更通用、更清晰的预处理和后处理代码实现,您可以基于这些代码来适配您自己的模型。
- 理解后处理: 仔细学习YOLOv5的后处理原理(包括anchors解码、置信度过滤、NMS等),并确保您的后处理代码与您模型输出特征图的格式、维度、内容完全对应。