rknn_convert的使用方法
rknn_convert是RKNN-Toolkit2提供的一套常用模型转换工具,通过封装上述API接口,用户只需编辑模型对应的yml配置文件,就可以通过指令转换模型。以下是如何使用rknn_convert工具的示例命令以及支持的指令参数:
python -m rknn.api.rknn_convert -t rk3588 -i ./model_config.yml/onnx -o ./output_path
通过使用上述命令和参数,用户可以将模型转换为RKNN格式,并将转换后的模型保存到指定的输出路径。
注意:我写这个功能主要是为了方便临时测试,不要写代码就可以进行简单的连板调试
部分指令参数说明如下:
- -i: 模型配置文件(.yml/onnx)路径,如果只是评估rknn模型在板子上的精度、速度和内存使用情况可以直接使用onnx模型,也可以配置yml(挺繁琐的但是也有小部分人用)。
- -o: 转换后模型输出路径。
- -t: target_platform,目标平台可以选择rv1103,rv1103b, rv1106,rv1106b,rv1126b, rk2118,rk3562,rk3566,rk3568,rk3576或rk3588(只要不是rknpu1都可以)。
- -e: (选填) 评估连板运行时model的耗时和内存占用,若开启请输入-e。注:一定要连接相应开发板并正确设置
target_platform,否则会报错,当有多设备时可通过-d参数指定设备ID。 - -a: (选填)评估生成的rknn模型精度,开启模拟器精度评估请输入-a "xx1.jpg”,如果模型是两输入则-a “xx1.jpg xx2.jpg”,若要开启连板精度评估请配合-d参数使用。
- -v: (选填)指定是否要在屏幕上打印详细日志信息,若开启打印模式请输入-v。
- -d: (选填)单个adb设备使用-d,多adb设备使用-d device_id,device_id通过adb devices查询。
- -do_Quant:若要量化成int8就设置这个参数,后接量化集xxx.txt,如果这个参数不设置默认使用fp16,即不量化
- -onnx_inputs:有时候onnx的输入可能是[?,3,384,384]这种没有指定的,则可以使用该参数固定shape,比如-onnx_inputs “{‘img’:[1,3,384,384]}”
- -onnx_outputs:可以用来截断模型,比如-onnx_outputs “[‘output_0’,‘output_1’]”
- -custom_hybrid:用来fi16和i8混合量化的功能(1106则是int16和int8混合量化),实现的效果可以参考rknn model zoo的yolov8 pose混合量化
- -h: 查询具体参数
具体参数如下
Usage: python script.py [OPTIONS]
Options:-i, --input : yml config file path (required)-o, --output : output dir-t, --target_platform : target_platform, support rk3568/rk3566/rk3562/rk3588/rv1126b (required)-e, --eval_perf_memory : eval model perf and memory, board debugging is required, multi adb device use -d, default=false (default: False)-a, --accuracy_analysis : Usage: -a "xx1.jpg xx2.jpg". Simulator accuracy_analysis, if want to turn on board accuracy_analysis, please use -d-v, --verbose : whether to print detailed log information on the screen, default=false (default: False)-d, --device_id : Single adb device usage: -d. Multi adb device usage:-d device_id-mean, --mean : Usage: -mean "[0,0,0]" or "[[127],[127],[127]]", default is 0-std, --std : Usage: -std "[1,1,1]" or "[[127],[127],[127]]", default is 1-do_Quant, --do_Quant : Attach dataset txt file, such as -do_Quant xxx.txt. If there is no txt file, do_quantization=False by default.-onnx_inputs, --onnx_inputs : Usage: -onnx_inputs "{'Cast_0':[1,3,384,384],'Cast_1':[1,3,640,640]}"-onnx_outputs, --onnx_outputs : Usage: -onnx_outputs "['output_0','output_1']"-dynamic_input, --dynamic_input : Usage: -dynamic_input "[[[1,3,256,256]],[[1,3,160,160]]]"-RGB2BGR, --quant_img_RGB2BGR : quant_img_RGB2BGR, default=false (default: False)-Quant_algorithm, --quantized_algorithm : Usage: -Quant_algorithm normal/mmse/kl_divergence, default='normal' (default: normal)-compress_weight, --compress_weight : compress_weight, default=false (default: False)-single_core_mode, --single_core_mode : single_core_mode, default=false (default: False)-Quant_dtype, --quantized_dtype : quantized_dtype support: w8a8, w8a16, w16a16i, w16a16i_dfp, w4a16. default is w8a8 (default: w8a8)-custom_hybrid, --custom_hybrid : Usage: -custom_hybrid "[['start_node_name','end_node_name']]"
下面是一个使用onnx输入的例子(注意外层使用” “,内层使用’ ',要不然会有bug,比如-onnx_outputs “[‘output_0’]”):
python -m rknn.api.convert -i xxx.onnx/yml -o ./ -t rk3588 -do_Quant xxx.txt -mean "[0,0,0]" -std "[255,255,255]" -onnx_inputs "{'Cast_0':[1,3,384,384]}"-onnx_outputs "['output_0']" -Quant_algorithm kl_divergence -a "xx1.jpg" -e -d 123456 -custom_hybrid "[['/model.22/cv4.0/cv4.0.0/act/Mul_output_0','/model.22/Concat_6_output_0']]"
下面是一个参考的yml配置文件(object_detection.yml):
models:# model output namename: object_detection # Original model frameworkplatform: onnx # Model input file pathmodel_file_path: ./object_detection.onnx # Describe information such as input and output shapessubgraphs: # model input tensor shapeinput_size_list: - 1,3,512,512# input tensor nameinputs: - data# output tensor nameoutputs: - conv6-1- conv6-2- conv6-3# quantification flagquantize: true # Quantify dataset file path (relative yml path)dataset: ./dataset.txt configs:quantized_dtype: asymmetric_quantized-8 # rknn.config mean_values mean_values: [127.5,127.5,127.5] # rknn.config std_values std_values: [128.0,128.0,128.0] # rknn.config quant_img_RGB2BGR quant_img_RGB2BGR: false # rknn.config quantized_algorithm quantized_algorithm: normal
这个配置文件包括了模型的名称、原始模型使用的框架、模型文件路径、输入输出信息、是否进行量化等详细信息。用户可以根据模型的特定需求编辑相应的配置文件。
模型转换配置详见下表:
| 参数名 | 填写内容 |
|---|---|
| -name | 模型输出名称 |
| -platform | 原始模型使用的框架,支持tensorflow、tflite、caffe、onnx、pytorch、darknet |
| -model_file_path | 原始模型文件路径,适用于单模型文件输入,例:tensorflow、tflite、onnx、pytorch |
| -quantize | 是否开启量化 |
| -dataset | 量化dataset文件路径(相对yml配置文件路径),若要开启accuracy_analysis此项必填 |
| -prototxt_file_path | platform为caffe时,模型的prototxt文件 |
| -caffemodel_file_path | platform为caffe时,模型的caffemodel文件 |
| -darknet_cfg_path | platform为darknet时,模型的cfg文件 |
| -darknet_weights_path | platform为darknet时,模型的weight文件 |
| -subgraphs | 描述输入输出shape等信息。除特定框架外,一般情况下该参数及附带的子参数可不写,使用模型默认值 |
| ----input_size_list(子参数) | 输入tensor的shape |
| ----inputs(子参数) | 输入tensor的名称 |
| ----outputs(子参数) | 输出tensor的名称 |
| -configs | 对应rknn.config()配置 |
| ----quantized_dtype(子参数) | 量化类型,RKNN_toolkit2: 可填写 [asymmetric_quantized-8],不输入用默认值 |
| ----mean_values(子参数) | 输入的均值归一数,模型为单输入RGB如[123.675,116.28,103.53],若为多输入如[[123,116,103],[255,255,255]] |
| ----std_values(子参数) | 输入的方差归一数,模型为单输入RGB如[58.395,58.295,58.391],若为多输入如[[127,127,127],[255,255,255]] |
| ----quant_img_RGB2BGR(子参数) | 用于控制量化时加载量化校正图像时是否需要先进行RGB到 BGR 的转换,默认值是False |
| ----quantized_algorithm(子参数) | 量化算法,可选[‘normal’, ‘kl_divergence’, ‘mmse’],默认为 normal |
| ----quantized_method(子参数) | 量化方式,RKNN_toolkit2可选[‘layer’, ‘channel’],默认为channel |
| ----optimization_level(子参数) | 设置优化级别。默认为3,表示使用所有默认优化选项 |
| ----model_pruning(子参数) | 修剪模型以减小模型大小,默认为false,开启为true |
| ----quantize_weight(子参数) | 当quantize参数为false时,通过量化一些权重来减小rknn模型的大小。默认为false,开启为true |
| ----single_core_mode(子参数) | 是否仅生成单核模型,可以减小RKNN模型的大小和内存消耗。默认值为False。目前对RK3588/RK3576生效。默认值为 False |
| ----compress_weight(子参数) | 压缩权重使rknn模型更小,默认为false,开启为true |
| ----inputs_yuv_fmt(子参数) | 输入配置为YUV格式,默认为false |
相关文章:
rknn_convert的使用方法
rknn_convert是RKNN-Toolkit2提供的一套常用模型转换工具,通过封装上述API接口,用户只需编辑模型对应的yml配置文件,就可以通过指令转换模型。以下是如何使用rknn_convert工具的示例命令以及支持的指令参数: python -m rknn.api.…...
Turtle综合案例实战(绘制复杂图形、小游戏)
在学习了 Turtle 基本的绘图技巧后,我们可以通过结合多个概念和技巧,绘制复杂的图形或实现简单的小游戏。本章将介绍两个实战案例: 绘制复杂图形:结合前面所学的知识,绘制一个精美的多层次复杂图案。简单的游戏:利用 Turtle 实现一个简单的小游戏——蛇形游戏,这是一个经…...
[dp5_多状态dp] 按摩师 | 打家劫舍 II | 删除并获得点数 | 粉刷房子
目录 1.面试题 17.16. 按摩师 题解 2.打家劫舍 II 题解 3.删除并获得点数 题解 4.粉刷房子 题解 一定要有这样的能力,碰到一个新题的时候,可以往之前做过的题方向靠! 打家劫舍问题模型: 不能选择相邻的两个数,并且要最终…...
DM数据库配置归档模式的两种方式
归档模式,联机日志文件中的内容保存到硬盘中,形成归档日志文件(REDO日志)。 采用归档模式会对系统的性能产生些许影响,然而系统在归档模式下运行会更安全,当 出现故障时其丢失数据的可能性更小,这是因为一旦出现介质故…...
Leetcode 2440 -- dfs | 枚举
题目描述 创建价值相同的连通块 思路 代码 class Solution { public:int componentValue(vector<int>& nums, vector<vector<int>>& edges) {// get max_val and sum_valint n nums.size();int max_val -1, sum_val 0;for(auto &x : nums) m…...
Vue 中 this.$emit(“update:xx“,value) 和 :xx.sync 实现同步数据的做法
在 Vue 2.x 中,this.$emit(update:xx, value) 和 xx.sync 都是用来实现父子组件之间的数据同步的方式,它们背后的工作原理有些相似,但语法上有所不同。让我们逐个详细解释这两者的使用方式。 xx.sync(语法糖) xx.syn…...
Agent TARS与Manus的正面竞争
Agent TARS 是 Manus 的直接竞争对手,两者在 AI Agent 领域形成了显著的技术与生态对抗。 一、技术架构与功能定位的竞争 集成化架构 vs 模块化设计 Agent TARS 基于字节跳动的 UI-TARS 视觉语言模型,将视觉感知、推理、接地(grounding&#…...
【Tauri2】013——前端Window Event与创建Window
前言 【Tauri2】012——on_window_event函数-CSDN博客https://blog.csdn.net/qq_63401240/article/details/146909801?spm1001.2014.3001.5501 前面介绍了on_window_event,这个在Builder中的方法,里面有许多事件,比如Moved,Res…...
创建Linux虚拟环境并远程连接,finalshell自定义壁纸
安装VMware 这里不多赘述。 挂载Linux系统 1). 打开Vmware虚拟机,打开 编辑 -> 虚拟网络编辑器(N) 选择 NAT模式,然后选择右下角的 更改设置。 设置子网IP为 192.168.100.0,然后选择 应用 -> 确定。 解压 CentOS7-1.zip 到一个比较大…...
DBAPI设置服务器开机自启动
在 /etc/systemd/system 目录下创建一个新的服务文件,例如 dbapi.service [Unit] Descriptiondbapi standalone Service Afternetwork.target[Service] ExecStart/your-path/dbapi-enterprise-4.2.2/bin/dbapi.sh start standalone Restartalways Userroot[Install…...
基于pycharm的YOLOv11模型训练方法
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、前期准备1.1 软件环境配置1.2 训练集参考 二、训练步骤2.1 打开文件夹2.2 打开文件2.3 data.yaml最终代码 三、train.py四、最终结果五、detect.py六、 拓展…...
预测分析(三):基于机器学习的分类预测
文章目录 基于机器学习的分类预测分类任务逻辑回归分类树分类树的工作原理 随机森林多元分类朴素贝叶斯分类器贝叶斯公式回到分类问题**1. 算法原理****2. 主要类型****(1) 高斯朴素贝叶斯****(2) 多项式朴素贝叶斯****(3) 伯努利朴素贝叶斯** **3. 优缺点****4. 应用场景****5…...
基于大模型预测升主动脉瘤的多维度诊疗研究报告
目录 一、引言 1.1 研究背景 1.2 研究目的与意义 二、升主动脉瘤概述 2.1 定义与分类 2.2 发病原因与机制 2.3 流行病学现状 三、大模型技术原理及应用现状 3.1 大模型基本原理 3.2 在医疗领域的应用进展 3.3 针对升主动脉瘤预测的独特价值 四、术前大模型预测方案…...
解决Spring参数解析异常:Name for argument of type XXX not specified
前言 在开发 Spring Boot 应用时,我们常遇到类似 java.lang.IllegalArgumentException: Name for argument not specified 的报错。这类问题通常与方法参数名称的解析机制相关,尤其在使用 RequestParam、PathVariable 等注解时更为常见。 一、问题现象与…...
基数排序算法解析与TypeScript实现
基数排序(Radix Sort)是一种高效的非比较型整数排序算法,通过逐位分配与收集的方式实现排序。本文将深入解析其工作原理,并给出完整的TypeScript实现。 一、算法原理 1. 核心思想 多关键字排序:将整数按位数切割成不同…...
034-QSharedMemory
QSharedMemory 以下为针对 QSharedMemory 的技术调研及实现方案,包含原理、优化策略、完整代码实现及流程图解: 一、QSharedMemory 核心原理 1.1 共享内存机制 共享内存流程图 (注:此处应为共享内存IPC流程图,因文本…...
在 Ubuntu 上离线安装 Prometheus 和 Grafana
在 Ubuntu 上离线安装 Prometheus 和 Grafana 的步骤如下: 一.安装验证 二.安装步骤 1.准备离线安装包 在一台可以访问互联网的机器上下载 Prometheus 和 Grafana 的二进制文件。 Prometheus 下载地址:Prometheus 官方下载页面Grafana 下载地址&#…...
Ansible:playbook的高级用法
文章目录 1. handlers与notify2. tags组件3. playbook中使用变量3.1使用 setup 模块中变量3.2在playbook 命令行中定义变量3.3在playbook文件中定义变量3.4使用变量文件3.5主机清单文件中定义变量主机变量组(公共)变量 1. handlers与notify Handlers&am…...
【C++进阶九】继承和虚继承
【C进阶九】继承和虚继承 1.什么是继承2.继承关系2.1protected和private的区别2.2通过父类的函数去访问父类的private成员2.3默认继承 3.基类和派生类对象的赋值转换4.继承中的作用域5.子类中的默认成员函数6.继承与静态成员7. 菱形继承8.虚继承9.继承和组合 1.什么是继承 继承…...
近日八股——计算机网络
一.c. TCP握手为什么三次、不能是二次、或四次? i.不能是两次: 防止已经失效的连接报文突然又传到了服务端,产生错误 如果不采用三次握手,服务端直接建立连接,会白白浪费资源 三次握手告诉服务端,客户端有没有收这个数据&#…...
HOW - Axios 拦截器特性
目录 Axios 介绍拦截器特性1. 统一添加 Token(请求拦截器)2. 处理 401 未授权(响应拦截器)3. 统一处理错误信息(响应拦截器)4. 请求 Loading 状态管理5. 自动重试请求(如 429 过载)6…...
自适应信号处理任务(过滤,预测,重建,分类)
自适应滤波 # signals creation: u, v, d N = 5000 n = 10 u = np.sin(np.arange(0, N/10., N/50000...
电子电气架构 --- 面向服务的体系架构
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁&am…...
TypeScript 装饰器类型详解
TypeScript 装饰器类型详解 一、类装饰器 // 参数:类的构造函数 function ClassDecorator(constructor: Function) {Object.defineProperty(constructor.prototype, timestamp, {value: Date.now()}); }ClassDecorator class DataService {// 装饰后自动添加times…...
Nyquist内置函数-杂项函数
1 Nyquist内置函数-杂项函数 1.1 杂项函数 这些函数对于日常使用来说都是安全且推荐的。 1.1.1 to-mono(sound) [SAL] (to-mono sound) [LISP] 如果 sound 是多声道声音,返回其所有声道的总和;如果 sound 本身就是单声道声音,则直接返回&…...
基姆拉尔森计算公式
基姆拉尔森计算公式(Zellers Congruence 的变体)是一种快速根据公历日期计算星期几的数学公式。其核心思想是通过对年月日的数值进行特定变换和取模运算,直接得到星期几的结果。 公式定义 对于日期 年-月-日,公式如下:…...
5 分钟用满血 DeepSeek R1 搭建个人 AI 知识库(含本地部署)
最近很多朋友都在问:怎么本地部署 DeepSeek 搭建个人知识库。 老实说,如果你不是为了研究技术,或者确实需要保护涉密数据,我真不建议去折腾本地部署。 为什么呢? 目前 Ollama 从 1.5B 到 70B 都只是把 R1 的推理能力…...
Python数据可视化-第6章-坐标轴的定制
环境 开发工具 VSCode库的版本 numpy1.26.4 matplotlib3.10.1 ipympl0.9.7教材 本书为《Python数据可视化》一书的配套内容,本章为第6章 坐标轴的定制 本章主要介绍了坐标轴的定制,包括向任意位置添加坐标轴、定制刻度、隐藏轴脊和移动轴脊。 参考 第…...
18认识Qt坐标系
平面直角坐标系(笛卡尔坐标系) 数学上的坐标系 右手坐标系 计算机中的坐标系 左手坐标系 坐标系的原点(0,0) 就是屏幕的左上角 /窗口的左上角 给 Qt 的某个控件,设置位置,就需要指定坐标.对于这个控件来说, 坐标系原点就是相对于父窗口/控件的. QPushButton 的父元素/父控件/父…...
动态循环表单+动态判断表单类型+动态判断表单是否必填方法
页面效果: 接口请求到的数据格式: list: [{demandType: "设备辅助功能要求",demandSettingList: [{id: "1907384788664963074",name: "测试表单",fieldType: 0,contentValue: "",vaildStatus: 0, // 0 非必填&a…...
