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博客

import numpy as np
from rknn.api import RKNN
import cv2def 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:breakif value > 0:topi = '{}: {}\n'.format(index[j], value)else:topi = '-1: 0.0\n'top5_str += topiprint(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小节的代码,一共三处:
第一处:


改为:


第二处:
将:

修改为:

第三处:
将:

修改为:

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

import numpy as np
from rknnlite.api import RKNNLite
import cv2def 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:breakif value > 0:topi = '{}: {}\n'.format(index[j], value)else:topi = '-1: 0.0\n'top5_str += topiprint(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的概率值,与连板推理下的一样。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/416985.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Markdown 语法大全详解

Markdown 语法大全详解 Markdown是一种轻量级标记语言,排版语法简洁,让人们更多地关注内容本身而非排版。它使用易读易写的纯文本格式编写文档,可与HTML混编,可导出 HTML、PDF 以及本身的 .md 格式的文件。因简洁、高效、易读、易…

Node.js模块系统

大家好呀,今天我们来认识以下Node.js的模块系统。 模块系统 目录 模块系统 node项目 创建一个完整的node项目 模块之间的引用 模块的导入 模块的分类 核心模块的引用 获取模块的导出对象 小结 node项目 一个node项目,单有JS文件是不行的&#xff…

Linux操作系统中的进程查看与进程调度

一.进程查看 什么是进程? 进程 process 计算机执行任务的最小单位,在计算机上运行一个应用软件可能会产生多个进程, 二.进程查看——ps -aux ps命令查看进程 如上图所示,是ps命令加上aux选项产生的结果,其作用是…

数字芯片中I/O单元及电源domain布局中SIPI的考虑

芯片设计的物理实施过程通常也简称为布局布线(P&R,Place-and-Route),布局一般被分为布局规划(Floorplan)和标准单元摆放(Place)两个过程。而其中的布局规划是芯片后端物理实现过…

大模型的实践应用28-基于ChatGLM大模型搭建智能自助用药问答系统、药物智能管理系统的应用详解

大家好,我是微学AI,今天给大家介绍一下大模型的实践应用28-基于ChatGLM大模型搭建智能自助用药问答系统、药物智能管理系统的应用详解。 随着人工智能技术的发展,我们的生活在许多方面都得到了改善。本文将介绍如何利用现有的大模型(如:ChatGLM2-6b,百川,通义千问)构建一…

Golang | Leetcode Golang题解之第385题迷你语法分析器

题目: 题解: func deserialize(s string) *NestedInteger {index : 0var dfs func() *NestedIntegerdfs func() *NestedInteger {ni : &NestedInteger{}if s[index] [ {indexfor s[index] ! ] {ni.Add(*dfs())if s[index] , {index}}indexreturn…

Linux【6】系统

时间日期 date日期 cal——当月日历 cal -y 今年的日历 磁盘占用df du df 剩余空间 du 目录下的文件大小 进程ps ps aux a——其他用户 u——详细状态 x——没有控制终端 只看CPU占用高的进程top kill pid代号 ——杀死程序 通配符(简略版) …

conda create创建失败

如图一样,每次创建环境都显示连接不上,换了各种源各种方法都不行,最后把.condarc给删掉就能正常下载了,我类目了

Tekton简介,安装和构建最简单ci/cd

简介 Tekton是一种基于k8的支持CI/CD的operator。 说到持续集成,我们比较熟悉的有jenkins,gitlab ci等,但只有Tekton是云原生的。 既然Tekton是一种operator,那就必须了解它的CRD,然后我们定义CR,让Tekt…

如何使用Jmeter关联influxDB?

一、添加"添加后端监听器" 二、后端监听器实现选择,"org. apache. jmeter. visualizers. backend. influxdb.InfluxdbBackendlistenerClient" 三、修改"influxdbUrl:自己的主机、application:取一个项目名" 四、influxDB&…

AGV/AMR移动机器人产业链全景图(二),应用场景及嵌入式控制器主板案例分析

AGV/AMR移动机器人的下游应用场景 物流行业:物流行业是AGV应用最为广泛的领域之一。随着电子商务的兴起和物流业的快速发展,仓库管理、货物分拣和配送等环节的自动化需求日益增长。AGV通过自主导航和智能调度,实现了货物的快速、准确搬运&am…

数据分析-11-时间序列分析的概念任务和主要方法

1 时间序列 1.1 时间序列的定义 时间序列,通俗的字面含义为一系列历史时间的序列集合。比如2013年到2022年我国全国总人口数依次记录下来,就构成了一个序列长度为10的时间序列。 结合上图理解随机变量和观测值的关系。 我们认为每个时间点发生的数据都来自于一个分布的,…

2024国赛数学建模备赛|30种常用的算法模型之最优算法-非线性规划

1.1 非线性规划的实例与定义 如果目标函数或约束条件中包含非线性函数,就称这种规划问题为非线性规划问题。一般说来,解非线性规划要比解线性规划问题困难得多。而且,也不象线性规划有 单纯形法这一通用方法,非线性规划目前还没…

并发工具类(一):CountDownLatch

1、CountDownLatch介绍 CountDownLatch 又称为“倒计数门阀”,但大多数称之为“计数器”,是juc包下的一个工具类; CountDownLatch 核心功能是:用于一个活多个线程等待其他线程执行完成的一组操作。 CountDownLatch 中有个全局的计…

【Blender】快捷键_ 学习日志_01

【Blender】快捷键_ 学习日志_01 学习了blender的快捷键的使用。 2024年8月30日 视角操控 围绕中心旋转:按住鼠标中建 平移视角:Shift鼠标中键 视角前进后退:滚动滚轮 视图切换 0 切换到摄像机视图 1 切换正试图 2,4&…

产值8111亿!从《中国地理信息产业发展报告2024》看产业链上的就业蓝海

中国地理信息产业协会28日发布《中国地理信息产业发展报告2024》,报告显示2023年我国地理信息产业总产值达到8111亿元,同比增长4.2%,初步形成了完整的地理信息产业链。 《中国地理信息产业发展报告2024》显示,2023年以来&#xf…

倍福EL6751快速配置CANopen伺服

EL6751快速配置CANopen伺服 使用倍福EL6751快速配置方法,不要求提供从站的eds文件,但是需要提供从站的使用手册和通讯手册,用来查阅从站的PDO配置信息,这些配置参数会使用如下方法通过EL6751写入到从站中。 建立通用CANopen节点…

开源通用验证码识别OCR —— DdddOcr 源码赏析(二)

文章目录 前言DdddOcr分类识别调用识别功能classification 函数源码classification 函数源码解读1. 分类功能不支持目标检测2. 转换为Image对象3. 根据模型配置调整图片尺寸和色彩模式4. 图像数据转换为浮点数据并归一化5. 图像数据预处理6. 运行模型,返回预测结果 …

使用seamless-scroll-v3 实现无缝滚动,自动轮播平滑的滚动效果

安装&#xff1a;npm地址&#xff1a;https://www.npmjs.com/package/seamless-scroll-v3 yarn add seamless-scroll-v3# 或者使用 npm npm install seamless-scroll-v3# 或者使用 pnpm pnpm add seamless-scroll-v3 实现效果&#xff1a; template中的代码&#xff1a; <…

陷抄袭风波 《黑神话:悟空》该如何应对

都说人红是非多&#xff0c;国产首部3A游戏《黑神话&#xff1a;悟空》在爆火的同时&#xff0c;一些问题也随之出现。一方面《黑神话&#xff1a;悟空》陷入抄袭风波&#xff1f;另一方面该游戏也被很多黑灰产盯上了。 8月23日&#xff0c;“塞上李云中”发布微博&#xff0c;…