跳到主要内容

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 ,输出图片如下所示:

yolov5-bus

板端部署

将转换好的 rknn 模型拷贝到板端,本示例中模型路径为 /home/rockchip/rknn_model_zoo/model/yolov5s_relu.rknn 板端可以采用python或者C++进行部署,在实际部署中,C++部署的性能优于python部署。

修改板端 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

yolov5-result