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

本文主要是介绍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的概率值,与连板推理下的一样。

这篇关于RKNPU2从入门到实践 ---- 【8】借助 RKNN Toolkit lite2 在RK3588开发板上部署RKNN模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1119189

相关文章

mysql_mcp_server部署及应用实践案例

《mysql_mcp_server部署及应用实践案例》文章介绍了在CentOS7.5环境下部署MySQL_mcp_server的步骤,包括服务安装、配置和启动,还提供了一个基于Dify工作流的应用案例... 目录mysql_mcp_server部署及应用案例1. 服务安装1.1. 下载源码1.2. 创建独立

Nginx服务器部署详细代码实例

《Nginx服务器部署详细代码实例》Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务,:本文主要介绍Nginx服务器部署的相关资料,文中通过代码... 目录Nginx 服务器SSL/TLS 配置动态脚本反向代理总结Nginx 服务器Nginx是一个‌高性

SpringBoot简单整合ElasticSearch实践

《SpringBoot简单整合ElasticSearch实践》Elasticsearch支持结构化和非结构化数据检索,通过索引创建和倒排索引文档,提高搜索效率,它基于Lucene封装,分为索引库、类型... 目录一:ElasticSearch支持对结构化和非结构化的数据进行检索二:ES的核心概念Index:

Python数据验证神器Pydantic库的使用和实践中的避坑指南

《Python数据验证神器Pydantic库的使用和实践中的避坑指南》Pydantic是一个用于数据验证和设置的库,可以显著简化API接口开发,文章通过一个实际案例,展示了Pydantic如何在生产环... 目录1️⃣ 崩溃时刻:当你的API接口又双叒崩了!2️⃣ 神兵天降:3行代码解决验证难题3️⃣ 深度

C#借助Spire.XLS for .NET实现在Excel中添加文档属性

《C#借助Spire.XLSfor.NET实现在Excel中添加文档属性》在日常的数据处理和项目管理中,Excel文档扮演着举足轻重的角色,本文将深入探讨如何在C#中借助强大的第三方库Spire.... 目录为什么需要程序化添加Excel文档属性使用Spire.XLS for .NET库实现文档属性管理Sp

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)

《JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)》:本文主要介绍如何在IntelliJIDEA2020.1中创建和部署一个JavaWeb项目,包括创建项目、配置Tomcat服务... 目录简介:一、创建项目二、tomcat部署1、将tomcat解压在一个自己找得到路径2、在idea中添加

Python + Streamlit项目部署方案超详细教程(非Docker版)

《Python+Streamlit项目部署方案超详细教程(非Docker版)》Streamlit是一款强大的Python框架,专为机器学习及数据可视化打造,:本文主要介绍Python+St... 目录一、针对 Alibaba Cloud linux/Centos 系统的完整部署方案1. 服务器基础配置(阿里

SpringCloud Stream 快速入门实例教程

《SpringCloudStream快速入门实例教程》本文介绍了SpringCloudStream(SCS)组件在分布式系统中的作用,以及如何集成到SpringBoot项目中,通过SCS,可... 目录1.SCS 组件的出现的背景和作用2.SCS 集成srping Boot项目3.Yml 配置4.Sprin

Java领域模型示例详解

《Java领域模型示例详解》本文介绍了Java领域模型(POJO/Entity/VO/DTO/BO)的定义、用途和区别,强调了它们在不同场景下的角色和使用场景,文章还通过一个流程示例展示了各模型如何协... 目录Java领域模型(POJO / Entity / VO/ DTO / BO)一、为什么需要领域模