本文档演示如何在Rockchip RK3588芯片上部署YOLOv5模型,旨在介绍如何使用rknn_model_zoo中预训练好的 ONNX
格式模型,通过模型转换得到开发板支持的模型格式,并在板端完成推理。模型的部署需要使用到软件开发工具包 RKNN SDK。
部署YOLOv5 需要两个步骤
(1) PC 端利用 rknn-toolkit2 将不同框架下的模型转换成 rknn 格式模型
(2) 板端利用 rknn-toolkit2-lite 的 Python API 板端推理模型
RKNN SDK 是瑞芯微公司推出的一套用于将 AI 模型部署到其芯片上的软件开发工具包,主要包含 RKNN-Toolkit2、RKNN-Toolkit-Lite2 和 RKNN Runtime 等工具,以下是具体介绍:
RKNN-Toolkit-Lite2为瑞芯微 NPU 平台提供 Python 编程接口,帮助用户更便捷地部署 RKNN 模型,加速 AI 应用的落地与实施,适合在开发板上进行轻量级的推理任务和应用开发。
RKNN Runtime为 Rockchip NPU 平台提供 C/C++ 编程接口,使用户能够以高效的方式部署 RKNN 模型,并充分利用 NPU 的硬件加速能力,快速实现 AI 应用的推理和运算,适用于对性能要求较高的场景
RKNPU内核驱动负责与 NPU 硬件交互。
整体框架如下:
<center class="half">
<div style="background-color:#ffffff;">
<img src="https://aijishu.com/img/bVci93" title="RKNN"/>
</center>
模型转换需在X86 PC上进行。Rockchip RK3588系列芯片搭载神经网络处理器 NPU, 利用 RKNN 可以帮助用户快速部署 AI 模型到 Rockchip 芯片上使用 NPU 硬件加速模型推理。 为了使用 RKNPU,用户首先需要在 x86 计算机上使用 RKNN-Toolkit2 工具,将训练好的模型转换为 RKNN 格式的模型,然后在开发板上使用 RKNN C API 或 Python API进行推断。
下载 RKNN 仓库
建议新建一个目录用来存放 RKNN 仓库,例如新建一个名称为 Projects
的文件夹,并将 RKNN-Toolkit2 和 RKNN Model Zoo 仓库存放至该目录下。
# 新建 Projects 文件夹
mkdir Projects && cd Projects
# 下载 RKNN-Toolkit2 仓库
git clone -b v2.3.0 https://github.com/airockchip/rknn-toolkit2.git
# 下载 RKNN Model Zoo 仓库
git clone -b v2.3.0 https://github.com/airockchip/rknn_model_zoo.git
(可选)安装 Anaconda
如果系统中没有安装 Python 3.8(建议版本),或者同时有多个版本的 Python 环境,建议使用 Anaconda 创建新的 Python 3.8 环境。
安装 Anaconda
在终端窗口中执行以下命令,检查是否安装 Anaconda,若已安装则可省略此节步骤。
$ conda --version
conda 24.9.2
如出现 conda: command not found, 则表示未安装 anaconda, 请参考 Anaconda 官网进行安装。
创建 conda 环境
conda create -n rknn python=3.8.2
进入 rknn conda 环境
conda activate rknn
退出环境
conda deactivate
激活 conda rknn 环境后,进入 rknn-toolkit2 目录,根据您的架构平台和 Python 版本选择相应的 requirements_cpxx.txt 安装依赖,
并通过 wheel 包安装 RKNN-Toolkit2,这里以 64 位 x86 架构 Python3.8 环境的 PC 为例子,参考命令如下:
# 进入 rknn-toolkit2 目录
cd rknn-toolkit2/rknn-toolkit2/packages/x86_64/
# 请根据不同的 python 版本,选择不同的 requirements 文件, 这里以 python3.8 为例子
pip3 install -r requirements_cp38-2.3.0.txt
# 请根据不同的 python 版本及处理器架构,选择不同的 wheel 安装包文件:
pip3 install ./rknn_toolkit2-2.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
:::tip
如果您使用的是 ARM 架构平台,请安装 arm64 下的依赖
:::
验证是否安装成功
执行以下命令,若没有报错,则代表 RKNN-Toolkit2 环境安装成功。
$ python3
>>> from rknn.api import RKNN
若您偏好在板端系统中使用 python venv 虚拟环境,你须单独安装 rknn_toolkit-lite2 wheel
cd rknn-toolkit2/rknn-toolkit-lite2/packages/
根据板端系统的 python 版本将对应的 rknn_toolkit_lite2-2.3.0-cp3X-cp3X-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
复制到板端
进入虚拟环境后使用 pip3 安装
pip3 install ./rknn_toolkit_lite2-2.3.0-cp3X-cp3X-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
执行以下命令,若没有报错,则代表 rknn_toolkit-lite2 环境安装成功。
$ python3
>>> from rknnlite.api import RKNNLite as RKNN
如使用 conda 请先激活 rknn conda 环境
conda activate rknn
克隆 rknn_model_zoo 代码仓库
git clone -b v2.3.0 https://github.com/airockchip/rknn_model_zoo.git
下载 yolov5s_relu.onnx 模型
cd rknn_model_zoo/examples/yolov5/model
# 下载预训练好的 yolov5s_relu.onnx 模型
bash download_model.sh
如遇到网络问题,可访问 此页 下载对应的模型到对应文件夹
使用 rknn-toolkit2 转换成 yolov5s_relu.rknn
cd rknn_model_zoo/examples/yolov5/python
python3 convert.py <onnx_model> <TARGET_PLATFORM> <dtype> <output_rknn_path>
# python3 convert.py ../model/yolov5s_relu.onnx rk3588 i8 ../model/yolov5s_relu_rk3588.rknn
参数解析:
<onnx_model>
: 指定 ONNX 模型路径
<TARGET_PLATFORM>
: 指定 NPU 平台名称。可选 rk3562, rk3566, rk3568, rk3576, rk3588, rk1808, rv1109, rv1126
<dtype>
: 指定为 i8
或 fp
。i8
用于 int8 量化,fp
用于 fp16 量化。默认为 i8
<output_rknn_path>
: 指定 RKNN 模型的保存路径,默认保存在与 ONNX 模型相同的目录
修改 rknn_model_zoo/py_utils/rknn_executor.py
代码,请备份原版代码
from rknnlite.api import RKNNLite as RKNN
class RKNN_model_container():
def __init__(self, model_path, target=None, device_id=None) -> None:
rknn = RKNN()
rknn.load_rknn(model_path)
ret = rknn.init_runtime()
self.rknn = rknn
def run(self, inputs):
if self.rknn is None:
print("ERROR: rknn has been released")
return []
if isinstance(inputs, list) or isinstance(inputs, tuple):
pass
else:
inputs = [inputs]
result = self.rknn.inference(inputs=inputs)
return result
def release(self):
self.rknn.release()
self.rknn = None
修改 rknn_model_zoo/examples/yolov5/python/yolov5.py
262 行的代码, 请备份原版代码
262 outputs = model.run([np.expand_dims(input_data, 0)])
安装依赖环境
pip3 install opencv-python-headless
运行 yolov5 示例代码
cd rknn_model_zoo/examples/yolov5/python
python3 yolov5.py --model_path <your model path> --img_save
如你使用的是自己转换的模型需从 PC 端拷贝到板端,并用 --model_path 参数指定模型路径
(.venv) (base) firefly@firefly:~/rknn_model_zoo/examples/yolov5/python$ python yolov5.py --model_path ~/models/yolov5s_rk3588.rknn --img_save --target rk3588
use anchors from '../model/anchors_yolov5.txt', which is [[[10.0, 13.0], [16.0, 30.0], [33.0, 23.0]], [[30.0, 61.0], [62.0, 45.0], [59.0, 119.0]], [[116.0, 90.0], [156.0, 198.0], [373.0, 326.0]]]
W rknn-toolkit-lite2 version: 2.3.2
--> Init runtime environment
I RKNN: [17:30:21.201] RKNN Runtime Information, librknnrt version: 2.3.2 (429f97ae6b@2025-04-09T09:09:27)
I RKNN: [17:30:21.201] RKNN Driver Information, version: 0.8.8
I RKNN: [17:30:21.201] RKNN Model Information, version: 6, toolkit version: 2.1.0+708089d1(compiler version: 2.1.0 (967d001cc8@2024-08-07T11:32:45)), target: RKNPU v2, target platform: rk3588, framework name: ONNX, framework layout: NCHW, model inference type: static_shape
W RKNN: [17:30:21.214] query RKNN_QUERY_INPUT_DYNAMIC_RANGE error, rknn model is static shape type, please export rknn with dynamic_shapes
W Query dynamic range failed. Ret code: RKNN_ERR_MODEL_INVALID. (If it is a static shape RKNN model, please ignore the above warning message.)
done
Model-/home/firefly/models/yolov5s_rk3588.rknn is rknn model, starting val
infer 1/1
IMG: bus.jpg
person @ (209 243 286 510) 0.880
person @ (479 238 560 526) 0.871
person @ (109 238 231 534) 0.840
person @ (79 353 121 517) 0.301
bus @ (91 129 555 464) 0.692
Detection result save to ./result/bus.jpg
YOLOv5成功在RK3588上运行,检测结果如下图所示: