ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

RK3588系列:02-模型转换与连板测试:把 YOLOv5 跑上 RK3588 的 NPU

RK3588系列:02-模型转换与连板测试:把 YOLOv5 跑上 RK3588 的 NPU

上期把系统烧好、环境搭好。这期做正事:把一个 YOLOv5 模型转换成 RKNN,然后在板子的 NPU 上跑起来。

整条链路是这样的:

pt(PyTorch)→ onnx → rknn → 板子上推理

中间有两个容易踩的坑:一个是yolov5 仓库的选择(选错仓库,转出来的模型推理结果全错),另一个是量化数据集的准备(直接影响精度)。这两个坑我会在后面单独说。

本文环境:

· PC:Ubuntu(x86_64),Python 3.8(conda 环境) · 板子:Orange Pi 5 Plus(RK3588) · 模型:YOLOv5s · 工具链:rknn-toolkit2 2.5.0 + rknn_model_zoo 2.5.0

1 环境搭建

先说清楚一件事:转换和部署是两个环境。

X86 PC(rknn_pc_ws):跑转换(pt→onnx→rknn) RK3588 板子(rknn_board_ws):跑推理

两边的目录结构我都保持一致,方便对应:

rknn_pc_ws/ ├── 3rdparty/ # 工具链(rknn-toolkit2、rknn_model_zoo) ├── workspace/ # 训练和转换的工作区(ultralytics、develop) └── datasets/ # 量化用的图片

1.1 X86 环境

第 1 步:下载 rknn-toolkit2 和 rknn_model_zoo

https://github.com/airockchip/rknn_model_zoo https://github.com/airockchip/rknn-toolkit2# 下载 zip 包,解压到 3rdpartycdrknn_pc_ws/3rdpartyunziprknn-toolkit2-2.5.0.zipunziprknn-model-zoo-2.5.0.zip

这两个包分别干什么:

· rknn-toolkit2 → 模型转换的核心工具(onnx → rknn) · rknn_model_zoo → 官方示例(现成的 onnx、转换脚本、C++/Python 部署代码)

第 2 步:下载 ultralytics 仓库并安装环境

cdrknn_pc_ws/workspace# 克隆gitclone https://github.com/ultralytics/ultralyticscdultralytics# 激活 Python 3.8 环境sourceactivate py38# 安装(-e 是开发模式,改代码立即生效)pipinstall-e.

注意(重要):如果你要把 yolov5 转到 RK3588 上跑,建议用 https://github.com/ultralytics/yolov5 仓库,而不是 ultralytics 主仓库。

原因:ultralytics 主仓库里的 yolov5 是anchor-free的(单分支输出),转成 rknn 之后推理结果目前测试全是错的。这个坑我踩过,后面第 4 节详细说。

1.2 RK3588 板子

板子这边也要一份 rknn-toolkit2(主要用它的 runtime 和示例代码)。

# PC 上拷贝到板子scprknn-toolkit2-2.5.0.zip orangepi@192.168.xx.xx:~/rknn_board_ws/3rdparty# 板子上解压cdrknn_board_ws/3rdpartyunziprknn-toolkit2-2.5.0.zip

为什么板子上也要这个包:

· 里面有 rknn_server(连板调试用的服务) · 有 rknn runtime 的库(librknnrt.so) · 有示例代码(C++/Python 推理 demo)

2 模型转换

这节以yolov5s为例,走完 pt → onnx → rknn 全流程。

2.1 pt 转 onnx

第 1 步:获取 pt 文件

这一步在 X86 上做。写个训练脚本,跑起来会自动下载预训练模型和样例数据。

cdrknn_pc_ws/workspacemkdirdevelop&&cddevelopvimtrain.py
fromultralyticsimportYOLO# Load a modelmodel=YOLO("yolov5s.yaml")# 从 YAML 构建新模型# Train the modelresults=model.train(data="coco8.yaml",epochs=100,imgsz=640)
# 激活环境并运行sourceactivate py38 python train.py

说明:

· 这个脚本会自动下载 yolov5s.pt 和 coco8.yaml(样例数据集) · 训练只是"走个流程",拿到 best.pt 就行(不用真训到收敛) · 要训练自己的数据,把 data 换成自己的 yaml


训练完成后,best.pt在workspace/ultralytics/runs/detect/train-x/weights/下:

第 2 步:pt 转 onnx
# 方式一:用脚本cddevelopbashexport.sh ./../ultralytics/runs/detect/train-3/weights/best.pt# 方式二:直接命令行yoloexportmodel=./../ultralytics/runs/detect/train-3/weights/best.pt\format=onnximgsz=640opset=16dynamic=Falsesimplify=True

参数逐个说明(这几个参数选错,后面都会出问题):

参数说明建议值
imgsz=640输入分辨率,也可以写(480,640)表示 H,W看你模型的训练尺寸
opset=16ONNX 算子集版本RKNN-Toolkit2 推荐 16(onnxruntime 可以到 18)
dynamic=False是否动态 batch(N 可变)嵌入式一般关闭(固定 shape 性能更好)
simplify=True自动简化模型(onnxslim),减少冗余算子建议开
half=True导出 FP16RKNN 不建议(保持 FP32 导出)

验证 onnx 是否正确:

yolo predicttask=detectmodel=../ultralytics/runs/detect/train-3/weights/best.onnx\imgsz=640source=bus.jpg

预测结果保存在workspace/ultralytics/runs/detect/predict/下。

这一步很关键:onnx 模型能正常出结果,说明转换没错。如果 onnx 就出问题,先别急着转 rknn——回去查导出参数。

2.2 onnx 转 rknn

为了避免和训练环境的依赖冲突,单独建一个 rknn 的 conda 环境。

# 1. 创建独立环境conda create-nrknn_py38python=3.8sourceactivate rknn_py38# 2. 装依赖cd/opt/rknn_pc_ws/3rdparty/rknn-toolkit2-2.5.0/rknn-toolkit2/packages/x86_64 pipinstall-rrequirements_cp38.txt pipinstallrknn_toolkit2-2.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl# 3. 执行转换(带量化)python export_rknn_yolov5su.py\--onnx./../ultralytics/runs/detect/train-3/weights/best.onnx\--rknnyolov5su_int8.rknn\--quantize\--dataset./../datasets/rknn_calib_images/datasets.txt

量化数据集的要求(这直接影响精度):

· 数量:200-500 张 · 内容:要覆盖你的实际场景(不同光照、角度、目标大小) · 格式:datasets.txt 里每行一张图片的路径

为什么必须量化:

· 不量化 → FP16/FP32 模型,体积大、速度慢 · 量化(INT8)→ 模型小 4 倍、速度快 2-3 倍 · 但量化会掉精度 → 所以校准图片要贴近实际场景

补充:老版本的 yolov5s 可以直接用 rknn_model_zoo 里的转换脚本:
rknn_model_zoo-2.5.0/examples/yolov5/python/convert.py

3 测试部署

模型转好了,先在板子上验证能不能跑对——这里用"连板调试"的方式(PC 通过 adb 连板子,用 PC 的 python 调用板子的 NPU)。

连板调试 vs 板端部署:

· 连板调试:PC 上跑 python,通过 adb 调用板子的 NPU → 方便快速验证模型,不用往板子上拷代码 · 板端部署:把模型和推理代码都放到板子上跑 → 最终形态,性能最好

3.1 rknn 连板测试

第 1 步:安装 adb
# PC 端sudoaptinstalladb# RK3588 板子端sudoaptinstalladb
第 2 步:连接板子
# 板子端:启动 rknn_serverrknn_server# PC 端:adb 连接板子adb connect192.168.xx.xx# 换成板子 IPadb devices# 查看已连接设备


说明:rknn_server是板子上的一个常驻服务,PC 通过 adb 把模型和数据推过去,让板子的 NPU 执行推理。

第 3 步:执行推理

情况 A:老版 yolov5s(带 anchor)

python rknn_online_board.py\--model_path./yolov5s/yolov5s-640-640.rknn\--model_typeyolov5\--img_folder./yolov5s\--anchors./yolov5s/anchors_yolov5.txt\--targetrk3588\--img_show


情况 B:新版 yolov5su(anchor-free,rknn 模型)

python rknn_online_board.py\--model_path./yolov5su/yolov5su_int8.rknn\--model_typeyolov5su\--img_folder./yolov5su\--targetrk3588\--img_show

情况 C:新版 yolov5su(anchor-free,onnx 模型)

python rknn_online_board.py\--model_path./yolov5su/best.onnx\--model_typeyolov5su\--img_folder./yolov5su\--img_show


对比结论(自己测出来的):

· 老版 yolov5s(3 分支 + anchor)→ rknn 结果正常 · 新版 yolov5su(1 分支,anchor-free)→ onnx 正常,但转 rknn 后结果错误

4 两个必须注意的点

① yolov5 转 rknn,仓库要选对

❌ 不要用:https://github.com/ultralytics/ultralytics → 里面的 yolov5 是 anchor-free(单分支输出) → 转成 rknn 后,推理结果目前测试全是错的 ✅ 用这两个: · https://github.com/ultralytics/yolov5 (老版,3 分支 + anchor) · https://github.com/airockchip (瑞芯微适配的 yolo 系列) → 输出 3 个分支,需要 anchor,转 rknn 正常

为什么会这样:

· 老版 yolov5:输出 3 个尺度的特征图(80×80、40×40、20×20), 需要用 anchor 解码成框 → RKNN 转换时按这个结构处理,没问题 · 新版 anchor-free:输出 1 个分支,解码方式不同 → 转 rknn 时算子融合/量化可能改变了输出语义 → 结果就对不上(这是目前实测的结论)

② 不想训练?直接用官方示例

如果你只是想验证环境/性能,不需要自己训练: → 直接用 rknn_model_zoo-2.5.0/examples/ 下的模型 里面每个模型都自带: · 现成的 onnx · 转换 rknn 的脚本 · C++ 和 Python 的部署代码 · 测试图片 拿来就能跑,省掉训练和转换的所有步骤。

支持的模型很多(yolov5/yolov8/yolox/RetinaFace/PPOCR 等),具体看 examples 目录。

5 小结

完整链路: 1. 环境:X86(转换)+ 板子(推理) 2. pt → onnx:注意 opset=16、dynamic=False 3. onnx → rknn:单独环境 + 200-500 张量化图片 4. 连板测试:adb + rknn_server,PC 调用板子 NPU 两个坑: · yolov5 要用 yolov5 仓库或 airockchip 的,别用 ultralytics 主仓库 · 不想训练就直接用 rknn_model_zoo 的 examples

视频讲解:

02-模型的转换及连板测试

如果本文对你有帮助,欢迎点赞、关注、收藏。
遇到问题可以评论区留言交流,也欢迎转发给需要的朋友。

返回列表