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

news2024/11/25 16:38:49

前言

      作者使用的平台为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 使用流程图如下所示: 

RKNN Tool kit lite2 使用流程图

 我们根据上述流程图来修改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的概率值,与连板推理下的一样。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

进阶SpringBoot之 Shiro(1)快速开始

Shiro 是一个 Java 的安全(权限)框架,它可以在 JavaSE、JavaEE 环境下使用 Shiro 可以实现认证、授权、加密、会话管理、Web 集成、缓存等 Shiro 官网 Shiro 中文文档 GitHub 下载 Shiro 下载源码,samples -> quickstart …

Linux-全网备份实战案例rsync邮件发送

项目准备 服务端:backup:172.16.1.41 客户端1:nfs:172.16.1.31 客户端2: web01:172.16.1.7 1.1 服务端backup-rsync配置文件 [rootbackup ~]# cat /etc/rsyncd.conf #created by linux 2024-8-29 ###########rsyncd.conf star…

进程和线程(操作系统八股文part2)

一个操作系统的进程和线程部分的笔记,大部分来源于:小林coding和Javaguide,以及操作系统黑书。 进程和线程 什么是进程 运行中的程序叫进程**(Process)**。 进程是资源分配的最小单位,线程是执行的最小…

【逐行注释】MATLAB下的UKF(无迹卡尔曼滤波),带丰富的中文注释,可直接复制到MATLAB上运行,无需下载

文章目录 程序组成部分完整代码运行结果主要模块解读:运动模型绘图部分误差统计特性输出程序组成部分 由模型初始化、运动模型、UKF主体部分、绘图代码和输出部分组成: 完整代码 将下列代码复制粘贴到MATLAB里面,即可运行: % 三维状态量的UKF例程 % 作者联系方式:微信…

学苑教育杂志社学苑教育编辑部学苑教育杂志2024年第23期目录

专题研究 “三全六为”教育教学理念的实践运用 果艳青; 4-6 教育管理 班主任班级管理工作中进行小组合作的优化策略 肖堂花; 7-9 课堂教学 以“创新”为支点,构建小学数学活力课堂 马绪如; 10-12 案例教学法在初中道德与法治教学中的应用 何瑞娟; 1…

js实现队列

目录 一、什么是JavaScript队列数据结构二、创建一个JavaScript队列数据结构三、封装队列方法①向队列添加元素②检查队列是否为空③获取队列的长度④从队列移除元素⑤查看队列头元素⑥清空队列⑦创建toString方法 四、使用Queue类 一、什么是JavaScript队列数据结构 在上一篇…

【解析几何笔记】11.向量的外积运算

11. 向量的外积运算 【注】也可以这么计算 11.1 向量的多重乘积 【命题】任意三个向量, α , β , γ \pmb{\alpha},\pmb{\beta},\pmb{\gamma} α,β,γ, ( α β ) γ ( α ⋅ γ ) β − ( β ⋅ γ ) α (\pmb{\alpha}\times\pmb{\beta})\times\p…

Java 7.4 - 分布式锁

什么是分布式锁? 对于单机多线程,我们使用 ReentrantLock 这类本地锁来控制多个线程对本地共享资源的访问;而对于分布式系统,我们使用 分布式锁 来控制多个服务对共享资源的访问。 分布式锁基本要求: 1、互斥 2、高…

【自由能系列(中级)】自由能与变分自由能——从状态到配置的效益最大化

自由能与变分自由能——从状态到配置的效益最大化 关键词提炼 #自由能 #变分自由能 #状态函数 #配置函数 #效益最大化 #物理系统 #优化问题 第一节:自由能与变分自由能的类比与核心概念 1.1 自由能与变分自由能的类比 自由能和变分自由能可以被视为物理系统的“…

最火视频素材去哪里找?热门的视频素材网站库分享给你

你是否正在寻找那些能够让你的视频作品一鸣惊人的优质素材?如果你还在为如何让视频内容更加出彩而苦恼,那么今天你就来对地方了!我将为你介绍几个非常实用且资源丰富的视频素材网站,让你的作品在众多视频中脱颖而出,成…

element的el-steps里的数据处理用switch 循环,处理的数据不要vue响应式的值

element的el-steps我通过v-for循环展示里面的每一行信息我需要处理,我就用了方法 handlerCatalogue来处理, 我重新定义一个数据lineOneIntro ,每次return的lineOneIntro ,但是会执行103次, 导致我页面卡死,…

SpringBoot 基于iText 根据PDF模板动态生成文件

SpringBoot 基于iText 根据PDF模板动态生成文件, 需要使用 adobe acrobat pro DC这个工具来自定义模板 支持根据PDF模板生成单页或多页PDF文件 adobe acrobat pro DC 自定义模板 下载地址 链接:https://pan.baidu.com/s/1Vn3bIQ5_D17sEZnkF2t7gg?pwdn6o1 提取码…

【hot100篇-python刷题记录】【杨辉三角】

R6-dp篇 印象题,但做法应该改变了 思路:前两行直接写 next[i]cur[i-1]cur[i],其中next[0]和next[-1] 这样的话,需要创建2个额外的数组空间,而且还要变化 所以考虑动态规划 class Solution:def generate(self, num…

Efficient LoFTR论文阅读(特征匹配)

Efficient LoFTR论文阅读(特征匹配) 摘要1. 引言2. 相关工作基于检测器的图像匹配无检测器图像匹配 3. 方法3.1. 局部特征提取3.2. 高效的局部特征变换3.3. 准备工作3.4. 聚合注意力机制3.5 粗级匹配模块有效推理策略子像素级细化模块有效的精细特征提取…

[C语言]一、C语言基础(03.函数)

G:\Cpp\C语言精讲 6. 函数 6.1函数的基本使用 6.1.1 为什么需要函数 《街霸》游戏中,每次人物出拳、出脚或跳跃等动作都需要编写50-80行的代码,在每次出拳、出脚或跳跃的地方都需要重复地编写这50-80行代码,这样程序会变得很臃肿&#xff…

目前kimi算不算国内顶级的AI?

利用AI工具批量生成影视短剧推广https://docs.qq.com/doc/DYnl6d0FLdHp0V2ll 从用户体验上讲,我觉得 Kimi 算得上国内的顶级 AI。 现在的大模型产品遍地开花,底层模型原理差异不大,想要在这样的市场环境中生存下来并赢得普通用户认可&#xf…

Go锁 详解

锁 - Go 函数并发编程中,锁是一种同步机制,用于协调对共享资源的访问,防止数据竞争 - Go 中提供了多种类型的锁,每种锁都有不同的特性和适用场景类型 互斥锁(mutex) 基础锁,只能同时允许一个 g…

【C++ Primer Plus习题】6.5

问题: 解答: #include <iostream> using namespace std;int main() {float salary 0;float tax 0;while (salary>0){cout << "请输入您的工资:";cin >> salary;if (cin.fail())break;if (salary < 5000){tax 0;}else if (salary < 15…

2024 MongoDB中国用户大会倒计时2天!请查收专属参会指南

距离2024 MongoDB中国用户大会即将开幕仅剩2天&#xff0c;我们非常期待与您共同探讨和分享最新的数据库技术与应用经验。为了确保您能够顺利参与本次会议&#xff0c;请查阅属于您的专属温馨提示&#xff01; 活动时间 8月31日09:00-17:30 签到开始&#xff1a;08:00 现场参…

Linux实现异步IO的方法:epoll,posix aio,libaio,io_uring

Linux中异步IO的实现方式大概有以下几种&#xff1a; 1. epoll 熟悉网络编程的人可能会想到select&#xff0c;poll&#xff0c;epoll这些异步IO的方式&#xff0c;但实际上这些方式叫做非阻塞IO&#xff0c;并不是实际意义上的异步IO。因此这些只能用于异步的Socket IO&…