跳到主要内容

RKNN 推理测试

1. RKNPU 简介

NPU(Nerual Processing Unit)是一种专门用于加速神经网络计算的处理器。为了满足人工智能的需求,瑞芯微逐渐将NPU集成到其处理器中,这种内置于瑞芯微处理器的NPU被称为RKNPU。LuckFox Core3576 系列核心板搭载瑞芯微 RK3576 芯片,内置瑞芯微自研NPU。该NPU具有高运算精度,支持 INT4、INT8、INT16/FP16/BF16、TF32 混合量化。要使用RKNPU2的SDK和工具套件。

数据类型INT8INT16/FP16/BF16INT4TF32
单核算力(TOPS)2140.5
双核算力(TOPS)4381
稀疏算力(TOPS)63\ \

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 本地安装

  1. 环境要求

    操作系统版本Ubuntu18.04(x64)Ubuntu20.04(x64)Ubuntu22.04(x64)
    Python版本3.6/3.73.8/3.93.10/3.11
  2. 下载rknn-toolkit2

    git clone https://github.com/airockchip/rknn-toolkit2.git
  3. 安装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
  4. 安装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.6requirements_cp36-2.2.0.txt
    3.7requirements_cp37-2.2.0.txt
    3.8requirements_cp38-2.2.0.txt
    3.9requirements_cp39-2.2.0.txt
    3.10requirements_cp310-2.2.0.txt
    3.11requirements_cp311-2.2.0.txt
    3.12requirements_cp312-2.2.0.txt
  5. 安装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.6rknn_toolkit2-2.2.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
    3.7rknn_toolkit2-2.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
    3.8rknn_toolkit2-2.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
    3.9rknn_toolkit2-2.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
    3.10rknn_toolkit2-2.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
    3.11rknn_toolkit2-2.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
    3.12rknn_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 工具

  1. 检查是否安装了miniconda 或其他 conda 工具,如果有输出版本号说明已经安装。

    conda --version
  2. 下载安装包

    wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-4.6.14-Linux-x86_64.sh
  3. 安装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 初始化 。

  4. 在计算机的终端窗口,进入 Conda base环境

    source ~/miniconda3/bin/activate # miniconda3 安装的目录(自定义安装根据实际情况进行修改)
    # 成功后,命令行提示符会变成以下形式:
    # (base) xxx@xxx:~$
  5. 如果你想在每次打开终端时都自动激活 Miniconda 环境,你可以将激活命令添加到你的 shell 配置文件中:

    vim nano ~/.bashrc

    #在文件末尾添加以下行:
    source ~/miniconda3/bin/activate

    #退出conda环境
    conda deactivate

3.2.2 创建 RKNN-Toolkit2 Conda 环境

  1. 创建 RKNN-Toolkit2 开发 Conda 环境, -n 参数表示环境名称,指定 python 版本为3.8(建议版本)

    conda create -n RKNN-Toolkit2 python=3.9
    • 输入 y 确认安装默认的安装包。
  2. 进入 RKNN-Toolkit2 Conda 环境

    conda activate RKNN-Toolkit2
  3. 验证 Python 版本是否使用正确

    python --version
    • 注意:部分开发环境在创建 Conda 环境后 Python 版本没有正常切换,重新启动终端可以解决。
  4. 获取 RKNN-Toolkit2 安装包

    git clone https://github.com/airockchip/rknn-toolkit2.git
  5. 进入文件夹

    cd rknn-toolkit2
  6. 安装 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/
  7. 安装 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 后缀的安装包。
  8. 验证是否安装成功,如果没有报错说明安装成功。

    python
    >>> from rknn.api import RKNN

4. rknn_model_zoo 应用示例

rknn_model_zoo 是瑞芯微官方提供的 RKNPU 支持的各种主流算法的部署示例,最新的示例支持 mobilenet 模型部署和 yolo 模型部署,本章以部署 yolov10 为例介绍 rknn_model_zoo 示例的使用。

4.1 导出 RKNN 模型

  1. 下载 rknn_model_zoo

    git clone https://github.com/airockchip/rknn_model_zoo.git
  2. 获取 Yolov10 ONNX 模型文件。

    cd <rknn_model_zoo Path>/rknn_model_zoo/examples/yolov10/model
    chmod a+x download_model.sh
    ./download_model.sh
  3. 执行 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.rknn
    python3 convert.py <onnx_model> <TARGET_PLATFORM> <dtype(optional)> <output_rknn_path(optional)>

    参数介绍:

    • <onnx_model>:ONNX 模型路径
    • <TARGET_PLATFORM>:指定 NPU 平台名,这里指rk3576
    • <quant_dtype> :可选项,可以指定为i8fpi8表示进行量化,fp表示不量化,默认为i8
    • <output_rknn_path>:可选项,用于指定 RKNN 模型的保存路径,默认保存在 ONNX 模型同一目录下,名称为yolov10n.rknn

4.2 编译和构建

  1. 成功将 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
  2. 执行 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
  3. 交叉编译完成后在 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 运行程序

  1. 先将整个 rknn_yolov10_demo 目录传输至开发板,然后执行下面指令运行程序:

    scp -r rknn_yolov10_demo/ luckfox@192.168.253.105:/home/luckfox
  2. 推理完成后生成图片 out.png

    luckfox@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
  3. 您可以根据标签自行下载图片,相关标签文件位于 rknn_yolov10_demo/model/coco_80_labels_list.txt。例如,对象检测器能够定位图片中的办公用品。

    ./rknn_yolov10_demo ./model/yolov10.rknn ./model/laptop.jpg 
    • 推理结果: