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

使用瑞芯微RK3588的NPU进行模型转换和推理

使用边缘设备进行算法落地时,通常要考虑模型推理速度,NVIDA系列平台可以使用TensorRT和CUDA加速,瑞芯微RK3588的板子上都是Arm的手机GPU,虽然没有类似CUDA的加速计算方式,但是提供了NPU进行加速推理,本文说明了如何使用瑞芯微RK3588的NPU进行模型转换和推理

一、简介

RK3588内置NPU模块, 处理性能最高可达6TOPS。使用该NPU需要下载RKNN SDK,RKNN SDK为带有 NPU 的RK3588S/RK3588 芯片平台提供编程接口,能够帮助用户部署使用 RKNN-Toolkit2导出RKNN模型,加速AI应用的落地。
在这里插入图片描述

RKNN-Toolkit2是为用户提供在 PC、 Rockchip NPU 平台上进行模型转换、推理和性能评估的开发套件,用户通过该工具提供的Python接口可以便捷地完成以下功能:

🏆模型转换:支持 Caffe、TensorFlow、TensorFlow Lite、ONNX、DarkNet、PyTorch 等模型转为 RKNN 模型,并支持 RKNN 模型导入导出,RKNN 模型能够在Rockchip NPU 平台上加载使用。
🎽量化功能:支持将浮点模型量化为定点模型,目前支持的量化方法为非对称量化,并支持 混合量化功能 。
🎯模型推理:能够在 PC上模拟Rockchip NPU运行RKNN模型并获取推理结果;或将RKNN模型分发到指定的NPU设备上进行推理并获取推理结果。
🏋性能和内存评估:将 RKNN 模型分发到指定NPU设备上运行,以评估模型在实际设备上运行时的性能和内存占用情况。
🎼量化精度分析:该功能将给出模型量化前后每一层推理结果与浮点模型推理结果的余弦距离,以便于分析量化误差是如何出现的,为提高量化模型的精度提供思路。

二、准备工作

2.1 适用芯片

RKNN-Toolkit2当前版本所支持芯片的型号如下:

  • RV1103
  • RV1103B
  • RV1106
  • RV1106B
  • RK2118
  • RK3562
  • RK3566系列
  • RK3568系列
  • RK3576系列
  • RK3588系列

2.2 系统依赖说明

使用RKNN-Toolkit2时需要满足以下运行环境要求:
在这里插入图片描述

ARM64版本运行环境要求,ARM64版本仅支持PyTorch和ONNX框架,其他框架暂时不支持:

在这里插入图片描述
RKNN-Toolkit2和各深度学习框架的版本对应关系如下:
在这里插入图片描述

三、创建环境

因为尝试将yolo11onnx模型转成RKNN-Toolkit2rknn模型,根据版本对应关系,ONNX版本越高支持的算子种类越多,所以选择onnx==1.17.0对应的RKNN-Tollkit2==2.3.0版本。

3.1 下载RKNN相关库

建议新建一个目录用来存放RKNN仓库,例如新建一个名称为rknn的文件夹,并将RKNN-Toolkit2RKNN Model Zoo仓库存放至该目录下,参考命令如下:

# 新建 Projects 文件夹 
mkdir rknn# 进入该目录
cd rknn# 下载 RKNN-Toolkit2 仓库
git clone https://github.com/airockchip/rknn-toolkit2.git --depth 1# 下载 RKNN Model Zoo 仓库
git clone https://github.com/airockchip/rknn_model_zoo.git --depth 1
# 注意:
# 1.参数 --depth 1 表示只克隆最近一次 commit 
# 2.如果遇到 git clone 失败的情况,也可以直接在 github 中下载压缩包到本地,然后解压至该目录

整体目录结构如下:

Projects├── rknn-toolkit2│   ├── doc│   ├── rknn-toolkit2│   │   ├── packages│   │   ├── docker│   │   └── ...│   ├── rknpu2│   │   ├── runtime│   │   └── ...│   └── ...└── rknn_model_zoo├── datasets├── examples└── ...

3.2 安装RKNN-Toolkit2环境

使用conda创建虚拟python环境,通过pip源安装:

# 创建名称为rknn的python环境
conda create -n rknn python=3.10
# 激活环境
conda activate rknnpip install rknn-toolkit2 -i https://pypi.org/simple
# 如果已安装 RKNN-Toolkit2,可通过以下命令升级 RKNN-Toolkit2
pip install rknn-toolkit2 -i https://pypi.org/simple --upgrade# 验证是否安装成功,若没有报错,则代表 RKNN-Toolkit2 环境安装成功
# 进入 Python 交互模式
python
# 导入 RKNN 类 
from rknn.api import RKNN 

注:WSL中使用RKNN-ToolKit2注意事项

  1. 推荐安装 WSL2,Ubuntu版本号为22.04 已验证可行(其余版本未验证,理论可行)
  2. 在WSL使用RKNN-ToolKit2中若出现 “ImportError: libGL.so.1: cannot open shared object file: No such file or directory”,请执行以下代码解决
1. 安装对应库
sudo apt update
sudo apt install libgl1-mesa-glx2. 设置环境变量
echo 'export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/mesa' >> ~/.bashrc
source ~/.bashrc

四、模型转换

4.1. 准备模型

下载链接:

./yolo11n.onnx
./yolo11s.onnx
./yolo11m.onnx

或者从bash脚本下载:

cd cd rknn/rknn_model_zoo/examples/yolo11/model
./download_model.sh

4.2 转换到RKNN

cd rknn/rknn_model_zoo/examples/yolo11/python
# python convert.py <onnx_model> <TARGET_PLATFORM> <dtype(optional)> <output_rknn_path(optional)>
# such as: 
python convert.py ../model/yolo11n.onnx rk3588
# output model will be saved as ../model/yolo11.rknn

参数说明:

  • <onnx_model>: 指定ONNX模型路径。
  • <TARGET_PLATFORM>: 指定NPU平台名称。如“rk3588”。
  • <dtype>(optional): 指定为i8 u8fpi8 / u8表示进行量化,fp表示不进行量化。默认为i8 / u8
  • <output_rknn_path>(optional): 指定RKNN模型的保存路径,默认保存在与ONNX模型相同的目录中,名称为yolo11.rknn

在这里插入图片描述
在这里插入图片描述

五、模型推理

5.1 使用ONNX模型推理

cd rknn/rknn_model_zoo/examples/yolo11/python
python yolo11.py --model_path ../model/yolo11n.onnx --img_show
# 输出:
Model-../model/yolo11n.onnx is onnx model, starting val
infer 1/1IMG: bus.jpg
person @ (108 236 223 535) 0.896
person @ (212 240 284 509) 0.844
person @ (477 230 559 521) 0.838
person @ (79 358 116 516) 0.485
bus  @ (90 135 552 435) 0.939# 使用 PyTorch or ONNX 推理
# python yolo11.py --model_path <pt_model/onnx_model> --img_show
# 使用 RKNN model 推理
# python yolo11.py --model_path <rknn_model> --target <TARGET_PLATFORM> --img_show

在这里插入图片描述

参数说明:

  • <TARGET_PLATFORM>: 指定NPU平台名称。如“rk3588”。

  • <pt_model / onnx_model / rknn_model>: 指定模型路径。

5.2 使用RKNN模型推理(yolo5、模拟仿真)

RKNN-Toolkit2自带了一个模拟器,可以用来仿真模型在NPU上运行时的行为。就相当于Android Studio自带模拟器一样。那么真机就相当于开发板。RK3588目前只支持模拟仿真,还不支持连板调试,在真机上会报错显示rknn server版本过低,等后面官方更新好就可以连板推理了。

在路径rknn/rknn-toolkit2/rknn-toolkit2/examples/onnx/yolov5下,有yolov5的完整案例:创建RKNN对象、模型配置、加载onnx模型、构建RKNN模型、导出RKNN模型、加载图片并推理、得到推理结果、释放 RKNN 对象。

cd rknn/rknn-toolkit2/rknn-toolkit2/examples/onnx/yolov5
python test.py# 模型转换推理结果在当前路径下: yolov5s_relu.rknn、result.jpg
ls
README.md  check0_base_optimize.onnx  dataset.txt       onnx_yolov5_0.npy  onnx_yolov5_2.npy  result_truth.jpg  yolov5s_relu.onnx
bus.jpg    check2_correct_ops.onnx    model_config.yml  onnx_yolov5_1.npy  result.jpg         test.py           yolov5s_relu.rknn

在这里插入图片描述

5.3 使用RKNN模型推理(yolo11、模拟仿真)

参考yolo5的RKNN模型推理实现rknn/rknn-toolkit2/rknn-toolkit2/examples/onnx/yolov5/test.py,将该python文件复制到rknn/rknn_model_zoo/examples/yolo11/python/test.py,并结合rknn/rknn_model_zoo/examples/yolo11/python/yolo11.py文件,经过修改代码中超参数、模型加载、后处理等部分的代码,实现RKNN-Toolkit2模拟仿真环境下的yolo11的RKNN模型推理。

cd rknn/rknn_model_zoo/examples/yolo11/python
python test.py

在这里插入图片描述

需要注意的是,如果不做前后处理,只需用修改模型加载的参数即可,RKNN模型可以推理成功,只不过会提示后处理部分报错等,参考代码:

#...超参数
ONNX_MODEL = '../model/yolo11n.onnx'
RKNN_MODEL = '../model/yolo11n.rknn'
IMG_PATH = '../model/bus.jpg'
DATASET = '../model/dataset.txt'
#...
IMG_SIZE_YOLO11 = (640, 640)  # (width, height), such as (1280, 736)
#...#... 
#前处理
import yolo11
co_helper = yolo11.COCO_test_helper(enable_letter_box=True)
pad_color = (0,0,0)
img = co_helper.letter_box(im= img.copy(), new_shape=(IMG_SIZE_YOLO11[1], IMG_SIZE_YOLO11[0]), pad_color=(0,0,0))
# img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)#...
#后处理
boxes, classes, scores = yolo11.post_process(outputs)
img_p = img.copy()
if boxes is not None:yolo11.draw(img_p, co_helper.get_real_box(boxes), scores, classes)
cv2.imshow("full post process result", img_p)
cv2.waitKeyEx(0)

相关文章:

使用瑞芯微RK3588的NPU进行模型转换和推理

使用边缘设备进行算法落地时&#xff0c;通常要考虑模型推理速度&#xff0c;NVIDA系列平台可以使用TensorRT和CUDA加速&#xff0c;瑞芯微RK3588的板子上都是Arm的手机GPU&#xff0c;虽然没有类似CUDA的加速计算方式&#xff0c;但是提供了NPU进行加速推理&#xff0c;本文说…...

Flutter项目试水

1基本介绍 本文章在构建您的第一个 Flutter 应用指导下进行实践 可作为项目实践的辅助参考资料 Flutter 是 Google 的界面工具包&#xff0c;用于通过单一代码库针对移动设备、Web 和桌面设备构建应用。在此 Codelab 中&#xff0c;您将构建以下 Flutter 应用。 该应用可以…...

【算法学习】DFS与BFS

目录 一&#xff0c;深度优先搜索 1&#xff0c;DFS 2&#xff0c;图的DFS遍历 (1)&#xff0c;递归实现&#xff08;隐士栈&#xff09; (2)&#xff0c;显示栈实现&#xff08;非递归&#xff09; 二&#xff0c;广度优先搜索 1&#xff0c;BFS 2&#xff0c;图的BF…...

100.16 AI量化面试题:监督学习技术在量化金融中的应用方案

目录 0. 承前1. 解题思路1.1 应用场景维度1.2 技术实现维度1.3 实践应用维度 2. 市场预测模型2.1 趋势预测2.2 模型训练与评估 3. 风险评估模型3.1 信用风险评估 4. 投资组合优化4.1 资产配置模型 5. 回答话术 0. 承前 本文通过通俗易懂的方式介绍监督学习在量化金融中的应用&a…...

基于deepseek api和openweather 天气API实现Function Calling技术讲解

以下是一个结合DeepSeek API和OpenWeather API的完整Function Calling示例&#xff0c;包含意图识别、API调用和结果整合&#xff1a; import requests import json import os# 配置API密钥&#xff08;从环境变量获取&#xff09; DEEPSEEK_API_KEY os.getenv("DEEPSEE…...

线性数据结构解密:数组的定义、操作与实际应用

系列文章目录 01-从零开始掌握Python数据结构&#xff1a;提升代码效率的必备技能&#xff01; 02-算法复杂度全解析&#xff1a;时间与空间复杂度优化秘籍 03-线性数据结构解密&#xff1a;数组的定义、操作与实际应用 文章目录 系列文章目录前言一、数组的定义与特点1.1 数组…...

CentOS搭建PPPOE服务器

一、安装软件包 yum -y install rp-pppoe 二、配置服务器 1.修改配置文件 打开/etc/ppp/pppoe-server-options文件 nano /etc/ppp/pppoe-server-options 编辑为以下内容&#xff1a; # PPP options for the PPPoE server # LIC: GPL require-pap require-chap login …...

【报错】解决 RuntimeError: CUDA error: CUBLAS_STATUS_INVALID_VALUE 报错问题

解决 RuntimeError: CUDA error: CUBLAS_STATUS_INVALID_VALUE 报错问题 写在最前面问题描述可能的原因分析解决方案该命令的作用 结论 写在最前面 在多用户使用的服务器上&#xff0c;导致的环境变量的冲突和不匹配问题&#xff0c; 代码没有问题&#xff0c;但程序运行异常。…...

【C语言】C语言 文具店商品库存管理系统(源码+数据文件)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、测试技术。 系列文章目录 目录 系列文章目录一、设计要求1. 项…...

LangChain系列: 使用工具和工具包构建代理实战教程

让我们在LangChain中构建简单代理示例&#xff0c;以帮助我们理解代理的基本概念和构建块。通过保持简单&#xff0c;我们可以更好地掌握这些代理背后的基本思想&#xff0c;使我们能够在未来构建更复杂的代理。 什么是代理 LangChain官方文档有非常好的章节来介绍其代理的高级…...

布隆过滤器(简单介绍)

布隆过滤器&#xff08;Bloom Filter&#xff09; 是一种高效的概率型数据结构&#xff0c;用于快速判断一个元素是否可能存在于某个集合中。它的核心特点是空间效率极高&#xff0c;但存在一定的误判率&#xff08;可能误报存在&#xff0c;但不会漏报&#xff09;。 核心原理…...

C++ 利器:inline 与 nullptr

探秘 C 利器&#xff1a;inline 与 nullptr 引言 在 C 的浩瀚海洋中&#xff0c;有着许多实用且强大的特性&#xff0c;它们如同夜空中闪烁的繁星&#xff0c;照亮了开发者前行的道路。今天&#xff0c;我们要深入探索其中两颗耀眼的星星&#xff1a;inline 关键字和 nullptr …...

给一个单体项目加装Feign

1.导入pom坐标 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>4.1.2</version> </dependency> 2.主函数注解 EnableFeignClients public cl…...

可以使用Deepseek R1模型的平台集锦

最近Deepseek掀起了AI浪潮&#xff0c;就在今天百度文心一言和ChatGPT宣布要在近期实施免费开放&#xff0c;日渐减少的用户。Deepseek这么火爆&#xff0c;其官网却一直遭受攻击&#xff0c;访问速度很慢。自己本地部署&#xff0c;又负担不起硬件费用&#xff0c;相比之下&am…...

“探索1688平台:高效获取店铺商品信息的实用指南“

在电商领域&#xff0c;获取店铺所有商品信息对于商家进行数据分析、库存管理、竞品分析等方面具有重要意义。1688平台作为中国领先的B2B电商平台&#xff0c;提供了丰富的API接口供开发者使用&#xff0c;其中就包括获取店铺所有商品信息的接口。本文将详细介绍如何使用该接口…...

在fedora41中安装钉钉dingtalk_7.6.25.4122001_amd64

在Fedora-Workstation-Live-x86_64-41-1.4中安装钉钉dingtalk_7.6.25.4122001_amd64.deb 到官网下载钉钉Linux客户端com.alibabainc.dingtalk_7.6.25.4122001_amd64.deb https://page.dingtalk.com/wow/z/dingtalk/simple/ddhomedownload#/ 一、直接使用dpkg命令安装deb包报错…...

数据结构:图论入门

图论起源于欧拉对哥尼斯堡七桥问题的解决. 他构建的图模型将陆地用点来表示, 桥梁则用线表示, 如此一来, 该问题便转化为在图中能否不重复地遍历每条边的问题. 图论的应用 地图着色 在地图着色问题中, 我们用顶点代表国家, 将相邻国家之间用边相连. 这样, 问题就转化为用最少…...

有限状态系统的抽象定义及CEGAR分析解析理论篇

文章目录 一、有限状态系统的抽象定义及相关阐述1、有限状态系统定义2、 有限状态系统间的抽象关系&#xff08;Abstract&#xff09;2.1 基于函数的抽象定义2.2 基于等价关系的抽象定义 二、 基于上面的定义出发&#xff0c;提出的思考1. 为什么我们想要/需要进行抽象2. 抽象是…...

Apache Hive用PySpark统计指定表中各字段的空值、空字符串或零值比例

from pyspark.sql import SparkSession from pyspark.sql.functions import col, coalesce, trim, when, lit, sum from pyspark.sql.types import StringType, NumericType# 初始化SparkSession spark SparkSession.builder \.appName("Hive Data Quality Analysis"…...

高校元宇宙实训室解决方案:以技术驱动教育,用数字人链接未来

在AIGC技术的浪潮下&#xff0c;AI数字人正成为数字营销、文化传播等领域的核心工具。为助力高校培养适应未来需求的新型人才&#xff0c;广州虚拟动力推出高校元宇宙实训室解决方案&#xff0c;通过动作捕捉设备与虚拟数字人技术&#xff0c;构建沉浸式教学场景&#xff0c;赋…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

2025.6.9总结(利与弊)

凡事都有两面性。在大厂上班也不例外。今天找开发定位问题&#xff0c;从一个接口人不断溯源到另一个 接口人。有时候&#xff0c;不知道是谁的责任填。将工作内容分的很细&#xff0c;每个人负责其中的一小块。我清楚的意识到&#xff0c;自己就是个可以随时替换的螺丝钉&…...