前言
作者使用的平台为Ubuntu20.04虚拟系统,开发板为瑞芯微RK3588,开发板上的系统为Ubuntu22.04系统。
一、任务
完成RKNN模型的部署,RKNN模型的部署是将RKNN模型放到开发板上,应用程序可以加载RKNN模型,从而在嵌入式设备上完成推理计算的任务。
瑞芯微提供了两种嵌入式部署方式,一种是使用RKNPU2 SDK的C接口进行部署,另一种是使用 RKNN Toolkit lite2 提供的Python接口进行部署,也即我们今天要介绍的内容。
借助 RKNN Toolkit lite2 在RK3588开发板上部署RKNN模型
二、 RKNN Tool kit lite2 使用流程
在编写代码之前,把rknn模型以及要测试的图片放入项目文件夹中,项目文件夹内容如下所示。
2.1 连板推理测试
在使用rknntoolkitlite2之前,我们首先要进行连板推理测试,连板推理测试部分代码在之前的博文已经解读过,这里直接贴出代码部分,若有疑问,请参考博文:RKNPU2从入门到实践 --- 【5】一、加载非RKNN模型(以pt模型为例)进行模型评估【(1)在rknntoolkit2模拟器上推理测试(2)连板推理】二、RKNN模型【(1)连板推理】-CSDN博客
import numpy as np
from rknn.api import RKNN
import cv2
def show_outputs(output):
output_sorted = sorted(output, reverse=True)
top5_str = '\n-----TOP 5-----\n'
for i in range(5):
value = output_sorted[i]
index = np.where(output == value)
for j in range(len(index)):
if (i + j) >= 5:
break
if value > 0:
topi = '{}: {}\n'.format(index[j], value)
else:
topi = '-1: 0.0\n'
top5_str += topi
print(top5_str)
def show_perfs(perfs):
perfs = 'perfs: {}\n'.format(perfs)
print(perfs)
def softmax(x):
return np.exp(x)/sum(np.exp(x))
if __name__ == '__main__':
# 创建RKNN对象
rknn = RKNN()
# 使用load_rknn接口直接加载RKNN模型
rknn.load_rknn(path='./resnet.rknn')
# 调用init_runtime接口初始化运行时环境
rknn.init_runtime(
core_mask=0,
target='rk3588'
)
# 使用 opencv 获取推理图片数据
img = cv2.imread(filename='./space_shuttle_224.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 调用inference接口进行推理测试
outputs = rknn.inference(
inputs=[img],
data_format=None
)
show_outputs(softmax(np.array(outputs[0][0])))
# 调用release释放rknn对象
rknn.release()
core_mask 表示NPU的调度模式,设置为0时表示自由调度,设置为1,2,4时表示调度某个单核心,设置为3时表示同时调度0和1两个核心,设置为7时,表示3个核心同时调度。
注:由于rknntoolkitlite2最后要在开发板上运行,运行环境已经确定,且无法进行性能评估和内存评估,因此在 rknntoolkitlite2 部分中 target='rk3588' 将会被去掉。
随后启动开发板,开发板连接至Ubuntu虚拟系统上,连接成功后会在虚拟系统任务栏中出现一个手机的标识。
使用MobaXterm软件与开发板进行串口调试,开启rknn_server服务:
至此,运行代码,开始连板推理,得到运行结果:
可以看到,终端打印出前五名概率最大的物品编号以及概率值,最大的概率值为0.9996696....,标签号为812号,经查询,812号实际是太空飞船,推理测试图片也是太空飞船,则连板推理成功。
接下来我们开始使用rknntoolkitlite2,将模型部署在RK3588开发板上,请看2.2小节。
2.2 rknntoolkitlite2使用
rknntoolkitlite2 使用流程图如下所示:
我们根据上述流程图来修改2.1小节的代码,一共三处:
第一处:
将
改为:
第二处:
将:
修改为:
第三处:
将:
修改为:
修改之后的整体代码如下所示:
import numpy as np
from rknnlite.api import RKNNLite
import cv2
def show_outputs(output):
output_sorted = sorted(output, reverse=True)
top5_str = '\n-----TOP 5-----\n'
for i in range(5):
value = output_sorted[i]
index = np.where(output == value)
for j in range(len(index)):
if (i + j) >= 5:
break
if value > 0:
topi = '{}: {}\n'.format(index[j], value)
else:
topi = '-1: 0.0\n'
top5_str += topi
print(top5_str)
def show_perfs(perfs):
perfs = 'perfs: {}\n'.format(perfs)
print(perfs)
def softmax(x):
return np.exp(x)/sum(np.exp(x))
if __name__ == '__main__':
# 创建RKNN对象
rknn = RKNNLite()
# 使用load_rknn接口直接加载RKNN模型
rknn.load_rknn(path='./resnet.rknn')
# 调用init_runtime接口初始化运行时环境
rknn.init_runtime(
core_mask=0,
)
# 使用 opencv 获取推理图片数据
img = cv2.imread(filename='./space_shuttle_224.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 调用inference接口进行推理测试
outputs = rknn.inference(
inputs=[img],
data_format=None
)
show_outputs(softmax(np.array(outputs[0][0])))
# 调用release释放rknn对象
rknn.release()
修改之后,该程序就可以通过 rknntoolkitlite2 在开发板上运行了。注意:是在开发板上单独运行,不受宿主机的调配,不是上面那个连板推理。上面那个连板推理只是模拟在开发板上单独运行的情况。
需要将修改后的代码文件拷贝到开发板上,要想正常运行该程序,还需要在开发板系统上搭建rknntoolkitlite2 的使用环境,关于环境搭建步骤,请参考博文:
rknntoolkitlite2环境搭建-CSDN博客
在Ubuntu虚拟系统中使用命令 adb push [rknntoolkitlite2_learning 的路径] [/home/topeet(开发板上的指定目录)]将项目文件夹拷贝到开发板的指定目录下,我的项目文件夹 rknntoolkitlite2_learning 位于虚拟系统的 /home/topeet/rknn/rknntoolkitlite2_learning,因此执行如下命令:
拷贝结束后,在MobaXterm中查看该文件夹,如下:
然后执行.py程序,这个程序是我们修改后的代码,如下所示:
得到结果:
终端给出了TOP5的概率值,与连板推理下的一样。