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'
并确认开发板运行时库版本匹配。
错误二:模型加载成功但没有检测结果
可能原因:
-
输入尺寸不一致
例如模型需要:
320×320
Demo仍然输入:
640×640
-
置信度阈值过高
修改:
C++box_conf_threshold
例如:
C++0.25
降低到:
C++0.15
测试。
-
类别数量错误
检查:
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推理应用。