RK3588芯片NPU:替换官方Demo中的rknn模型文件指南

7 次阅读

RK3588作为瑞芯微新一代高性能AIoT芯片,集成了强大的NPU神经网络处理单元,能够在边缘设备上实现目标检测、图像分类、人脸识别等AI推理任务。开发者在进行RK3588 NPU应用开发时,通常会基于官方提供的RKNN Demo进行二次开发,而替换官方Demo中的.rknn模型文件,是适配自定义算法模型的重要步骤。AIM-Linux开发中心+1

许多初次接触RKNN开发的工程师,会遇到模型替换后无法加载、推理结果异常、输出维度不匹配等问题。本文详细介绍RK3588芯片NPU环境下替换官方Demo中rknn模型文件的方法,包括模型转换、文件替换、代码修改以及常见问题排查。

RK3588 NPU与RKNN模型简介

RK3588内置NPU采用Rockchip自主研发的AI加速架构,支持INT8量化、FP16等多种计算模式。为了让深度学习模型能够运行在NPU上,通常需要通过RKNN-Toolkit2将原始模型转换为.rknn格式。AIM-Linux开发中心

常见模型转换流程如下:

PyTorch / TensorFlow / ONNX模型
            ↓
      RKNN-Toolkit2转换
            ↓
        xxx.rknn模型
            ↓
      RK3588 NPU推理运行

官方提供的Demo通常已经包含一个测试模型,例如:

model/RK3588/yolov5s-640-640.rknn

开发者只需要将该模型替换为自己的模型,即可快速验证算法效果。

替换rknn模型前的准备工作

在替换官方Demo模型之前,需要确认以下几个条件:

1. 模型已经转换为RKNN格式

RK3588 NPU不能直接运行.onnx、.pt等训练模型,需要提前转换。

例如:

python convert.py 
model.onnx 
rk3588 
--output_path my_model.rknn

转换过程中需要指定目标平台:

target_platform='rk3588'

否则生成的模型可能无法充分利用RK3588 NPU能力。

2. 确认模型输入输出一致

官方Demo不仅依赖模型文件,还依赖固定的输入输出格式。

例如YOLOv5 Demo默认:

输入:

1 × 640 × 640 × 3

输出:

检测框坐标
类别概率
置信度

如果替换后的模型输入尺寸发生变化,例如:

640×640

变成:

320×320

则必须同步修改前处理代码,否则会导致推理异常。

查找官方Demo中的模型文件位置

不同版本Demo目录结构可能存在差异,但通常类似:

rknn_yolov5_demo
│
├── model
│   └── RK3588
│       └── yolov5s-640-640.rknn
│
├── src
├── include
├── lib
└── build

其中:

model/RK3588/

就是存放RK3588平台模型文件的位置。

例如官方默认:

yolov5s-640-640.rknn

替换为:

my_yolov5.rknn

即可。

RKNN官方示例通常通过命令参数加载模型,也就是运行程序时指定.rknn路径,而不是固定写死在程序内部。Hugging Face+1

方法一:直接替换模型文件(推荐)

如果自己的模型结构与官方Demo完全一致,可以直接替换。

例如:

原文件:

model/RK3588/yolov5s-640-640.rknn

备份:

mv yolov5s-640-640.rknn yolov5_backup.rknn

复制新模型:

cp my_model.rknn model/RK3588/yolov5s-640-640.rknn

保持文件名不变。

这样无需修改任何代码,Demo启动时会自动加载新的模型。

这种方式适用于:

  • YOLOv5不同训练权重

  • 同输入尺寸目标检测模型

  • 类别数量一致的模型

方法二:修改Demo中的模型路径

如果希望保留多个模型,可以修改代码路径。

例如C++代码中:

C++
const char* model_path = "model/RK3588/yolov5s-640-640.rknn";

修改为:

C++
const char* model_path = "model/RK3588/custom_model.rknn";

重新编译:

./build-linux.sh -t rk3588 -a aarch64

生成新的可执行文件。

运行:

./rknn_yolov5_demo 
model/RK3588/custom_model.rknn 
model/test.jpg

官方Demo通常支持通过命令行参数传入模型路径,例如:

./rknn_yolov5_demo model/yolov5.rknn model/bus.jpg

这种方式更加灵活。Hugging Face

替换模型后必须检查的几个地方

仅替换.rknn文件并不一定能够成功运行,还需要检查以下配置。

1. 类别数量配置

YOLO系列模型通常需要配置类别数量。

例如:

C++
#define OBJ_CLASS_NUM 80

如果训练自己的数据集:

person
car
helmet

只有3个类别,则修改:

C++
#define OBJ_CLASS_NUM 3

否则后处理会出现类别解析错误。

2. 标签文件

检查:

model/coco_80_labels_list.txt

替换为自己的标签:

helmet
worker
vehicle

否则检测结果显示仍然是COCO类别。

3. 后处理逻辑

不同模型输出结构可能不同。

例如:

YOLOv5:

bbox + confidence + class

YOLOv8:

bbox + class score

如果直接替换模型但不修改后处理代码,会出现:

  • 检测框错误

  • 类别乱码

  • 无检测结果

将模型部署到RK3588开发板

模型替换完成后,需要重新部署Demo。

Linux环境:

复制文件:

adb push rknn_yolov5_demo 
/userdata/

进入设备:

adb shell

设置运行环境:

export LD_LIBRARY_PATH=./lib

执行:

./rknn_yolov5_demo 
model/custom_model.rknn 
model/test.jpg

如果运行成功,会输出模型加载信息:

Loading model...
rknn_init success
input num:1
output num:3

并生成推理结果。

常见错误与解决方法

错误一:rknn_init failed

提示:

rknn_init failed

原因:

  • RKNN版本不匹配

  • 模型不是RK3588目标平台

  • 模型文件损坏

解决:

重新使用RKNN-Toolkit2转换:

Python
运行
target_platform='rk3588'

并确认开发板运行时库版本匹配。


错误二:模型加载成功但没有检测结果

可能原因:

  1. 输入尺寸不一致

例如模型需要:

320×320

Demo仍然输入:

640×640
  1. 置信度阈值过高

修改:

C++
box_conf_threshold

例如:

C++
0.25

降低到:

C++
0.15

测试。

  1. 类别数量错误

检查:

C++
OBJ_CLASS_NUM

配置。


错误三:输出结果类别错误

原因:

标签文件没有替换。

解决:

修改:

labels.txt

或者:

coco_80_labels_list.txt

替换为训练数据集对应标签。

RK3588替换rknn模型的最佳实践

为了提高开发效率,建议采用以下流程:

第一步:

使用自己的数据训练模型。

第二步:

导出ONNX格式。

第三步:

通过RKNN-Toolkit2转换:

ONNX
↓
RKNN
↓
RK3588 NPU

第四步:

复制模型到Demo目录。

第五步:

根据模型结构调整:

  • 输入尺寸

  • 类别数量

  • 标签文件

  • 后处理代码

第六步:

在开发板运行测试。

这种方式可以最大程度减少模型替换过程中的兼容性问题。

总结

RK3588 NPU替换官方Demo中的rknn模型文件,本质上是将官方提供的测试模型替换为经过RKNN-Toolkit2转换后的自定义AI模型。简单场景下,只需要替换.rknn文件即可运行;复杂场景则需要同步调整输入尺寸、类别数量以及后处理代码。

掌握RKNN模型替换流程后,开发者可以快速将YOLO、MobileNet、分类模型等AI算法部署到RK3588平台,实现高性能、低功耗的边缘AI推理应用。