基于RV1126开发板的rknn-toolkit-lite使用方法
1. rknn-toolkit-lite介绍
rknn-toolkit-lite是用于python算法的推理的组件,当前已经在EASY-EAI-Nano完成适配,用户可以用它进行深度学习算法的纯python开发。而且同时支持已经进行了预编译的模型,短短几行代码即可完成算法的推理,大幅降低开发成本。同时很多不熟悉C/C++的算法开发人员有效降低开发门槛。本地文档是根据已经完成rknn模型转换的模型进行板卡上的推理,关于rknn模型转换请阅读请阅读《在EASY EAI Nano运行自定义的AI算法》。
2. 固件烧录
当前我们通过系统预装的方式支持rknn-toolkit-lite,烧录固件方式请阅读《固件烧录与更新》。
固件下载链接:https://pan.baidu.com/s/1sWFoPf6oJtZsUPp-_do7AQ
提取码:1234
固件包如下所示:
3. 在板卡测试demo
下载百度网盘:https://pan.baidu.com/s/1yoof_SyY1ty93dIRe1dZgA (提取码:1234 )
“测试程序/inference_with_lite.tar.bz2”,把文件传到EASY-EAI-Nano板卡目录上。
执行以下指令进行解压:
tar xvf inference_with_lite.tar.bz2
执行以下指令切换目录并执行测试程序:
cd /userdata/inference_with_lite/
python3 test.py
结果如下所示:
4. rknn-toolkit-lite流程说明
4.1 使用流程图
RKNN Tookit Lite使用流程如下:
4.2 例程
第三小节的例程如下所示:
import platform
import cv2
import numpy as np
from rknnlite.api import RKNNLiteRKNN_MODEL = '10class_ResNet50_pre.rknn'
IMG_PATH = './test-1.jpg'
INPUT_SIZE = 224BOX_THRESH = 0.25
NMS_THRESH = 0.6CLASSES = ("SUV", "bus", "family sedan", "fire engine", "heavy truck", "jeep", "minibus", "racing car", "taxi", "truck")def show_outputs(output):print("softmax output:", output)max_confidence = np.max(output)index = np.where(output == max_confidence)print("max confidence:", max_confidence)print("max confidence index:", index[0][0])print("CLASSES predict: ", CLASSES[index[0][0]])def softmax(x):return np.exp(x)/sum(np.exp(x))if __name__ == '__main__':rknn_lite = RKNNLite()# load RKNN modelprint('--> Load RKNN model')ret = rknn_lite.load_rknn(RKNN_MODEL)if ret != 0:print('Load RKNN model failed')exit(ret)print('done')# Set inputsimg = cv2.imread(IMG_PATH)img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)resize_img = cv2.resize(img,(224,224))# init runtime environmentprint('--> Init runtime environment')ret = rknn_lite.init_runtime(target=None)if ret != 0:print('Init runtime environment failed')exit(ret)print('done')# Inferenceprint('--> Running model')outputs = rknn_lite.inference(inputs=[resize_img])print("outputs[0]:", outputs[0])print("outputs[0].shape:", outputs[0].shape)show_outputs(softmax(np.array(outputs[0][0])))rknn_lite.release()
5. API详细说明
5.1 RKNNLite初始化及对象释放
在使用RKNN Toolkit Lite时,都需要先调用RKNNLite()方法初始化一个RKNNLite对象,并在用完后调用该对象的release()方法将资源释放掉。
初始化RKNNLite对象时,可以设置verbose和verbose_file参数,以打印详细的日志信息。其中verbose参数指定是否要在屏幕上打印详细日志信息;如果设置了verbose_file参数,且verbose参数值为True,日志信息还将写到这个参数指定的文件中。
举例如下:
# 将详细的日志信息输出到屏幕,并写到inference.log文件中
rknn_lite = RKNNLite(verbose=True, verbose_file='./inference.log') # 只在屏幕打印详细的日志信息
rknn_lite = RKNNLite(verbose=True)
…
rknn_lite.release()
5.2 加载RKNN模型
API | Load_rknn |
描述 | 加载RKNN模型。 |
参数 | path:RKNN模型文件路径 |
load_model_in_npu: 是否直接加载npu中的rknn模型。其中path为rknn模型在npu中的路径。只有当RKNN Toolkit Lite运行在连有NPU设备的PC上或RK3399Pro Linux开发板时才可以设为True。默认值为False. | |
返回值 | 0:加载成功 |
-1:加载失败 |
举例如下:
# 从当前目录加载 ResNet50模型
ret = rknn_lite.load_rknn('10class_ResNet50_pre.rknn')
5.3 初始化运行时环境
在模型推理之前,必须先初始化运行时环境,确定模型在哪一个芯片平台上运行。
API | init_runtime |
描述 | 初始化运行时环境。确定模型运行的设备信息(芯片型号、设备 ID)。 |
参数 | target:目标硬件平台,目前支持“rk3399pro”、“rk1806”、“rk1808”、“rv1109”、 “rv1126”。默认为 None,将根据应用所运行的开发板自动选择。 |
device_id:设备编号,如果 PC 连接多台智能设备时,需要指定该参数,设备编号可 以通过”list_devices”接口查看。默认值为 None。 | |
async_mode:是否使用异步模式。调用推理接口时,涉及设置输入图片、模型推理、 获取推理结果三个阶段。如果开启了异步模式,设置当前帧的输入将与推理上一帧同 时进行,所以除第一帧外,之后的每一帧都可以隐藏设置输入的时间,从而提升性能。 在异步模式下,每次返回的推理结果都是上一帧的。该参数的默认值为 False。 | |
返回值 | 0:加载成功 |
-1:加载失败 |
举例如下:
# init runtime environmentprint('--> Init runtime environment')ret = rknn_lite.init_runtime(target=None)if ret != 0:print('Init runtime environment failed')exit(ret)print('done')
5.4 模型推理
API | inference |
描述 | 对指定输入进行推理,返回推理结果。 |
参数 | inputs:待推理的输入,如经过 cv2 处理的图片。类型是 list,列表成员是 ndarray。 |
data_type:输入数据的类型,可填以下值:’float32’, ‘float16’, ‘uint8’, ‘int8’, ‘int16’。 默认值为’uint8’。 | |
data_format:数据模式,可以填以下值: “nchw”, “nhwc”。默认值为’nhwc’。这两个的 不同之处在于 channel 放置的位置。 | |
inputs_pass_through: 将输入透传给 NPU 驱动。非透传模式下,在将输入传给 NPU 驱 动之前,工具会对输入进行减均值、除方差等操作;而透传模式下,不会做这些操作。 这个参数的值是一个数组,比如要透传 input0,不透传 input1,则这个参数的值为[1, 0]。默认值为 None,即对所有输入都不透传。 | |
返回值 | results:推理结果,类型是 list,列表成员是 ndarray。 |
举例如下:
以分类模型为例,如 resnet50,代码如下(完整代码参考第三小节):
# Inferenceprint('--> Running model')outputs = rknn_lite.inference(inputs=[resize_img])print("outputs[0]:", outputs[0])print("outputs[0].shape:", outputs[0].shape)show_outputs(softmax(np.array(outputs[0][0])))
5.5 查询 SDK 版本
API | get_sdk_version |
描述 | 获取 SDK API 和驱动的版本号。 注:使用该接口前必须完成模型加载和初始化运行环境。 |
参数 | 无 |
返回值 | sdk_version:API 和驱动版本信息。类型为字符串 |
举例说明:
# 获取 SDK 版本信息
……
sdk_version = rknn_lite.get_sdk_version()
……
返回的 SDK 信息如下: