RKNPU2从入门到实践 --- 【4】RKNN 模型构建【使用pycharm一步一步搭建RKNN模型】

news2024/12/23 5:02:33

目录

前言

1.1 RKNN 初始化及对象释放 

1.1.1 概念介绍 

1.1.2 实际演示

1.2 RKNN 模型配置

1.2.1 概念介绍 

1.2.2 实际演示 

1.3 模型加载

1.3.1 概念介绍

1.3.1.1 Caffe模型加载接口

1.3.1.2 TensorFlow模型加载接口

1.3.1.3 TensorFlowLite 模型加载接口

1.3.1.4 ONNX 模型加载接口

1.3.1.5 DarkNet模型加载接口 ​编辑​编辑

1.3.1.6 PyTorch 模型加载接口 

​编辑 1.3.2 实际演示

1.4 构建RKNN模型

1.4.1 概念介绍 

​编辑1.4.2 实际演示 

1.5 导出RKNN模型

1.5.1 概念介绍 

1.5.2 实际演示 

1.6 最终测试

前言

本篇博文中所使用到的系统为Ubuntu 20系统,搭建好RKNN Toolkit2环境后,方可继续往下看。
RKNN Toolkit2使用流程图如下所示: 


RKNN模型构建流程如下图所示:

      打开 VMware 虚拟软件,启动linux虚拟系【Ubuntu20系统】,在该系统中你已经配置好了RKNNToolkit2环境。
      随后打开pycharm【在虚拟linux系统中打开的pycharm】,创建一个名为 export_rknn_learning 的文件夹,在该文件夹中创建一个名为export_rknn.py文件,创建一个log.txt文件用于存放日志信息,如下图所示。
随后按照如下步骤:

1.1 RKNN 初始化及对象释放 

1.1.1 概念介绍 

      在使用 RKNNToolkit2 的所有 API 接口时,都需要先调用 RKNN()方法初始化 RKNN 对象,当不 再使用该对象时,通过调用该对象的 release()方法进行释放。
      初始化 RKNN 对象时,可以设置 verbose 和 verbose_file 参数,从而打印详细的日志信息。其 中 verbose 参数指定是否要在终端打印详细日志信息;如果设置了 verbose_file 参数,且 verbose 参数值为 True,日志信息还将写到该参数指定的文件中。 举例如下:

from rknn.api import RKNN
#将详细的日志信息输出到终端,并写到 mobilenet_build.log 文件中
rknn=RKNN(verbose=True,verbose_file='./mobilenet_build.log')
rknn=RKNN(verbose=True) #将详细的日志信息输出到终端
…
rknn.release()
1.1.2 实际演示

第一步和最后一步的代码如下所示: 

 运行上述代码,得到:

log.txt 文件中的内容为:

红色框给出了 rknn-toolkit2 的版本,蓝色框给出了已经将日志log信息保存到 log.txt 文件中。

1.2 RKNN 模型配置

1.2.1 概念介绍 

      在构建 RKNN 模型之前,需要先对模型进行通道均值、量化图片 RGB2BGR 转换、量化类型等配置,这些操作需要通过 config 接口进行配置。


举例如下:

rknn.config(mean_values=[123.675,116.28,103.53],std_values=[58.395,58.395,58.395])
1.2.2 实际演示 

第二步代码如下: 

第二步代码添入后整体代码如下所示: 

from rknn.api import RKNN

if __name__ == '__main__':

    # 第一步:创建一个RKNN对象
    rknn = RKNN(verbose=True, verbose_file='log.txt')
    
    # 第二步:调用config接口配置要生成的RKNN模型
    rknn.config(
        mean_values=[[123.675, 116.28,103.53]], # mean_values 表示预处理要减去的均值化参数
        std_values=[[58.395, 58.395, 58.395]], # std_values 表示预处理要除的标准化参数
        # 上面这两个参数在模型训练时就已经设置好了,在这里应与训练时的取值一至
        quantized_dtype='asymetric_quantized-8', # quantized_dtype 表示量化类型
        quantized_method='channel', # quantized_method 表示量化的方式
        quantized_algorithm='normal', # quantized_algorithm 表示量化的算法
        quant_img_RGB2BGR=False, # 
        target_platform='rk3588', # target_platform 表示RKNN模型的运行平台
        float_dtype='float16', # float_dtype 表示RKNN模型中的默认浮点数类型
        optimization_level=3, # optimization_level 表示模型优化等级
        custom_string='this is my rknn model', # 添加自定义字符串信息到 RKNN 模型
        remove_weight=False, # remove_weight 表示生成一个去除权重信息的从模型
        compress_weight=False, # 压缩模型权重,可以减小RKNN模型的大小。默认为False
        inputs_yuv_fmt=False, # 表示RKNN模型输入数据的YUV格式
        single_core_mode=False # 表示构建的RKNN模型运行在单核心模式,只适用RK3588
        
    )
    # 第三步:
    # 最后一步:释放RKNN对象(不再使用RKNN时)
    rknn.release()



 

1.3 模型加载

1.3.1 概念介绍

      RKNN-Toolkit2 目前支持 Caffe、TensorFlow、TensorFlowLite、ONNX、DarkNet、PyTorch 等模型 的加载转换,这些模型在加载时需调用对应的接口,以下为这些接口的详细说明。

1.3.1.1 Caffe模型加载接口

1.3.1.2 TensorFlow模型加载接口


举例如下:

1.3.1.3 TensorFlowLite 模型加载接口

1.3.1.4 ONNX 模型加载接口

1.3.1.5 DarkNet模型加载接口 

1.3.1.6 PyTorch 模型加载接口 

 1.3.2 实际演示

我们以pytorch模型结构为例,将提前准备好的 resnet18.pt 文件复制粘贴到虚拟机虚拟系统中的项目文件夹中,如下所示:


第三步代码如下:

第三步代码添入后整体代码如下:
 

from rknn.api import RKNN

if __name__ == '__main__':

    # 第一步:创建一个RKNN对象
    rknn = RKNN(verbose=True, verbose_file='log.txt')
    
    # 第二步:调用config接口配置要生成的RKNN模型
    rknn.config(
        mean_values=[[123.675, 116.28,103.53]], # mean_values 表示预处理要减去的均值化参数
        std_values=[[58.395, 58.395, 58.395]], # std_values 表示预处理要除的标准化参数
        # 上面这两个参数在模型训练时就已经设置好了,在这里应与训练时的取值一至
        quantized_dtype='asymetric_quantized-8', # quantized_dtype 表示量化类型
        quantized_method='channel', # quantized_method 表示量化的方式
        quantized_algorithm='normal', # quantized_algorithm 表示量化的算法
        quant_img_RGB2BGR=False, # 
        target_platform='rk3588', # target_platform 表示RKNN模型的运行平台
        float_dtype='float16', # float_dtype 表示RKNN模型中的默认浮点数类型
        optimization_level=3, # optimization_level 表示模型优化等级
        custom_string='this is my rknn model', # 添加自定义字符串信息到 RKNN 模型
        remove_weight=False, # remove_weight 表示生成一个去除权重信息的从模型
        compress_weight=False, # 压缩模型权重,可以减小RKNN模型的大小。默认为False
        inputs_yuv_fmt=False, # 表示RKNN模型输入数据的YUV格式
        single_core_mode=False # 表示构建的RKNN模型运行在单核心模式,只适用RK3588
        
    )
    # 第三步:添加 load_xxx 接口进行常用深度学习模型的导入
    rknn.load_pytorch(
        model='./resnet18.pt', # model表示加载模型的地址
        input_size_list=[[1, 3, 224, 224]], # input_size_list 表示模型输入节点对应图片的尺寸和通道数
    )
    # 最后一步:释放RKNN对象(不再使用RKNN时)
    rknn.release()



1.4 构建RKNN模型

1.4.1 概念介绍 



举例如下:


1.4.2 实际演示 

第四步的代码如下:

 第四步代码添入后整体代码如下:

from rknn.api import RKNN

if __name__ == '__main__':

    # 第一步:创建一个RKNN对象
    rknn = RKNN(verbose=True, verbose_file='log.txt')
    
    # 第二步:调用config接口配置要生成的RKNN模型
    rknn.config(
        mean_values=[[123.675, 116.28,103.53]], # mean_values 表示预处理要减去的均值化参数
        std_values=[[58.395, 58.395, 58.395]], # std_values 表示预处理要除的标准化参数
        # 上面这两个参数在模型训练时就已经设置好了,在这里应与训练时的取值一至
        quantized_dtype='asymetric_quantized-8', # quantized_dtype 表示量化类型
        quantized_method='channel', # quantized_method 表示量化的方式
        quantized_algorithm='normal', # quantized_algorithm 表示量化的算法
        quant_img_RGB2BGR=False, # 
        target_platform='rk3588', # target_platform 表示RKNN模型的运行平台
        float_dtype='float16', # float_dtype 表示RKNN模型中的默认浮点数类型
        optimization_level=3, # optimization_level 表示模型优化等级
        custom_string='this is my rknn model', # 添加自定义字符串信息到 RKNN 模型
        remove_weight=False, # remove_weight 表示生成一个去除权重信息的从模型
        compress_weight=False, # 压缩模型权重,可以减小RKNN模型的大小。默认为False
        inputs_yuv_fmt=False, # 表示RKNN模型输入数据的YUV格式
        single_core_mode=False # 表示构建的RKNN模型运行在单核心模式,只适用RK3588
        
    )
    # 第三步:添加 load_xxx 接口进行常用深度学习模型的导入
    rknn.load_pytorch(
        model='./resnet18.pt', # model表示加载模型的地址
        input_size_list=[[1, 3, 224, 224]], # input_size_list 表示模型输入节点对应图片的尺寸和通道数
    )

    # 第四步:使用build接口来构建RKNN模型
    rknn.build(
        do_quantization=True, # do_quantization 表示是否对RKNN模型进行量化操作
        dataset='dataset.txt', # dataset 表示要量化的图片
        rknn_batch_size=-1, # 目前用不到
    )
    # 最后一步:释放RKNN对象(不再使用RKNN时)
    rknn.release()



1.5 导出RKNN模型

1.5.1 概念介绍 

通过本工具构建的 RKNN 模型通过该接口可以导出存储为 RKNN 模型文件,用于模型部署。 

1.5.2 实际演示 

 第五步代码如下所示:

 第五步代码添入后的整体代码如下所示:

from rknn.api import RKNN

if __name__ == '__main__':

    # 第一步:创建一个RKNN对象
    rknn = RKNN(verbose=True, verbose_file='log.txt')
    
    # 第二步:调用config接口配置要生成的RKNN模型
    rknn.config(
        mean_values=[[123.675, 116.28,103.53]], # mean_values 表示预处理要减去的均值化参数
        std_values=[[58.395, 58.395, 58.395]], # std_values 表示预处理要除的标准化参数
        # 上面这两个参数在模型训练时就已经设置好了,在这里应与训练时的取值一至
        quantized_dtype='asymetric_quantized-8', # quantized_dtype 表示量化类型
        quantized_method='channel', # quantized_method 表示量化的方式
        quantized_algorithm='normal', # quantized_algorithm 表示量化的算法
        quant_img_RGB2BGR=False, # 
        target_platform='rk3588', # target_platform 表示RKNN模型的运行平台
        float_dtype='float16', # float_dtype 表示RKNN模型中的默认浮点数类型
        optimization_level=3, # optimization_level 表示模型优化等级
        custom_string='this is my rknn model', # 添加自定义字符串信息到 RKNN 模型
        remove_weight=False, # remove_weight 表示生成一个去除权重信息的从模型
        compress_weight=False, # 压缩模型权重,可以减小RKNN模型的大小。默认为False
        inputs_yuv_fmt=False, # 表示RKNN模型输入数据的YUV格式
        single_core_mode=False # 表示构建的RKNN模型运行在单核心模式,只适用RK3588
        
    )
    # 第三步:添加 load_xxx 接口进行常用深度学习模型的导入
    rknn.load_pytorch(
        model='./resnet18.pt', # model表示加载模型的地址
        input_size_list=[[1, 3, 224, 224]], # input_size_list 表示模型输入节点对应图片的尺寸和通道数
    )

    # 第四步:使用build接口来构建RKNN模型
    rknn.build(
        do_quantization=True, # do_quantization 表示是否对RKNN模型进行量化操作
        dataset='dataset.txt', # dataset 表示要量化的图片
        rknn_batch_size=-1, # 目前用不到
    )
    # 第五步:调用export_rknn接口导出RKNN模型
    rknn.export_rknn(
        export_path='resnet18.rknn',# 表示导出的RKNN模型路径
    )
    # 最后一步:释放RKNN对象(不再使用RKNN时)
    rknn.release()



1.6 最终测试

经过了前面的步骤,我们现在可以通过运行代码来完成了RKNN模型的导出工作,运行代码,得到如下图所示:

至此,我们完成了RKNN模型的导出工作,接下来可进行模型评估工作了。

 

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

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

相关文章

debian12 - 修改SSH端口连接回包

文章目录 debian12 - 修改SSH端口连接回包概述笔记先猜猜回包是哪个程序回的去下载对应版本的openssh代码工程用telnet测试的效果todo 关于ssh状态为active(start)的原因END debian12 - 修改SSH端口连接回包 概述 和同学讨论问题。 他说,用telnet去连接SSH端口&am…

数据仓库系列10:如何处理维度表中的变化类型?

想象一下,你正在管理一个电商平台的数据仓库。突然,你发现一个重要客户的地址发生了变化。这个简单的变更可能会对你的分析产生巨大影响。如何确保你的数据仓库能够准确地反映这种变化,同时又不丢失历史信息?欢迎来到数据仓库中最具挑战性的问题之一:维度表变化的处理。 目录…

记录imbalanced_learn离线安装

1 离线安装需要3个文件: 文件位置: ‘D:\非常重要\imbalanced-learn’ 2 复制到这个路径,即可 ‘…/miniconda3/lib/python3.8/site-packages’

数据结构与算法——Java实现 1.初识算法 —— 二分查找

目录 一、线性查找 二、二分查找 基础版 问题1 —— 循环条件 问题2 —— ij/2有没有问题 问题3 —— 代码中都写成 < 有何好处 改动版 人生的意义就是要独自穿过悲喜 —— 24.8.27 需求:在有序数组A内&#xff0c;查找值 target&#xff0c;如果找到返回索引&#xff0c;如…

小鹏在这次发布会上有哪些黑科技呢?

在今晚举办的小鹏10年热爱之夜&小鹏MONA MO3上市发布会上&#xff0c;何小鹏宣布&#xff0c;小鹏自研图灵芯片已于8月23日流片成功。据介绍&#xff0c;小鹏图灵芯片是全球首颗同时应用在AI汽车、机器人、飞行汽车的AI芯片&#xff0c;为AI大模型定制。 该芯片采用40核心…

【STM32】时钟体系

一、时钟体系 为什么需要时钟&#xff1f; 时钟可以为系统提供精确的定时&#xff0c;比如时间显示&#xff0c;定时器&#xff0c;pwm… 为芯片各功能模块提供工作势能,使能各组管脚工作&#xff0c;如果不使能&#xff0c;管脚无法工作 同步数据传输 给单片机提供一个时…

RabbitMQ中的死信交换机?(RabbitMQ延迟队列有了解过吗)

延迟队列 延迟队列:进入队列的消息会被延迟消费的队列。 延迟队列死信交换机 TTL&#xff08;过期时间&#xff09; 延迟队列的使用场景:超时订单、限时优惠、定时发布 死信交换机 当一个队列中的消息满足下列情况之一时&#xff0c;可以成为死信(dead letter): 消费者使…

探讨Vision Pro的成本优化与设计改进之路

随着Apple Vision Pro的发布,这款革命性的头戴式显示设备凭借其创新技术和用户体验吸引了大量关注。然而,高昂的价格成为了一个不可忽视的问题,阻碍了它的普及。为了让更多消费者能够负担得起这款产品,Apple需要探索各种方法来降低成本而不牺牲用户体验。本文将总结一些关于…

医用双目放大镜行业分析:前五大厂商占有大约39.0%的市场份额

一、当前市场状况 1. 市场规模与增长趋势 - 目前医用双目放大镜市场呈现出稳定增长的态势。据报告显示&#xff0c;预计到 2030 年全球市场规模将达到 5.2 亿美元&#xff0c;年复合增长率为 7.8%&#xff0c;这表明该行业具有较大的发展潜力。 - 增长的动力主要来自医疗行业…

排序算法(冒泡、插入、选择、快排、归并)原理动画及Python、Java实现

排序算法&#xff08;冒泡、插入、选择、快排、归并&#xff09;原理动画及Python、Java实现 1 冒泡排序1.1 原理1.2 Python、Java实现 2 插入排序2.1 原理2.2 Python、Java实现 3 选择排序3.1 原理3.2 Python、Java实现 4 快速排序4.1 原理4.2 Python、Java实现 5 归并排序5.1…

【机器学习】独立成分分析的基本概念、应用领域、具体实例(含python代码)以及ICA和PCA的联系和区别

引言 独立成分分析&#xff08;Independent Component Analysis&#xff0c;简称ICA&#xff09;是一种统计方法&#xff0c;用于从多个观察到的混合信号中提取出原始的独立信号源 文章目录 引言一、独立成分分析1.1 定义1.2 独立成分分析的基本原理1.3 独立成分分析的步骤1.3.…

RASA使用长文记录以及一些bug整理

RASA 学习笔记整理 一 安装 在虚拟环境中安装&#xff0c;进入python3版本的环境 conda activate python3 ai04机器旧版本&#xff1a;rasa-nlu和rasa-core是分开安装的 最新版本&#xff1a;rasa 将二者做了合并 直接安装 pip3 install rasa 在安装到如下步骤时候会报…

读软件开发安全之道:概念、设计与实施11安全地编程

1. 安全地编程 1.1. 在一个完整的软件设计过程中&#xff0c;我们要在创建和审查时就将安全性放在心中&#xff0c;但这只是产品开发过程的开始&#xff0c;接下来是实现、测试、部署、运行、监控、维护&#xff0c;并最终在生命周期结束时将其淘汰 1.2. 开发人员不仅必须忠实…

Android Launcher启动过程

## Launcher的启动流程&#xff1a; 1.Zygote进程 –> SystemServer进程 –> startOtherService方法 –> ActivityManagerService的systemReady方法 –> startHomeActivityLocked方法 –> ActivityStackSupervisor的startHomeActivity方法 –> 执行Activity…

Java | Leetcode Java题解之第380题O(1)时间插入、删除和获取随机元素

题目&#xff1a; 题解&#xff1a; class RandomizedSet {List<Integer> nums;Map<Integer, Integer> indices;Random random;public RandomizedSet() {nums new ArrayList<Integer>();indices new HashMap<Integer, Integer>();random new Rando…

Java9模块化系统JPMS(Java Platform Module System)

引言 随着Java技术的发展&#xff0c;开发人员面临的挑战之一是如何有效地管理和组织大型项目的依赖关系。传统的类路径&#xff08;classpath&#xff09;方法虽然简单&#xff0c;但在大型项目中却难以管理&#xff0c;尤其是在面对复杂的依赖关系时。为了解决这些问题&…

Kafka入门:从零开始了解分布式流处理平台

什么是Kafka Apache Kafka是由LinkedIn公司开发&#xff0c;后来由Apache软件基金会维护的一个分布式、分区、多副本的基于ZooKeeper协调的分布式消息系统。Kafka不仅是一个消息队列&#xff0c;还是一个强大的流处理平台&#xff0c;它能够实时地处理大量数据&#xff0c;满足…

Springboot如何实现redis消息的订阅发布

1. 环境准备 确保你已经安装了 Redis 服务器&#xff0c;并且可以在本地或者远程访问它。如果你还没有安装 Redis&#xff0c;请先安装并启动 Redis 服务。 2. 创建 Spring Boot 项目 使用 Spring Initializr 或者其他 IDE 创建一个新的 Spring Boot 项目&#xff0c;并添加以下…

Leetcode 1047-删除字符串中的所有相邻重复项

给出由小写字母组成的字符串 S&#xff0c;重复项删除操作会选择两个相邻且相同的字母&#xff0c;并删除它们。 在 S 上反复执行重复项删除操作&#xff0c;直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。 题解 题目链接 //先进后出&a…

cubeide Target is not responding, retrying... 或基于vscode方式等 无法调试

点击调试输出如图&#xff1a; 基于cubeidet开发环境&#xff0c;debug后输出&#xff1a; 基于vscode开发环境&#xff1a; OpenOCD: GDB Server Quit Unexpectedly. See gdb-server output in TERMINAL tab for more details. 解决方法&#xff1a; 这里的调试选择一个&…