地平线RDK X5实战:YOLOv5模型转换全流程(从pt到onnx再到bin)
最近有不少朋友在折腾地平线RDK X5,想把训练好的YOLOv5模型部署上去,结果卡在了模型转换这一步。从PyTorch的.pt文件,到中间格式.onnx,再到最终能在X5上跑的.bin文件,这个过程确实有些门道。我自己在项目里也踩过不少坑,从环境配置到参数调优,每一步都可能遇到意想不到的问题。这篇文章我就结合自己的实际经验,把整个转换流程掰开揉碎了讲清楚,目标是让你看完就能动手操作,避开那些常见的“雷区”。
RDK X5作为一款面向边缘计算的开发板,其强大的AI算力需要特定的模型格式才能释放。直接拿PyTorch模型是跑不起来的,必须经过地平线工具链的转换和编译。这个过程不仅仅是格式转换,还涉及到算子适配、量化校准、内存优化等一系列操作。对于刚接触边缘AI部署的开发者来说,可能会觉得有些复杂,但只要你跟着步骤一步步来,其实并没有想象中那么难。
1. 环境准备与工具链部署
在开始转换模型之前,你得先把“厨房”准备好——也就是搭建好地平线的开发环境。官方推荐使用Docker镜像,这能最大程度保证环境的一致性,避免因为系统依赖问题导致转换失败。我强烈建议你也采用这种方式,毕竟谁也不想把时间浪费在解决各种环境冲突上。
首先,你需要准备一台运行Ubuntu 20.04的机器(物理机或虚拟机均可),并确保已经安装了Docker。如果没有安装,可以通过以下命令快速安装:
sudo apt-get update
sudo apt-get install docker.io
接下来就是获取地平线Open Explorer(OE)工具链。工具链包含两个核心部分:Docker运行环境镜像和OE开发包。这两个文件的版本必须严格对应,否则后续步骤很可能出错。
注意:工具链的下载链接可能会随着版本更新而变化。建议直接访问地平线开发者社区获取最新的下载地址,避免使用过时的链接。
下载完成后,你需要将Docker镜像加载到本地。假设你把下载的压缩包放在了~/Downloads目录下:
cd ~/Downloads
docker load -i docker_openexplorer_ubuntu_20_x5_cpu_v1.2.6.tar.gz
这个过程可能需要几分钟时间,取决于你的磁盘速度。加载成功后,你可以使用docker images命令查看是否出现了名为openexplorer/ai_toolchain_ubuntu_20_x5_cpu的镜像。
OE开发包是一个压缩文件,里面包含了示例代码、文档和必要的资源。你需要把它解压到一个合适的位置,比如/home/yourname/horizon_oe。解压命令很简单:
tar -xzf horizon_x5_open_explorer_v1.2.6-py310_20240724.tar.gz -C /home/yourname/
现在到了关键的一步:启动Docker容器并挂载你的工作目录。这个命令看起来有点长,但每个参数都有其作用:
docker run -it --rm \
-v /home/yourname/horizon_x5_open_explorer_v1.2.6-py310_20240724:/open_explorer \
-v /home/yourname/your_workspace:/workspace \
openexplorer/ai_toolchain_ubuntu_20_x5_cpu:v1.2.6-py310
让我解释一下这几个参数:
-it表示以交互模式运行容器--rm表示容器退出后自动删除(避免积累无用容器)- 第一个
-v将OE开发包挂载到容器的/open_explorer目录 - 第二个
-v将你的工作目录挂载到容器的/workspace目录,这样你可以在宿主机上编辑文件,在容器内执行命令
执行成功后,你会进入容器的命令行界面。这时候可以先验证一下环境是否正常:
hb_mapper --version
如果能看到版本号输出(比如1.2.6),说明环境已经准备就绪。我建议你在/workspace目录下创建一个清晰的项目结构,比如:
/workspace/yolov5_conversion/
├── models/ # 存放原始pt模型
├── onnx/ # 存放转换后的onnx模型
├── calibration/ # 存放校准数据
├── configs/ # 存放yaml配置文件
└── outputs/ # 存放最终生成的bin文件
这样的结构化管理会让后续步骤更加清晰,特别是当你需要处理多个模型或多个版本时。
2. 从PyTorch到ONNX:关键参数与常见陷阱
环境准备好了,现在可以开始第一步转换:将YOLOv5的.pt文件转换为ONNX格式。ONNX(Open Neural Network Exchange)是一个开放的模型表示格式,它充当了不同深度学习框架之间的“桥梁”。很多边缘计算平台都支持ONNX作为中间输入格式。
首先,你需要在PyTorch环境中准备好转换脚本。如果你还没有训练好的YOLOv5模型,可以从官方仓库下载预训练模型。这里我假设你已经有一个训练好的yolov5s.pt文件。
转换的核心代码其实并不复杂,但细节决定成败:
import torch
import onnx
from models.experimental import attempt_load
# 加载模型
model = attempt_load('yolov5s.pt', map_location='cpu')
model.eval() # 设置为评估模式
# 准备示例输入
batch_size = 1
channels = 3
height = 640
width = 640
dummy_input = torch.randn(batch_size, channels, height, width)
# 定义输入输出名称
input_names = ['i

&spm=1001.2101.3001.5002&articleId=158895642&d=1&t=3&u=283a95b115bf48dbbcac8ede94372c7b)
729

被折叠的 条评论
为什么被折叠?



