OE Agent“天工”新版本发布,请前往论坛顶部查看,欢迎试用并反馈~
查看OE-Skills
专栏算法工具链从零开始:YOLOv5x 在 Horizon J6 平台的完整部署实战(上)

从零开始:YOLOv5x 在 Horizon J6 平台的完整部署实战(上)

XZH2026-07-10
21
0

YOLOv5x 在 Horizon J6 上的端到端部署实践(上):工具链部署

本文记录 YOLOv5x 从 PyTorch 权重到 J6 可执行 HBM 模型的部署流程。上篇聚焦工具链侧:环境准备、ONNX 导出、校准数据生成和 HBM 编译;下篇再展开板端 C++ 推理部署与精度评估。

平台:Horizon J6 (nash-e)
SDK:horizon_j6_open_explorer_v3.8.1-py310
模型:YOLOv5x,输入分辨率 640x640
板端输入:NV12;PC 端校准输入:RGB float32

1. 环境准备

首先安装 SDK 中的 host 端工具链和 board 端运行时:

Python 侧需要准备模型导出、ONNX 处理、校准与评估相关依赖:

Horizon 工具链建议使用 SDK 自带 whl 安装,重点包括:

  • horizon_tc_ui

  • hmct

  • hbdk4_compiler

后续操作均在示例工程目录中进行:


2. Stage 1:PyTorch 导出 ONNX

YOLOv5 的 .pt 权重是包含 Python 对象引用的序列化文件,因此导出前需要确保 YOLOv5 源码在 Python 路径中。SDK 中已经包含对应源码,可直接复用:

导出流程可以概括为:

  1. 加载 yolov5x.pt
  2. 设置模型为 eval 和 export 状态
  3. 构造 (1, 3, 640, 640) 的 dummy input
  4. 使用 torch.onnx.export 导出 ONNX
  5. 使用 onnxsim 简化模型

执行命令:

导出后得到:

文件

说明

model/yolov5x.pt

原始 PyTorch 权重

model/yolov5x.onnx

简化后的 ONNX 模型

模型输出包含三个检测头:

其中 85 = 4(bbox) + 1(obj) + 80(classes)。

3. Stage 2:生成校准数据

PTQ 量化需要少量代表性样本来统计激活分布。一般选择 50 到 500 张图片即可,关键是预处理必须和后续推理保持一致。

本流程中的校准预处理为:

执行:

输出目录:

每个 .npy 文件的格式为:

4. Stage 3:ONNX 编译为 HBM

Horizon 工具链的大致链路为:

核心编译配置如下:

这里最需要注意的是:

  • march: nash-e 对应 J6 BPU 架构。
  • input_type_rt: nv12 表示板端运行时输入为 NV12。
  • input_type_train: rgb 与校准数据保持一致。
  • scale_value: 1/255 表示板端运行时由模型完成归一化。

编译命令:

主要产物:

其中 .hbm 是后续板端部署使用的模型文件。

5. 查看模型输入输出

将 HBM 放到板端后,可以用 hrt_model_exec 查看模型信息:

输入一般会被拆成两个 NV12 tensor:

Tensor

Shape

说明

images_y

(1, 640, 640, 1)

Y 平面

images_uv

(1, 320, 320, 2)

UV 交错平面

输出仍然是 YOLOv5 的三个检测头,但要特别关注 stride:

最后一维虽然只有 85 个 float,理论大小是 340 bytes,但实际 col stride 是 384 bytes,说明中间存在 padding。这个细节会直接影响下篇的 C++ 后处理实现。

小结

上篇完成了从 yolov5x.pt 到 yolov5x_640x640_nv12.hbm 的工具链流程。关键点主要有三个:
  1. 导出 ONNX 时要正确加载 YOLOv5 源码和模型结构。

  2. 校准数据预处理要与部署推理保持一致。

  3. 编译配置中要明确 J6 架构、NV12 输入和运行时归一化方式。

下篇将继续介绍如何在 J6 板端用 C++ 加载 HBM、构造 NV12 输入、调用 UCP/DNN API、解析带 padding 的输出,并完成 YOLOv5 后处理和 mAP 评估。

算法工具链
官方教程征程6
评论0
0/600