AI 开放平台

提供适配不同硬件平台的AI模型,探索更多端侧与边缘侧场景应用

基于RK3588部署YOLOv5目标检测

瑞芯微: RK3588

本文档演示如何在Rockchip RK3588芯片上部署YOLOv5模型,旨在介绍如何使用rknn_model_zoo中预训练好的 ONNX 格式模型,通过模型转换得到开发板支持的模型格式,并在板端完成推理。模型的部署需要使用到软件开发工具包 RKNN SDK。

部署YOLOv5 需要两个步骤

(1) PC 端利用 rknn-toolkit2 将不同框架下的模型转换成 rknn 格式模型
(2) 板端利用 rknn-toolkit2-lite 的 Python API 板端推理模型

RKNN SDK介绍

RKNN SDK 是瑞芯微公司推出的一套用于将 AI 模型部署到其芯片上的软件开发工具包,主要包含 RKNN-Toolkit2、RKNN-Toolkit-Lite2 和 RKNN Runtime 等工具,以下是具体介绍:

RKNN-Toolkit2

  • 功能 :是在 PC 和瑞芯微 NPU 平台上进行模型转换、推理和性能评估的软件开发套件。支持将 Caffe、TensorFlow、TensorFlow Lite、ONNX、DarkNet、PyTorch 等主流模型转换为 RKNN 模型,还支持 RKNN 模型导入导出,转换后的 RKNN 模型能在 Rockchip NPU 平台上加载使用。
  • 量化功能 :可将浮点模型量化为定点模型,目前支持非对称量化(asymmetric_quantized-8),也支持混合量化功能。
  • 推理与评估 :能在 PC 上模拟 NPU 运行 RKNN 模型并获取推理结果,还可将 RKNN 模型分发到指定 NPU 设备上进行推理并获取结果,以及评估模型在实际设备上运行时的性能和内存占用情况。
  • 量化精度分析 :能给出模型量化前后每一层推理结果与浮点模型推理结果的余弦距离,便于分析量化误差出现的位置和原因,从而为提高量化模型的精度提供参考。
  • 模型加密 :可使用指定的加密等级将 RKNN 模型整体加密,加密后的模型在使用时与普通 RKNN 模型一样加载,由 NPU 驱动自动解密。

RKNN-Toolkit-Lite2

RKNN-Toolkit-Lite2为瑞芯微 NPU 平台提供 Python 编程接口,帮助用户更便捷地部署 RKNN 模型,加速 AI 应用的落地与实施,适合在开发板上进行轻量级的推理任务和应用开发。

RKNN Runtime

RKNN Runtime为 Rockchip NPU 平台提供 C/C++ 编程接口,使用户能够以高效的方式部署 RKNN 模型,并充分利用 NPU 的硬件加速能力,快速实现 AI 应用的推理和运算,适用于对性能要求较高的场景

RKNPU

RKNPU内核驱动负责与 NPU 硬件交互。

整体框架如下:

<center class="half">

<div style="background-color:#ffffff;">
<img src="https://aijishu.com/img/bVci93" title="RKNN"/>
</center>

安装 RKNN 环境

模型转换需在X86 PC上进行。Rockchip RK3588系列芯片搭载神经网络处理器 NPU, 利用 RKNN 可以帮助用户快速部署 AI 模型到 Rockchip 芯片上使用 NPU 硬件加速模型推理。 为了使用 RKNPU,用户首先需要在 x86 计算机上使用 RKNN-Toolkit2 工具,将训练好的模型转换为 RKNN 格式的模型,然后在开发板上使用 RKNN C API 或 Python API进行推断。

PC 端下载 RKNN-Toolkit2 仓库

  • 下载 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

PC 端安装 RKNN-Toolkit2

  • 激活 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

板端安装 RKNN Toolkit Lite2 及其所需依赖

若您偏好在板端系统中使用 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

PC端模型转换

  • 如使用 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>: 指定为 i8fpi8 用于 int8 量化,fp 用于 fp16 量化。默认为 i8

    <output_rknn_path>: 指定 RKNN 模型的保存路径,默认保存在与 ONNX 模型相同的目录

  • 将 rknn 模型拷贝到板端

板端推理 YOLOv5

  • 修改 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上运行,检测结果如下图所示:

bus