RKNN 推理测试
1. RKNPU 简介
NPU(Nerual Processing Unit)是一种专门用于加速神经网络计算的处理器。为了满足人工智能的需求,瑞芯微逐渐将NPU集成到其处理器中,这种内置于瑞芯微处理器的NPU被称为RKNPU。LuckFox Core3576 系列核心板搭载瑞芯微 RK3576 芯片,内置瑞芯微自研NPU。该NPU具有高运算精度,支持 INT4、INT8、INT16/FP16/BF16、TF32 混合量化。要使用RKNPU2的SDK和工具套件。
| 数据类型 | INT8 | INT16/FP16/BF16 | INT4 | TF32 |
|---|---|---|---|---|
| 单核算力(TOPS) | 2 | 1 | 4 | 0.5 |
| 双核算力(TOPS) | 4 | 3 | 8 | 1 |
| 稀疏算力(TOPS) | 6 | 3 | \ | \ |
2. RKNN-Toolkit2 简介
RKNN-Toolkit2 工具在 PC 平台上提供 C 或 Python 接口,简化模型的部署和运行。用户可以通过该工具轻松完成以下功能:模型转换、量化、推理、性能和内存评估、量化精度分析以及模型加密。RKNN 软件栈可以帮助用户快速的将 AI 模型部署到 Rockchip 芯片。整体的框架如下:
为了使用 RKNPU,用户需要首先在计算机上运行 RKNN-Toolkit2 工具,将训练好的模型转换为 RKNN 格式模型,之后使用 RKNN C API 或 Python API 在开发板上进行部署。本节介绍用户如何快速在 Core3576 系列板子上使用 RKNPU。
3 RKNN-Toolkit2 安装(ubuntu22.04 X86_64平台)
3.1 本地安装
环境要求
操作系统版本 Ubuntu18.04(x64) Ubuntu20.04(x64) Ubuntu22.04(x64) Python版本 3.6/3.7 3.8/3.9 3.10/3.11 下载rknn-toolkit2
git clone https://github.com/airockchip/rknn-toolkit2.git安装python环境
sudo apt-get update
sudo apt-get install python3 python3-dev python3-pip
sudo apt-get install libxslt1-dev zlib1g zlib1g-dev libglib2.0-0 libsm6 libgl1-mesa-glx libprotobuf-dev gcc安装RKNN-ToolKit2依赖包
pip3 install -r rknn-toolkit2/packages/requirements_cpxx-2.2.0.txt
# such as:
pip3 install -r rknn-toolkit2/packages/requirements_cp310-2.2.0.txt根据不同的Python版本,选择安装对应的依赖包:
Python版本 RKNN-Toolkit2依赖包 3.6 requirements_cp36-2.2.0.txt 3.7 requirements_cp37-2.2.0.txt 3.8 requirements_cp38-2.2.0.txt 3.9 requirements_cp39-2.2.0.txt 3.10 requirements_cp310-2.2.0.txt 3.11 requirements_cp311-2.2.0.txt 3.12 requirements_cp312-2.2.0.txt 安装RKNN-ToolKit2
pip3 install rknn-toolkit2/packages/rknn_toolkit2-x.x.x+xxxxxxxx-cpxx-cpxx-linux_x86_64.whl
# such as:
pip3 install rknn-toolkit2/packages/rknn_toolkit2-2.2.0+81f21f4d-cp310-cp310-linux_x86_64.whl包名格式为:rknn_toolkit2-{版本号}+{commit 号}-cp{Python 版本}-cp{Python 版本}-linux_x86_64.whl,根据不同的Python版本,选择安装对应的安装包:
Python版本 RKNN-Toolkit2安装包 3.6 rknn_toolkit2-2.2.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl 3.7 rknn_toolkit2-2.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl 3.8 rknn_toolkit2-2.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl 3.9 rknn_toolkit2-2.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl 3.10 rknn_toolkit2-2.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl 3.11 rknn_toolkit2-2.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl 3.12 rknn_toolkit2-2.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl 若执行以下命令没有报错,则安装成功:
python3
from rknn.api import RKNN
3.2 Conda 安装
推荐使用 Conda 创建 python 虚拟环境,可以在多个应用场景下灵活切换,避免出现版本不匹配而无法运行等问题。实例在 AI 模型的训练和模型的转换过程中需要使用不同的 python 虚拟环境。
3.2.1 安装 miniconda 工具
检查是否安装了miniconda 或其他 conda 工具,如果有输出版本号说明已经安装。
conda --version下载安装包
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-4.6.14-Linux-x86_64.sh安装miniconda
chmod 777 Miniconda3-4.6.14-Linux-x86_64.sh
bash Miniconda3-4.6.14-Linux-x86_64.sh注意:miniconda 的安装包必须使用
chmod 777来设置权限。执行安装后输入回车阅读许可条款,输入
yes接受许可继续安装,再次输入回车会在家目录下创建miniconda文件夹,后续创建的虚拟环境会放置在此处。最后再输入一次yes进行 Conda 初始化 。
在计算机的终端窗口,进入 Conda base环境
source ~/miniconda3/bin/activate # miniconda3 安装的目录(自定义安装根据实际情况进行修改)
# 成功后,命令行提示符会变成以下形式:
# (base) xxx@xxx:~$如果你想在每次打开终端时都自动激活 Miniconda 环境,你可以将激活命令添加到你的 shell 配置文件中:
vim nano ~/.bashrc
#在文件末尾添加以下行:
source ~/miniconda3/bin/activate
#退出conda环境
conda deactivate
3.2.2 创建 RKNN-Toolkit2 Conda 环境
创建 RKNN-Toolkit2 开发 Conda 环境,
-n参数表示环境名称,指定 python 版本为3.8(建议版本)conda create -n RKNN-Toolkit2 python=3.9- 输入
y确认安装默认的安装包。
- 输入
进入 RKNN-Toolkit2 Conda 环境
conda activate RKNN-Toolkit2验证 Python 版本是否使用正确
python --version- 注意:部分开发环境在创建 Conda 环境后 Python 版本没有正常切换,重新启动终端可以解决。
获取 RKNN-Toolkit2 安装包
git clone https://github.com/airockchip/rknn-toolkit2.git进入文件夹
cd rknn-toolkit2安装 RKNN-Toolkit2 相关的依赖库,
cp38为对应的 Conda 环境 python 版本,实验使用的版本为 3.8 所以使用后缀为cp38的依赖项pip install tf-estimator-nightly==2.8.0.dev2021122109
pip install -r rknn-toolkit2/packages/requirements_cp39-2.2.0.txt -i https://pypi.mirrors.ustc.edu.cn/simple/不换源下载速度太慢会导致安装失败。如果更换源,有时你选择的镜像源可能暂时不可用或者受到访问限制,这可能会导致下载失败。你可以尝试切换到其他可用的镜像源。
#常用pip镜像源:
阿里云 http://mirrors.aliyun.com/pypi/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
豆瓣(douban) http://pypi.douban.com/simple/
清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/
安装 RKNN-Toolkit2
pip install rknn-toolkit2/packages/rknn_toolkit2-2.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl- 根据 python 版本,选择
packages文件夹下的安装包文件,其中的81f21f4d为 commit 号,根据实际情况进行选择。使用 python3.8 对应带有cp38后缀的安装包。
- 根据 python 版本,选择
验证是否安装成功,如果没有报错说明安装成功。
python
>>> from rknn.api import RKNN
4. rknn_model_zoo 应用示例
rknn_model_zoo 是瑞芯微官方提供的 RKNPU 支持的各种主流算法的部署示例,最新的示例支持 mobilenet 模型部署和 yolo 模型部署,本章以部署 yolov10 为例介绍 rknn_model_zoo 示例的使用。
4.1 导出 RKNN 模型
下载 rknn_model_zoo
git clone https://github.com/airockchip/rknn_model_zoo.git获取 Yolov10 ONNX 模型文件。
cd <rknn_model_zoo Path>/rknn_model_zoo/examples/yolov10/model
chmod a+x download_model.sh
./download_model.sh执行
rknn_model_zoo/examples/yolov10/python目录下的模型转换程序convert.py,使用方法:conda activate RKNN-Toolkit2
cd <rknn_model_zoo Path>/rknn_model_zoo/examples/yolov10/python
python3 convert.py ../model/yolov10n.onnx rk3576
# output model will be saved as ../model/yolov10.rknnpython3 convert.py <onnx_model> <TARGET_PLATFORM> <dtype(optional)> <output_rknn_path(optional)>参数介绍:
<onnx_model>:ONNX 模型路径<TARGET_PLATFORM>:指定 NPU 平台名,这里指rk3576<quant_dtype>:可选项,可以指定为i8或fp。i8表示进行量化,fp表示不量化,默认为i8<output_rknn_path>:可选项,用于指定 RKNN 模型的保存路径,默认保存在 ONNX 模型同一目录下,名称为yolov10n.rknn
4.2 编译和构建
成功将 ONNX 模型转换成 RKNN 模型后,现在对
rknn_model_zoo/examples/yolov10目录下的例程进行交叉编译,编译例程前需要设置如下环境变量:export GCC_COMPILER=/home/xt/Luckfox/omni3576/sdk-1026/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu执行 rknn_model_zoo 目录下的 build-linux.sh 脚本。该脚本将编译例程:
chmod +x ./build-linux.sh
./build-linux.sh -t rk3576 -a aarch64 -d yolov10编译过程:
(RKNN-Toolkit2) luckfox@luckfox:~/rknn_model_zoo$ ./build-linux.sh -t rk3576 -a aarch64 -d yolov10
./build-linux.sh -t rk3576 -a aarch64 -d yolov10
/home/xt/Luckfox/omni3576/sdk-1026/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu
===================================
BUILD_DEMO_NAME=yolov10
BUILD_DEMO_PATH=examples/yolov10/cpp
TARGET_SOC=rk3576
TARGET_ARCH=aarch64
BUILD_TYPE=Release
ENABLE_ASAN=OFF
DISABLE_RGA=OFF
INSTALL_DIR=/home/xt/conda/rknn_model_zoo/install/rk3576_linux_aarch64/rknn_yolov10_demo
BUILD_DIR=/home/xt/conda/rknn_model_zoo/build/build_rknn_yolov10_demo_rk3576_linux_aarch64_Release
CC=/home/xt/Luckfox/omni3576/sdk-1026/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc
CXX=/home/xt/Luckfox/omni3576/sdk-1026/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-g++
===================================
-- The C compiler identification is GNU 10.3.1
-- The CXX compiler identification is GNU 10.3.1
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /home/xt/Luckfox/omni3576/sdk-1026/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /home/xt/Luckfox/omni3576/sdk-1026/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-g++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- !!!!!!!!!!!CMAKE_SYSTEM_NAME: Linux
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed
-- Check if compiler accepts -pthread
-- Check if compiler accepts -pthread - yes
-- Found Threads: TRUE
-- Configuring done (0.4s)
-- Generating done (0.0s)
-- Build files have been written to: /home/xt/conda/rknn_model_zoo/build/build_rknn_yolov10_demo_rk3576_linux_aarch64_Release
[ 33%] Building C object utils.out/CMakeFiles/imageutils.dir/image_utils.c.o
[ 33%] Building C object utils.out/CMakeFiles/fileutils.dir/file_utils.c.o
[ 33%] Building C object utils.out/CMakeFiles/audioutils.dir/audio_utils.c.o
[ 33%] Building C object utils.out/CMakeFiles/imagedrawing.dir/image_drawing.c.o
[ 41%] Linking C static library libaudioutils.a
...
...
...
[100%] Linking CXX executable rknn_yolov10_demo
[100%] Built target rknn_yolov10_demo
[ 16%] Built target imageutils
[ 33%] Built target fileutils
[ 50%] Built target imagedrawing
[ 83%] Built target rknn_yolov10_demo
[100%] Built target audioutils
Install the project...
-- Install configuration: "Release"
-- Installing: /home/xt/conda/rknn_model_zoo/install/rk3576_linux_aarch64/rknn_yolov10_demo/./rknn_yolov10_demo
-- Set non-toolchain portion of runtime path of "/home/xt/conda/rknn_model_zoo/install/rk3576_linux_aarch64/rknn_yolov10_demo/./rknn_yolov10_demo" to "$ORIGIN/../lib"
-- Installing: /home/xt/conda/rknn_model_zoo/install/rk3576_linux_aarch64/rknn_yolov10_demo/model/bus.jpg
-- Installing: /home/xt/conda/rknn_model_zoo/install/rk3576_linux_aarch64/rknn_yolov10_demo/model/coco_80_labels_list.txt
-- Installing: /home/xt/conda/rknn_model_zoo/install/rk3576_linux_aarch64/rknn_yolov10_demo/model/yolov10.rknn
-- Installing: /home/xt/conda/rknn_model_zoo/install/rk3576_linux_aarch64/rknn_yolov10_demo/lib/librknnrt.so
-- Installing: /home/xt/conda/rknn_model_zoo/install/rk3576_linux_aarch64/rknn_yolov10_demo/lib/librga.so
交叉编译完成后在 rknn_model_zoo 目录下会生成一个 install 目录,包含编译出来的程序和库文件。
(RKNN-Toolkit2) ubuntu@ubuntu:~/conda/rknn_model_zoo/install/rk3576_linux_aarch64/rknn_yolov10_demo$ ls
lib model rknn_yolov10_demo
4.3 运行程序
先将整个
rknn_yolov10_demo目录传输至开发板,然后执行下面指令运行程序:scp -r rknn_yolov10_demo/ luckfox@192.168.253.105:/home/luckfox推理完成后生成图片
out.pngluckfox@luckfox:~/rknn_yolov10_demo$ ./rknn_yolov10_demo ./model/yolov10.rknn ./model/bus.jpg
load lable ./model/coco_80_labels_list.txt
model input num: 1, output num: 6
input tensors:
index=0, name=images, n_dims=4, dims=[1, 640, 640, 3], n_elems=1228800, size=1228800, fmt=NHWC, type=INT8, qnt_type=AFFINE, zp=-128, scale=0.003922
output tensors:
index=0, name=487, n_dims=4, dims=[1, 64, 80, 80], n_elems=409600, size=409600, fmt=NCHW, type=INT8, qnt_type=AFFINE, zp=-38, scale=0.114574
index=1, name=501, n_dims=4, dims=[1, 80, 80, 80], n_elems=512000, size=512000, fmt=NCHW, type=INT8, qnt_type=AFFINE, zp=-128, scale=0.002001
index=2, name=508, n_dims=4, dims=[1, 64, 40, 40], n_elems=102400, size=102400, fmt=NCHW, type=INT8, qnt_type=AFFINE, zp=-57, scale=0.095044
index=3, name=522, n_dims=4, dims=[1, 80, 40, 40], n_elems=128000, size=128000, fmt=NCHW, type=INT8, qnt_type=AFFINE, zp=-128, scale=0.003505
index=4, name=529, n_dims=4, dims=[1, 64, 20, 20], n_elems=25600, size=25600, fmt=NCHW, type=INT8, qnt_type=AFFINE, zp=-58, scale=0.061253
index=5, name=543, n_dims=4, dims=[1, 80, 20, 20], n_elems=32000, size=32000, fmt=NCHW, type=INT8, qnt_type=AFFINE, zp=-128, scale=0.003792
model is NHWC input fmt
model input height=640, width=640, channel=3
origin size=640x640 crop size=640x640
input image: 640 x 640, subsampling: 4:2:0, colorspace: YCbCr, orientation: 1
scale=1.000000 dst_box=(0 0 639 639) allow_slight_change=1 _left_offset=0 _top_offset=0 padding_w=0 padding_h=0
rga_api version 1.10.1_[0]
rknn_run
bus @ (88 137 556 438) 0.925
person @ (109 234 225 536) 0.910
person @ (210 240 284 511) 0.906
person @ (478 233 560 519) 0.796
person @ (80 330 114 518) 0.428
write_image path: out.png width=640 height=640 channel=3 data=0x7fbdd5c010
luckfox@luckfox:~/rknn_yolov10_demo$ ls
lib model out.png rknn_yolov10_demo您可以根据标签自行下载图片,相关标签文件位于
rknn_yolov10_demo/model/coco_80_labels_list.txt。例如,对象检测器能够定位图片中的办公用品。./rknn_yolov10_demo ./model/yolov10.rknn ./model/laptop.jpg- 推理结果:

- 推理结果: