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
导出流程可以概括为:
- 加载 yolov5x.pt
- 设置模型为 eval 和 export 状态
- 构造 (1, 3, 640, 640) 的 dummy input
- 使用 torch.onnx.export 导出 ONNX
- 使用 onnxsim 简化模型
执行命令:
导出后得到:
文件 | 说明 |
|---|---|
model/yolov5x.pt | 原始 PyTorch 权重 |
model/yolov5x.onnx | 简化后的 ONNX 模型 |
模型输出包含三个检测头:
3. Stage 2:生成校准数据
PTQ 量化需要少量代表性样本来统计激活分布。一般选择 50 到 500 张图片即可,关键是预处理必须和后续推理保持一致。
本流程中的校准预处理为:
执行:
输出目录:
4. Stage 3:ONNX 编译为 HBM
Horizon 工具链的大致链路为:
核心编译配置如下:
这里最需要注意的是:
- march: nash-e 对应 J6 BPU 架构。
- input_type_rt: nv12 表示板端运行时输入为 NV12。
- input_type_train: rgb 与校准数据保持一致。
- scale_value: 1/255 表示板端运行时由模型完成归一化。
编译命令:
主要产物:
5. 查看模型输入输出
输入一般会被拆成两个 NV12 tensor:
Tensor | Shape | 说明 |
|---|---|---|
images_y | (1, 640, 640, 1) | Y 平面 |
images_uv | (1, 320, 320, 2) | UV 交错平面 |
输出仍然是 YOLOv5 的三个检测头,但要特别关注 stride:
小结
导出 ONNX 时要正确加载 YOLOv5 源码和模型结构。
校准数据预处理要与部署推理保持一致。
编译配置中要明确 J6 架构、NV12 输入和运行时归一化方式。
下篇将继续介绍如何在 J6 板端用 C++ 加载 HBM、构造 NV12 输入、调用 UCP/DNN API、解析带 padding 的输出,并完成 YOLOv5 后处理和 mAP 评估。
