RKNPU2从入门到实践 ---- 【8】借助 RKNN Toolkit lite2 在RK3588开发板上部署RKNN模型

前言

作者使用的平台为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博客

python 复制代码
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 使用流程图如下所示:
RKNN Tool kit lite2 使用流程图

我们根据上述流程图来修改2.1小节的代码,一共三处:
第一处:


改为:

第二处:

将:

修改为:

第三处:

将:

修改为:

修改之后的整体代码如下所示:

python 复制代码
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的概率值,与连板推理下的一样。

相关推荐
CSND7402 分钟前
Ubuntu vi(vim)编辑器配置一键补全main函数
linux·c语言·ubuntu·编辑器·vim
mahuifa4 分钟前
QtCreator配置github copilot实现AI辅助编程
人工智能·ai编程·github copilot·qtcreator
千穹凌帝8 分钟前
基于深度学习多图像融合的屏幕缺陷检测方案
人工智能·深度学习·数码相机
张叔zhangshu2 小时前
TensorFlow 的基本概念和使用场景
人工智能·python·tensorflow
シ風箏3 小时前
Neo4j【环境部署 02】图形数据库Neo4j在Linux系统ARM架构下的安装使用
linux·数据库·arm·neo4j
Cachel wood5 小时前
Vue.js前端框架教程8:Vue消息提示ElMessage和ElMessageBox
linux·前端·javascript·vue.js·前端框架·ecmascript
云起无垠6 小时前
【论文速读】| FirmRCA:面向 ARM 嵌入式固件的后模糊测试分析,并实现高效的基于事件的故障定位
人工智能·自动化
小屁不止是运维8 小时前
麒麟操作系统服务架构保姆级教程(二)ssh远程连接
linux·运维·服务器·学习·架构·ssh
Leweslyh8 小时前
物理信息神经网络(PINN)八课时教案
人工智能·深度学习·神经网络·物理信息神经网络
love you joyfully8 小时前
目标检测与R-CNN——pytorch与paddle实现目标检测与R-CNN
人工智能·pytorch·目标检测·cnn·paddle