RKNN上手指南
本文基于yolov5模型,介绍RKNN的模型转换、连板调试,以及板端部署的详细步骤。
模型下载
进入 rknn_model_zoo/examples/yolov5/model 目录,运行 download_model.sh 脚本,该脚本将下载一个可用的 YOLOv5 ONNX 模型,并存放在当前 model 目录下,参考命令如下:
cd rknn_model_zoo/examples/yolov5/model
# 运行 download_model.sh 脚本,下载 yolov5 onnx 模型
# 例如,下载好的 onnx 模型存放路径为 model/yolov5s_relu.onnx
./download_model.sh
模型转换
进入 rknn_model_zoo/examples/yolov5/python 目录,运行 convert.py 脚本,该脚本将原始的 ONNX 模型转成 RKNN 模型,参考命令如下:
cd rknn_model_zoo/examples/yolov5/python
# 运行 convert.py 脚本,将 yolov5 onnx 模型转换为 rknn 模型
# 例如,转换好的 rknn 模型存放路径为 model/yolov5s_relu.rknn
python convert.py ../model/yolov5s_relu.onnx rk3588 i8 ../model/yolov5s_relu.rknn
rknn_convert 是RKNN-Toolkit2提供的一套常用模型转换工具,通过封装上述API接口,用户只需编辑模型对应的 yml 配置文件,就可以通过指令转换模型。以下是如何使用 rknn_convert 工具的示例命令以及支持的 指令参数:
python -m rknn.api.rknn_convert -t rk3588 -i ./model_config.yml -o ./output_path
通过使用上述命令和参数,用户可以将模型转换为RKNN格式,并将转换后的模型保存到指定的输出路径。支持的指令参数说明如下:
- -i: 模型配置文件(.yml)路径。
- -o: 转换后模型输出路径。
- -t: target_platform,目标平台可以选择rv1103,rv1103b, rv1106,rv1106b,rk2118,rk3562,rk3566,rk3568,rk3576或rk3588。
- -e: (选填) 评估连板运行时model的耗时和内存占用,若开启请输入-e。 注:一定要连接相应开发板并 正确设置 target_platform ,否则会报错,当有多设备时可通过 -d 参数指定设备ID。
- -a: (选填)评估生成的rknn模型精度,开启模拟器精度评估请输入-a "xx1.jpg xx2.jpg",若要开启连板 精度评估请配合-d参数使用。
- -v: (选填)指定是否要在屏幕上打印详细日志信息,若开启打印模式请输入-v。
- -d: (选填)单个adb设备使用-d,多adb设备使用-d device_id,device_id通过adb devices查询。
连板调试
进入 rknn_model_zoo/examples/yolov5/python 目录,运行 yolov5.py 脚本,便可通过连板调试的方式在板端运 行 YOLOv5 模型,参考命令如下:
cd rknn_model_zoo/examples/yolov5/python
# 运行 yolov5.py 脚本,在板端运行 yolov5 模型
# 用法: python yolov5.py --model_path {rknn_model} --target {target_platform} --img_show
python yolov5.py --model_path ../model/yolov5s_relu.rknn --target rk3588 --img_show
如果想先在计算机端运行原始的 onnx 模型,可以参考以下命令:
# 用法: python yolov5.py --model_path {onnx_model} --img_show
python yolov5.py --model_path ../model/yolov5s_relu.onnx --img_show
在连板调试时,需要通过USB线连接板端和计算机端,并开启adb调试。
默认输入图片是 model/bus.jpg ,输出图片如下所示:
板端部署
将转换好的 rknn 模型拷贝到板端,本示例中模型路径为 /home/rockchip/rknn_model_zoo/model/yolov5s_relu.rknn 板端可以采用python或者C++进行部署,在实际部署中,C++部署的性能优于python部署。
- python
- C++
修改板端 rknn_model_zoo/py_utils/rknn_executor.py 代码,请备份原版代码。
# 进入板端
adb shell
# 进入 rknn_model_zoo 目录
cd /home/rockchip/rknn_model_zoo
# 备份原版代码
cp py_utils/rknn_executor.py py_utils/rknn_executor.py.bak
# 修改 rknn_executor.py 代码
vim py_utils/rknn_executor.py
修改 rknn_executor.py 代码,将 rknn_executor.py 文件中以下代码:
rknn_executor.py
from rknnlite.api import RKNNLite as RKNN
class RKNN_model_container():
def __init__(self, model_path, target=None, device_id=None) -> None:
rknn = RKNN()
rknn.load_rknn(model_path)
ret = rknn.init_runtime()
self.rknn = rknn
def run(self, inputs):
if self.rknn is None:
print("ERROR: rknn has been released")
return []
if isinstance(inputs, list) or isinstance(inputs, tuple):
pass
else:
inputs = [inputs]
result = self.rknn.inference(inputs=inputs)
return result
def release(self):
self.rknn.release()
self.rknn = None
修改 rknn_model_zoo/examples/yolov5/python/yolov5.py 262 行的代码
262 outputs = model.run([np.expand_dims(input_data, 0)])
在板端运行 yolov5 示例代码,参考以下命令:
cd rknn_model_zoo/examples/yolov5/python
python3 yolov5.py --model_path ../model/yolov5s_relu.rknn --img_show
完整运行一个 RKNN C Demo,有两种方式:
- 在PC端先将 C/C++ 源代码通过交叉编译成可执行文件,然后将可执行文件、模型文件、测试图片等相关文件推送到板端上,最后在板端运行可执行文件。
- 拷贝rknn模型到板端,然后在板端编译成可执行文件,再直接在板端运行可执行文件。
本示例采用第二种方式: 拷贝rknn模型到板端
adb push model/yolov5s_relu.rknn /home/toybrick/rknn_model_zoo/model/
进入rknn_model_zoo目录,编译rknn模型
cd Projects/rknn_model_zoo
chmod +x build-linux.sh
# 编译rknn模型
# 用法:./build-linux.sh -t <target> -a <arch> -d <build_demo_name> [-b <build_type>] [-m]
# -t : target (rk356x/rk3588) # 平台类型,rk3568/rk3566 都统一为rk356x
# -a : arch (aarch64/armhf) # 板端系统架构
# -d : demo name # 对应 examples 目录下子文件夹的名称,如yolov5、mobilenet
# -b : build_type(Debug/Release)
# -m : enable address sanitizer, build_type need set to Debug
./build-linux.sh -t rk3588 -a aarch64 -d yolov5
编译完成后,在 rknn_model_zoo/install/rk3588_linux_aarch64目录下会生成可执行文件 rknn_yolov5_demo
./rknn_yolov5_demo model/yolov5s_relu.rknn model/bus.jpg
运行结果如下图所示: