当前位置: 首页 > article >正文

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 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.kler.cn/a/282998.html

相关文章:

  • Java 多线程(三)—— 死锁
  • 2411d,右值与移动
  • 如何判定linux系统CPU的核心架构
  • Ubuntu 的 ROS 操作系统安装与测试
  • #include<string>和#include<string.h>有什么区别
  • Spring Boot实现文件上传与OSS集成:从基础到应用
  • 设计模式--装饰器模式
  • 理解torch.argmax() ,我是错误的
  • 融资和融券分别是什么意思,融资融券开通后能融到多少资金?
  • Datawhale X 李宏毅苹果书 AI夏令营_深度学习基础学习心得Task2.2
  • Java 入门指南:Java NIO —— Selector(选择器)
  • 【hot100篇-python刷题记录】【搜索二维矩阵】
  • 分布式锁的实现:ZooKeeper 的解决方案
  • hive数据迁移
  • 低代码革命:JNPF平台如何简化企业应用开发
  • Linux 中的中断响应机制
  • TCP keepalive和HTTP keepalive区别
  • SCP拷贝失败解决办法
  • 基于单片机的指纹识别考勤系统设计
  • Web应用服务器Tomcat
  • 基于STM32开发的智能家居温度控制系统
  • Linux下的使用字符设备驱动框架编写ADC驱动 ——MQ-4传感器
  • 我在高职教STM32——ADC电压采集与光敏电阻(2)
  • rnn-手动实现
  • 区块链入门
  • Element Plus上传图片前,对图片进行压缩