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

相关推荐
心心喵3 分钟前
[论文笔记] LLM端侧小模型篇——1、剪枝量化的latency
人工智能
码农研究僧3 分钟前
详细分析linux中的MySql跳过密码验证以及Bug(图文)
linux·mysql·bug·密码验证
hyk今天写算法了吗34 分钟前
凸优化学习(2)——梯度类方法求解(gradient descent)
人工智能·深度学习·学习·梯度下降·凸优化
像风一样自由20201 小时前
Ubuntu系统入门指南:常用命令详解
linux·运维·ubuntu
算力资源比较多1 小时前
人工智能(AI)正在以前所未有的速度融入我们生活的方方面面
人工智能·智能家居
shall_zhao1 小时前
安装OpenResty(Linux-Docker)
linux·docker·openresty
wukangjupingbb1 小时前
数据资产盘点
大数据·人工智能
bits/stdc++.h1 小时前
Linux升级OpenSSH9.8版本步骤
linux·运维·服务器·ssh
奔跑草-1 小时前
【拥抱AI】沉浸式体验SpaCy开源分词器
人工智能·大模型·数据清洗·rag·spacy·数据分词
夜清寒风1 小时前
opencv学习:calcHist 函数绘制图像直方图及代码实现
人工智能·opencv·学习·算法·计算机视觉