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

rv1109/1126 rknn 模型部署过程

rv1109/1126是瑞芯微出的嵌入式AI芯片,带有npu, 可以用于嵌入式人工智能应用。算法工程师训练出的算法要部署到芯片上,需要经过模型转换和量化,下面记录一下整个过程。

量化环境

模型量化需要安装rk的工具包:
rockchip-linux/rknn-toolkit (github.com)
版本要根据开发板的固件支持程度来,如果二者不匹配,可能转出来的模型无法运行或者结果不对。

模型量化

rknn支持caffe,tensorflow,tflite,onnx,mxnet,pytorch等模型量化,下面以onnx为例,其他格式基本类似。即可以使用量化包带的可视化界面,也可以自行写代码,更推荐自己写代码,复用性和灵活性更强,对可视化界面一笔带过。

可视化量化工具

执行

python -m rknn.bin.visualization

image.png

选择对应格式,然后设置模型参数进行量化。
image.png

写代码量化

image.png

基础量化

最简单的量化方式如下,只需设置模型的均值、方差,载入原始模型,调用rknn.build接口,然后export_rknn即可。

from rknn.api import RKNNif __name__ == '__main__':rknn=RKNN()# pre-process configprint('--> config model')rknn.config(channel_mean_value='0 0 0 255',reorder_channel='0 1 2',target_platform=['rv1109'],#quantized_dtype="dynamic_fixed_point-i16")print('done')# Load mxnet modelonnx_model = 'yolov8n.onnx'print('--> Loading model')ret = rknn.load_onnx(onnx_model)if ret != 0:print('Load onnx_model model failed!')exit(ret)print('done')# Build modelprint('--> Building model')ret = rknn.build(do_quantization=True, dataset='../coco_resize.txt', pre_compile=False) # 若要在PC端仿真,pre_compile 为Falseif ret != 0:print('Build model failed!')exit(ret)print('done')print('--> Export RKNN model')ret = rknn.export_rknn('yolov8n_nohead.rknn')if ret != 0:print('Export RKNN model failed!')exit(ret)print('done')rknn.release()

模型量化需要提供量化图片的列表,格式为每行是一张图片的路径, 一般需要几百张,如:

images/0.jpg
images/1.jpg

模型推理验证

有两种方式验证模型的结果,一种是连接开发板,在开发板上运行,可以实际测试模型的推理速度,需要USB连接开发板,一种是在PC端仿真,速度较慢,适合在没有开发板的情况下,验证模型结果是否正确。两种方式使用的代码大部分一样,区别是在PC端仿真时,模型要以pre_compile=False模式进行量化,init_runtime参数为targe=None。

import os
import sys
from rknn.api import RKNN
import cv2
import numpy as npif __name__=="__main__":# Create RKNN objectrknn = RKNN()print('--> Loading RKNN model')ret = rknn.load_rknn('yolov8.rknn')if ret != 0:print('Load  failed!')exit(ret)print('load done')# Init Runtimerknn.init_runtime(target="rv1109")#第二个参数device_id为开发板的设备id,不用填, targe=None时,代表PC仿真image = cv2.imread("1.jpg")outputs = rknn.inference(inputs=[image]) rknn.release()

量化精度评估(逐层)

有些时候,量化损失可能过大,这时我们希望能够逐层比对量化后模型与原始模型,这时需要使用accuracy_analysis接口,这个接口第一个参数是图片列表文件,里面是测试图片的路径,第二个参数是比对结果保存路径:

from rknn.api import RKNNif __name__ == '__main__':rknn=RKNN()# pre-process configprint('--> config model')rknn.config(channel_mean_value='0 0 0 255',reorder_channel='0 1 2',target_platform=['rv1109'],#quantized_dtype="dynamic_fixed_point-i16")print('done')# Load mxnet modelonnx_model = 'yolov8n.onnx'print('--> Loading model')ret = rknn.load_onnx(onnx_model)if ret != 0:print('Load onnx_model model failed!')exit(ret)print('done')# Build modelprint('--> Building model')ret = rknn.build(do_quantization=True, dataset='../coco_resize.txt', pre_compile=False) # 若要在PC端仿真,pre_compile 为Falseif ret != 0:print('Build model failed!')exit(ret)print('done')rknn.accuracy_analysis("test_list.txt", output_dir='./snapshot5')			               print('--> Export RKNN model')ret = rknn.export_rknn('yolov8n_nohead.rknn')if ret != 0:print('Export RKNN model failed!')exit(ret)print('done')rknn.release()

比对文件如下:

Conv__model.0_conv_Conv_214_out0_nhwc_1_320_320_16.tensor    	eculidean_norm=0.030792	cosine_norm=0.999525	eculidean=202.926056	cosine=0.999526
Sigmoid__model.0_act_Sigmoid_213_Mul__model.0_act_Mul_212_out0_nhwc_1_320_320_16.tensor 	eculidean_norm=0.049676	cosine_norm=0.998766	eculidean=178.751434	cosine=0.998767
Conv__model.1_conv_Conv_210_out0_nhwc_1_160_160_32.tensor    	eculidean_norm=0.103382	cosine_norm=0.994656	eculidean=521.709229	cosine=0.994656
Sigmoid__model.1_act_Sigmoid_211_Mul__model.1_act_Mul_209_out0_nhwc_1_160_160_32.tensor 	eculidean_norm=0.113702	cosine_norm=0.993536	eculidean=436.044495	cosine=0.993536
Conv__model.2_cv1_conv_Conv_208_out0_nhwc_1_160_160_32.tensor 	eculidean_norm=0.120058	cosine_norm=0.992793	eculidean=351.808380	cosine=0.992794
Sigmoid__model.2_cv1_act_Sigmoid_207_Mul__model.2_cv1_act_Mul_205_out0_nhwc_1_160_160_32.tensor 	eculidean_norm=0.169184	cosine_norm=0.985688	eculidean=262.819550	cosine=0.985688

混合量化

有些时候,使用默认量化方法模型精度损失较大,我们通过逐层分析,也知道了那些层的损失较大,这时就需要控制一些层不量化,或以更高精度模式量化,这种方式就是混合量化。
与基础量化相比,混合量化分为两步:
第一步是通过rknn.hybrid_quantization_step1(替换基础量化中的rknn.build)获得模型的量化配置文件:

rknn.hybrid_quantization_step1(dataset='../coco_resize.txt')

该接口会生成3个文件:

xx.data
xx.json
xx.quantization.cfg

其中,.cfg文件时量化配置文件,用于控制每一层的量化:

%YAML 1.2
---
# add layer name and corresponding quantized_dtype to customized_quantize_layers, e.g conv2_3: float32
customized_quantize_layers: {}
quantize_parameters:'@attach_Concat_/model.22/Concat_5/out0_0:out0':dtype: asymmetric_affinemethod: layermax_value:-   647.7965087890625min_value:-   0.0zero_point:-   0scale:-   2.5403785705566406qtype: u8'@Concat_/model.22/Concat_5_1:out0':dtype: asymmetric_affinemethod: layermax_value:-   647.7965087890625min_value:-   0.0zero_point:-   0scale:-   2.5403785705566406qtype: u8

对于不量化或者以其他精度模式量化的层,以字典形式写在customized_quantize_layers中,rv1109支持asymmetric_quantized-u8,dynamic_fixed_point-i8和dynamic_fixed_point-i16,默认情况下,以asymmetric_quantized-u8方式量化,在需要更高精度时,可用dynamic_fixed_point-i16,但速度会更慢。对于损失较大的层,我们可以尝试设置dynamic_fixed_point-i16量化(若float32则不量化):

customized_quantize_layers: {"Split_/model.22/Split_21": "dynamic_fixed_point-i16","Reshape_/model.22/dfl/Reshape_20": "float32"
}

设置完成量化配置后,使用rknn.hybrid_quantization_step2进行量化:

from rknn.api import RKNNif __name__ == '__main__':rknn=RKNN()# pre-process configprint('--> config model')rknn.config(channel_mean_value='0 0 0 255',reorder_channel='0 1 2',target_platform=['rv1109'],#quantized_dtype="dynamic_fixed_point-i16")print('done')# Load mxnet modelonnx_model = 'yolov8n.onnx'print('--> Loading model')ret = rknn.load_onnx(onnx_model)if ret != 0:print('Load onnx_model model failed!')exit(ret)print('done')# Build modelprint('--> Building model')rknn.hybrid_quantization_step2(dataset='../coco_resize.txt',   model_input='torch_jit.json',data_input="torch_jit.data",model_quantization_cfg="torch_jit.quantization.cfg",pre_compile=False)if ret != 0:print('Build model failed!')exit(ret)print('done')rknn.accuracy_analysis("test_list.txt", output_dir='./snapshot5')			               print('--> Export RKNN model')ret = rknn.export_rknn('yolov8n_nohead.rknn')if ret != 0:print('Export RKNN model failed!')exit(ret)print('done')rknn.release()

相关文章:

rv1109/1126 rknn 模型部署过程

rv1109/1126是瑞芯微出的嵌入式AI芯片,带有npu, 可以用于嵌入式人工智能应用。算法工程师训练出的算法要部署到芯片上,需要经过模型转换和量化,下面记录一下整个过程。 量化环境 模型量化需要安装rk的工具包: rockchip-linux/rk…...

Android平台一对一音视频通话方案对比:WebRTC VS RTMP VS RTSP

一对一音视频通话使用场景 一对一音视频通话都需要稳定、清晰和流畅,以确保良好的用户体验,常用的使用场景如下: 社交应用:社交应用是一种常见的使用场景,用户可以通过音视频通话进行面对面的交流;在线教…...

--binlog-row-event-max-size

--binlog-row-event-max-size MySQL中用于控制rows格式的Binlog,binlog以chunk的方式存储,每个chunk的大小由binlog-row-event-max-size 进行控制; 如果event比较大的时候可以调大这个值;;改值必须是256的倍数&#…...

Jmeter命令行运行实例讲解

1. 简介 使用非 GUI 模式&#xff0c;即命令行模式运行 JMeter 测试脚本能够大大缩减所需要的系统资 本文介绍windows下以命令行模式运行的方法。 1.1. 命令介绍 jmeter -n -t <testplan filename> -l <listener filename> 示例&#xff1a; jmeter -n -t test…...

pl/sql函数如何返回多行数据?在线等......

​编辑csm8109022010-01-27 09:59:18 这个问题我以前问过类似的&#xff0c;但一直没得到如意的答案&#xff01;在oracle 里soctt的用户下的emp表&#xff0c;比如写一个函数&#xff0c;传入的参数为部门编号&#xff0c;然后返回所有该部门人员信息的函数。要用到游标&…...

Ubuntu Find命令详解

一、Find命令简介 Ubuntu的Find命令是一种常用的终端指令&#xff0c;用于在文件系统中查找符合条件的文件和目录。该命令的语法格式如下&#xff1a; find [PATH] [OPTION] [EXPRESSION]其中&#xff0c;PATH表示待查找的目录&#xff0c;OPTION为选项参数&#xff0c;EXPRES…...

ADS Momentum学习笔记

ADS Momentum的简介 ADS Layout界面仿真采用的方法主要是Momentum&#xff08;矩量法&#xff09;。 Momentum的特点 Momentum是高级设计系统&#xff08;ADS&#xff09;的重要组成部分&#xff0c;它提供了设计现代通信系统的电磁仿真。它可以用来计算一般平面电路的S参数…...

解决Vue3 使用Element-Plus导航刷新active高亮消失

解决Vue3 使用Element-Plus导航刷新后active高亮消失的问题 启用路由模式会在激活导航时以 index 作为 path 进行路由跳转 使用 default-active 来设置加载时的激活项。 接下来打印一下选中项index和index路径&#xff0c; 刷新也是没有任何问题的&#xff0c;active不会消失…...

K8S系列文章之 一键部署K8S环境

部署的原理是基于自动化部署工具 Ansible 实现的&#xff0c;需要提前安装Ansible 并配置下主机节点环境 1. 安装 Ansible 首先ansible基于python2.X 环境&#xff0c;默认centos都已经安装好了python2环境 // 最好更新下库 // yum update yum install -y epel-release yum i…...

Spring Boot、Spring Cloud、Spring Alibaba 版本对照关系及稳定兼容版本

Spring Boot、Spring Cloud、Spring Alibaba 版本对照关系及稳定兼容版本 引言 在 Java 生态系统中&#xff0c;Spring Boot、Spring Cloud 和 Spring Alibaba 是非常流行的框架&#xff0c;它们提供了丰富的功能和优雅的解决方案。然而&#xff0c;随着不断的发展和更新&…...

虫情监测仪介绍—技术原理、功能优势是什么?

KH-CQPest虫情监测仪是做好虫情监测的重要设备&#xff0c;利用虫情监测仪能够对农业大田、智慧温室、林业等场景的害虫分布情况及害虫种类进行监测&#xff0c;协助人们制定合理的防治措施。 1.技术原理&#xff1a; KH-CQPest虫情监测仪采用光学诱虫原理&#xff0c;配合传感…...

HTML5 Canvas和Svg:哪个简单且好用?

HTML5 Canvas 和 SVG 都是基于标准的 HTML5 技术&#xff0c;可用于创建令人惊叹的图形和视觉体验。 首先&#xff0c;让我们花几句话介绍HTML5 Canvas和SVG。 什么是Canvas? Canvas&#xff08;通过 标签使用&#xff09;是一个 HTML 元素&#xff0c;用于在用户计算机屏幕…...

ChatGPT在社交媒体聊天和评论分析中的应用如何?

ChatGPT在社交媒体聊天和评论分析中具有广泛的应用前景&#xff0c;可以帮助企业、个人和社会从多个角度更好地理解用户观点、趋势和情感。以下是详细的讨论&#xff1a; **1. 舆情分析与趋势预测&#xff1a;** ChatGPT可以用于分析社交媒体上的评论、帖子和消息&#xff0c;…...

DoIP学习笔记系列:(四)用CAPL脚本读取DID的关键点

文章目录 1. 如何在CAPL中读取DID?1.1 避坑如何新建CAPL工程,在此不再赘述,本章主要分享一下如何在CAPL中调用DoIP接口、diag接口进行DoIP和诊断的测试。 1. 如何在CAPL中读取DID? 通常在实际项目中,会有很多DID,各种版本号、各种观测量,如果手动点,显然很麻烦,如果要…...

chrome插件开发实例06-定制自己的Chrome DevTools调试工具

目录 Chrome DevTools 调试工具 演示 ​编辑 源码 devtools.html devtools.js panel.html panel.js...

安卓读取,添加,更新,删除联系人,读取短信

目录 读取联系人 添加联系人 更新联系人 删除联系人 读取短信 读取联系人 安卓可以通过contentResolver来读取联系人表&#xff0c;联系人表的Uri信息是&#xff1a;content://com.android.contacts/data/phones 从而输出联系人信息&#xff0c; 需要相关权限&#xff1a…...

Practices6|69. x 的平方根、(哈希表)205. 同构字符串、(哈希表)1002. 查找共用字符

69. x 的平方根 1.题目&#xff1a; 给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。 由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被 舍去 。 注意&#xff1a;不允许使用任何内置指数函数和算符&#xff0c;例如 pow(x, 0.…...

Qt扫盲-Model/View入门

Model/View 编程入门 一、概述二、介绍1. 标准部件2. Model/View 控件3. Model/View控件概述4. 在表格单和 model 之间使用适配器 Adapters 三、 简单的 model / view 应用程序示例1. 一个只读表2. 使用role扩展只读示例3. 表格单元中的时钟4. 为列和行设置标题5. 最小编辑示例…...

关于win11 debian wsl 子系统安装启动docker一直starting,无法启动

首先我先说明&#xff0c;我的步骤都是按照官网步骤来的 通过官网的操作步骤 通过测试命令 sudo docker run hello-world得到下面的命令&#xff0c;我们通过启动命令 sudo service docker start 执行结果如下图 也就是说无法启动&#xff0c;一直显示在启动中 遇到这种情况…...

Nginx反向代理配置+负载均衡集群部署

文章目录 负载均衡反向代理基础环境部署&#xff1a;什么是代理实验环境图流量过程 环境部署准备两台Web服务器安装Nginx准备页面内容添加主机名 代理服务器配置 修改windos hosts文件测试&#xff1a;终端浏览器 负载均衡反向代理基础环境部署&#xff1a; 什么是代理 正向代…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...