前言
在上一篇文章中,我介绍了如何在瑞芯微 Rockchip 系列芯片将主流深度学习框架模型转换为 RKNN 模型。在这篇文章,我将介绍如何在瑞芯微 Rockchip 系列 RK3588 芯片上部署 yolo11 模型推理。本文章会使用到上一篇文章转换的 rknn 模型,因此如果还没看过上一篇文章的同学,建议优先阅读上一篇文章。
本教程不仅适合 RK3588 平台,也适合其他 RK 系列平台,例如 RK3566、RK3568、RK3562 等。具体平台请参考 RKNN-Toolkit2 文档。
板端 NPU 驱动环境确认
确保你的板端使用了 Rockchip 固件刷入,Rockchip 固件默认自带 NPU 驱动,使用如下命令查看驱动版本:
dmesg | grep -i rknpu
# 或
cat /sys/kernel/debug/rknpu/version
# 或
cat /sys/kernel/debug/rknpu/driver_version
# 或
cat /proc/debug/rknpu/driver_version
打印如下:
[ 5.641038] RKNPU fdab0000.npu: Adding to iommu group 0
[ 5.645141] RKNPU fdab0000.npu: RKNPU: rknpu iommu is enabled, using iommu mode
[ 5.651052] RKNPU fdab0000.npu: Looking up rknpu-supply from device tree
[ 5.657737] RKNPU fdab0000.npu: Looking up mem-supply from device tree
[ 5.658410] RKNPU fdab0000.npu: can't request region for resource [mem 0xfdab0000-0xfdabffff]
[ 5.663132] RKNPU fdab0000.npu: can't request region for resource [mem 0xfdac0000-0xfdacffff]
[ 5.667732] RKNPU fdab0000.npu: can't request region for resource [mem 0xfdad0000-0xfdadffff]
[ 5.673037] [drm] Initialized rknpu 0.9.8 20240828 for fdab0000.npu on minor 1
[ 5.677369] RKNPU fdab0000.npu: Looking up rknpu-supply from device tree
[ 5.677977] RKNPU fdab0000.npu: Looking up mem-supply from device tree
[ 5.678855] RKNPU fdab0000.npu: Looking up rknpu-supply from device tree
[ 5.680912] RKNPU fdab0000.npu: RKNPU: bin=0
[ 5.684056] RKNPU fdab0000.npu: leakage=7
[ 5.686957] RKNPU fdab0000.npu: Looking up rknpu-supply from device tree
[ 5.686976] debugfs: Directory 'fdab0000.npu-rknpu' with parent 'vdd_npu_s0' already present!
[ 5.697891] RKNPU fdab0000.npu: pvtm=836
[ 5.706536] RKNPU fdab0000.npu: pvtm-volt-sel=2
[ 5.711939] RKNPU fdab0000.npu: avs=0
[ 5.716542] RKNPU fdab0000.npu: l=10000 h=85000 hyst=5000 l_limit=0 h_limit=800000000 h_table=0
[ 5.731861] RKNPU fdab0000.npu: failed to find power_model node
[ 5.736109] RKNPU fdab0000.npu: RKNPU: failed to initialize power model
[ 5.744664] RKNPU fdab0000.npu: RKNPU: failed to get dynamic-coefficient
[ 577.469647] RKNPU fdab0000.npu: RKNPU: iommu still enabled
可以看到,我的 npu 驱动版本为 0.98。
NPU 推理流程
RKNN通用 API 接口调用流程:
- 调用
rknn_init()
接口初始化模型; - 调用
rknn_query()
接口查询模型的输入输出属性; - 对输入进行前处理;
- 调用
rknn_inputs_set()
接口设置输入数据; - 调用
rknn_run()
接口进行模型推理; - 调用
rknn_outputs_get()
接口获取推理结果数据; - 对输出进行后处理;
- 调用
rknn_outputs_release()
接口释放输出数据内存; - 调用
rknn_destroy()
接口销毁RKNN
代码示例
下面我将手把手教大家如何在 RK3588 上部署 yolo11 模型推理,其他 RK 系列平台同理。
这里需要用到一个库,rknn_model_zoo,这个库里面包含了各种示例代码,方便我们快速上手。
首先,运行如下命令下载 rknn_model_zoo 库:
git clone https://github.com/airockchip/rknn_model_zoo.git
因为需要在板端运行,因此我们需要安装交叉编译工具链进行交叉编译,这里以 aarch64 为例,运行如下命令:
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
接着,进入 rknn_model_zoo 目录,该目录下有个 build-linux.sh 文件,在文件开头位置添加如下命令:
# Projects 是你刚刚下载的 gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu 的绝对路径
GCC_COMPILER=Projects/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu
将我们在上篇文章中编译的 yolo11n.rknn 放到 当前目录下的 examples/yolo11/model 目录中,如果没有这个文件,可以运行如下命令进行下载:
wget -P examples/yolo11/model https://github.com/qaz624824554/rknn_trans_test/raw/refs/heads/master/yolo11n.rknn
接着,运行如下命令,编译 yolo11 模型示例:
chmod +x build-linux.sh
./build-linux.sh -t rk3588 -a aarch64 -d yolo11
如果看到如下输出,说明编译成功。
此时会在当前目录下生成一个 install 目录,里面包含编译好的可执行文件。目录结构如下:
install
└── rk3588_linux_aarch64
└── rknn_yolo11_demo
├── lib
│ ├── librga.so
│ └── librknnrt.so
├── model
│ ├── bus.jpg
│ ├── coco_80_labels_list.txt
│ └── yolo11n.rknn
├── rknn_yolo11_demo
└── rknn_yolo11_demo_zero_copy
将 rknn_yolo11_demo
目录放到板端,并且进入该目录,接着运行如下命令进行推理:
export LD_LIBRARY_PATH=./lib
./rknn_yolo11_demo model/yolo11n.rknn model/bus.jpg
如果看到如下输出,说明推理成功,并且当前目录下会生成一个 out.png 的图片。
图片的效果如下:
至此,我们成功实现了在 RK3588 上部署了 yolo11 模型推理。
改进
由于这个推理示例代码是基于单帧单张图片的,因此无法进行实时推理。不过只要稍微改进,例如配合 opencv 库,就可以实现实时推理了,这个我会在后续的文章中进行介绍,有兴趣的同学可以点波关注哟。