AI嵌入式开发 ---- pt模型文件 -> ONNX模型 -> rknn模型 -> 部署到RK3588开发板上(以yolov5为例)

news2024/11/14 3:28:47

目录

一、前言

1.1 任务

1.2 开发板下跑预训练模型流程

二、pt 文件转换为 onnx 或 TorchScript 文件(平台:x86机器Windows系统)

二、将 .onnx 模型文件转换为 .rknn 模型文件【平台:x86上的 Linux虚拟系统】

三、在 Linux虚拟系统上仿真运行示例

四、RK3588部署 .rknn 模型实现NPU加速(连板调试)【平台:x86 windows PC linux虚拟系统(版本为Ubuntu 20.04)、RK3588开发板上为安卓系统】

一、前言

1.1 任务

1.将pt模型使用yolov5工程中的 export.py 转换为 onnx 模型;

2.将 onnx 模型使用 rknn-toolkit2 中 onnx 文件夹的 test.py 转换为 rknn 模型;

3.在板子上部署 rknn 模型,实现 NPU 推理加速。


1.2 开发板下跑预训练模型流程


1. 需要修改yolo.py文件:
2. 将yolov5s.pt通过export.py文件导出为yolov5s.onnx文件或者yolov5s.torchscript文件
3. 通过 rknn-toolkit2 工具将 yolov5s.onnx 文件或者yolov5s.torchscript文件转化为.rknn文件
4. 部署到 RK3588 开发板上
 

二、pt 文件转换为 onnx 或 TorchScript 文件(平台:x86机器Windows系统)

可参考: TFLite, ONNX, CoreML, TensorRT Export · Issue #251 · ultralytics/yolov5 · GitHub

      将 pt 模型转换为onnx或者TorchScript 时,需要修改 models/yolo.py 文件,将class Detect(nn.Module) 类的子函数 forward 由:

修改为:

 注意:在训练时不要修改 yolo.py 的这段代码,训练完成后使用 export.py 进行模型导出转换时一定要进行修改,不然会导致后面的rknn模型转换失败! 
修改后将best.pt移动至export.py同一文件夹下,在命令行调用以下命令:

python export.py --weights best.pt --img 640 --batch 1 --include onnx

命令格式为:

python export.py[注意该文件的位置所在] --weights xxx.pt[要转换的.pt文件] --img 640[模型输入图片尺寸] --batch 1[一般设置为1] --include onnx[转换成的文件格式]

转换为TorchScript 格式,得到best.torchscript 文件,如下所示:

python export.py --weights best.pt --img 640 --batch 1 --include torchscript

 我们便可以得到成功转换的模型best.onnx 或者 best.torchscript

我们实际演示一下:
我们从 yolo 官网下载 yolov5-6.0工程,在下载的过程中,我们直接下载了一个训练好的模型文件,将这个模型文件放置在export.py文件所在位置中,如下图所示:

在 Terminal 中输入指令:

随后点击回车,得到:


到此,我们已经将 .pt 文件成功转换为 .onnx 文件。
同样的方式,我们也可将 .pt 文件转换为 .torchscript 文件。如下图所示:


注意,在执行指令前,请确保你的电脑中已经安装了 onnx,若没有安装,请根据指令 pip install onnx 进行安装。
我们可以使用netron【https://netron.app】软件来查看导出的模型。

二、将 .onnx 模型文件转换为 .rknn 模型文件【平台:x86上的 Linux虚拟系统】

模型转换流程如下图所示: 

有了以上的best.onnx模型作为基础,现在可以正式开始rknn模型的转换了。此处的转换工具 rknn-toolkit2 只能在Linux系统上运行,这里我使用的是Windows PC上的Ubuntu虚拟机
配置rknn-toolkit2环境步骤如下所示【以下步骤均在linux系统中完成】:
1、安装miniconda;
2、创建RKNN虚拟环境;
3、安装及配置pycharm。
详细请参考博主的另一篇博文:【后续更新!
转换代码如下所示:

from rknn.api import RKNN
import os

if __name__ == '__main__':

    platform = 'rk3588'
    exp = 'yolov5s'
    Width = 640
    Height = 640
    MODEL_PATH = './onnx_models/yolov5s_rm_transpose.onnx'
    NEED_BUILD_MODEL = True

    # Create RKNN object
    rknn = RKNN()

    OUT_DIR = "rknn_models"
    RKNN_MODEL_PATH = './{}/{}_rm_transpose.rknn'.format(OUT_DIR,exp+'-'+str(Width)+'-'+str(Height))
    if NEED_BUILD_MODEL:
        DATASET = './dataset.txt'
        rknn.config(mean_values=[[0, 0, 0]], std_values=[[255, 255, 255]], target_platform="rk3588")
        # Load model
        print('--> Loading model')
        ret = rknn.load_onnx(MODEL_PATH)
        if ret != 0:
            print('load model failed!')
            exit(ret)
        print('done')

        # Build model
        print('--> Building model')
        ret = rknn.build(do_quantization=True, dataset=DATASET)
        if ret != 0:
            print('build model failed.')
            exit(ret)
        print('done')

        # Export rknn model
        if not os.path.exists(OUT_DIR):
            os.mkdir(OUT_DIR)
        print('--> Export RKNN model: {}'.format(RKNN_MODEL_PATH))
        ret = rknn.export_rknn(RKNN_MODEL_PATH)
        if ret != 0:
            print('Export rknn model failed.')
            exit(ret)
        print('done')
    else:
        ret = rknn.load_rknn(RKNN_MODEL_PATH)

    rknn.release()

在运行转换代码之前,必须要将rknn-toolkit2配置好。 运行上述代码,得到:


至此,我们完成了从 .onnx 到 .rknn 的转换工作。

三、在 Linux虚拟系统上仿真运行示例

RKNN-Toolkit2 自带了一个模拟器,可以用来仿真模型在 npu 上运行时的行为。就相当于Android Studio自带模拟器一样。那么真机就相当于开发板。

这里我以 yolov5 为例。examples中的yolov5是一个 onnx 模型,用于目标检测,它是在模拟器上运行的。

可以看到程序中执行的主要操作有:创建 RKNN 对象;模型配置;加载 onnx 模型;构建 RKNN 模型;导出 RKNN 模型;加载图片并推理,得到推理结果;释放 RKNN 对象。运行test.py,得到:


运行结果:

四、RK3588部署 .rknn 模型实现NPU加速(连板调试)【平台:x86 windows PC linux虚拟系统(版本为Ubuntu 20.04)、RK3588开发板上为安卓系统】

 1 首先连接好开发板硬件,连接好烧写线,屏幕,调试串口和电源。开发板烧写 Android12 系 统。在本小节中,作者使用的开发环境是 Ubuntu20.04。
2 开发板系统启动之后,在Windows平台上的linux虚拟系统中提示如下,我们将开发板连接到 Ubuntu20.04 上。

点击确定后即连接成功,连接成功示意图如下图所示,我们会在 linux 虚拟系统任务栏中看到一个手机的标识。

 如果没有这个提示,这说明开发板上面的USB设置没有设置好,请根据以下步骤进行设置。如果有这个提示,块引用部分可忽略不看。
 rk3588开发板USB设置
第一步:在屏幕上打开 “设置” ,如下图所示:

第二步:滑到最底端,点击“关于平板电脑”,如下图所示:

第三步:滑到最底部,找到版本号,连续点击版本号7次,便进入了开发者模式。如下图所示:

第四步:返回,点击 “系统”,如下图所示:

第五步:点击“开发者选项”,如下图所示:

第六步:然后打开USB调试,如下图所示:

第七步:设置默认USB配置,点击“USB默认配置”,选择“文件传输模式”,如下图所示:

该部分内容参考自:Android12 系统开发记录-迅为RK3588使用ADB工具


3 在 ubuntu20.04 上使用 adb 命令来连接开发板。如果没有安装 adb 命令,可以使用命令“apt install adb”安装。

 
adb命令的安装

安装好之后,输入命令 adb devices 查看 iTOP-RK3588 开发板。

4 如上图所示,iTOP-rk3588 开发板设备 id 号为“d762f22e1d14ddc5”,说明设备已经成功通过 adb 工具连接到开发板。
5 打开一个终端命令窗口,进入 RKNPU2 工程目录,如下所示: cd rknpu

6 adb 获得开发板 root 权限,输入以下命令: adb root

7 重新挂载开发板,输入以下命令: adb remount

根据上图提示,重新启动设备【rk3588开发板】使得设置起作用。重启后再次输入 adb remount指令,得到 :

8 更新板子的 rknn_server 和 librknnrt.so,rknn_server 和 librknnrt.so 介绍如下所示:

librknnrt.so: 是一个板端的 runtime 库。
rknn_server: 是一个运行在板子上的后台代理服务,用于接收 PC 通过 USB 传输过来的协议, 然后执行板端 runtime 对应的接口,并返回结果给 PC。


9 推送拷贝 rknn_server 到开发板,输入以下命令: adb push runtime/RK3588/Android/rknn_server/arm64/rknn_server /vendor/bin/

10 推送拷贝 librknnrt.so 到开发板,输入以下命令:
adb push runtime/RK3588/Android/librknn_api/arm64-v8a/librknnrt.so /vendor/lib64

11 打开 adb shell 命令行,即可操作 iTOP-rk3588 开发板。

12 修改 rknn_server 权限,并同步修改的内容[sync指令],输入以下命令: chmod +x /vendor/bin/rknn_server

13 重启设备【rk3588开发板】,输入以下命令: reboot

14 Android 系统启动时会自动运行 rknn_server, "ps -ef|grep rknn_server"可以查看是否运行,如下 图所示:

15 我们进入 rknn-toolkit2-master 文件夹。以 demo(onnx/yolov5)为例,使用 rk3588 平台进行推 理。输入以下命令进入 examples/onnx/yolov5 文件夹。

16 修改 examples/onnx/yolov5/test.py 文件,我们修改对应的平台为 rk3588,修改如下所示,“-” 代表需要删除的内容,“+”代表需要新增的内容


修改完,保存文件并退出。
17 使用““ conda activate rknn”激活相应的 rknn 环境

18 在运行模型之前,首先检查开发板是否被识别到,输入 adb devices,如下图所示: adb devices

19 进入到 examples/onnx/yolov5 文件夹,输入命令 python test.py ,执行模型转换和推理模型的 test.py 脚本。


由上图结果可以看出,图上有四个人和一个巴士,所在坐标与原图相符,推理图片成功。推理图片如下所示:

原图如下图所示:

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

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

相关文章

python爬虫控制aiohttp并发数量方式例子解析

在使用Python的aiohttp库进行爬虫开发时,控制并发数量是一个重要的环节,以避免对目标网站造成过大压力或触发反爬机制。以下是一些控制并发数量的方法和示例: 使用Semaphore限制并发数:Semaphore(信号量)是…

用大模型学习大模型-40问掌握大模型入门知识点(上)

采用提问方式,从个人知识盲点开始,渐进式掌握大模型入门知识点。‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ 1、大模型中7b、70B代表什么 在讨论人工智能领域特别是大型语言模型(LLMs)时,“7b”和“70B”均…

【Kotlin设计模式】Kotlin实现装饰器模式

前言 装饰器模式(Decorator Pattern),用于动态地为对象添加新功能,而无需修改其结构,通过使用不用装饰类及这些装饰类的排列组合,可以实现不同的功能和效果,但是这样的效果就是会增加很多类&…

debian12 - rsyslog的安装/配置/使用

文章目录 debian12 - rsyslog的安装/配置/使用概述笔记实现main.cppmy_syslog.hmy_syslog.cppMakefileMakefile的准备工作END debian12 - rsyslog的安装/配置/使用 概述 以前在debian7.5中用syslog可以。 现在准备在debian12虚拟机中做个rsyslog的实验,看syslog还…

2024年PDF转换成PPT三步走,职场小白秒变高手

这个信息满天飞的时代,我们几乎天天都得处理一堆文件,PDF和PPT这对搭档简直就是我们工作学习中的老面孔。你有没有碰到过这种头疼事:急着要把PDF转成PPT来准备个演讲,但就是找不到个又快又好使的招?别慌,今…

一文搞懂大模型!基础知识、 LLM 应用、 RAG 、 Agent 与未来发展

LLM 探秘:想要深入了解人工智能界的“新宠”大型语言模型(LLM)吗?本文将带你走进 LLM 的世界,从入门知识到实际应用,全方位解读这个充满魔力的“大模型”。我们将一起揭开 LLM 的神秘面纱,领略其…

代码随想录算法训练营第三十九天 | 198.打家劫舍 , 213.打家劫舍II , 337.打家劫舍III

目录 198.打家劫舍 思路 1.确定dp数组(dp table)以及下标的含义 2.确定递推公式 3.dp数组如何初始化 4.确定遍历顺序 5.举例推导dp数组 方法一: 动态规划-一维 方法二:动态规划-二维 方法三:动态规划-两个变…

零知识证明-基础数学(二)

零知识证明(Zero—Knowledge Proof),是指一种密码学工具,允许互不信任的通信双方之间证明某个命题的有效性,同时不泄露任何额外信息 导数、偏导数 ,互质数,费马小定理,欧拉定理 1 导数 导数是微积分学中的重要概念&am…

从《黑神话:悟空》看中国3A游戏之路:历史回顾与未来展望

近年来,随着中国游戏行业的不断发展,一款名为《黑神话:悟空》的游戏引发了全球的广泛关注。这款游戏不仅在视觉效果和动作设计上令人惊艳,还被誉为中国3A游戏的里程碑。然而,从《黑神话:悟空》的发布&#…

STM32-PWM驱动呼吸灯——HAL库

(根据B站up主keysking的STM32教程视频的笔记) 【STM32】动画讲解轻松学会STM32的PWM_哔哩哔哩_bilibili 什么是PWM? PWM,全称为脉冲宽度调制(Pulse Width Modulation),是一种调制技术&#xf…

对各项数据的统计汇总,集中展示,便于查看厂区情况的智慧物流开源了。

智慧物流视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。构建基于Ai技术的…

【云原生】Kubernetes中常见的Pod故障排查定位与解决方案

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

3D环绕音效增强软件 Boom3D for Mac v2.0.2 中文破解版下载

Boom3D for Mac 专业的3D环绕音效增强软件中文版,Boom 3D是适用于Mac和Windows系统的专业音效增强软件,旨在通过播放器,媒体或流媒体服务等介质,在不同类型的耳机上以3D环绕效果播放媒体内容。您无需使用昂贵的耳机或其他附加环绕…

第十四章- 面对墙壁

这是最后的例子:一个完整的游戏。 我们添加键盘快捷键并引入鼠标事件到CannonField。我们在CannonField周围放一个框架并添加一个障碍物(墙)使这个游戏更富有挑战性。 lcdrange.h包含LCDRange类定义lcdrange.cpp包含LCDRange类实现cannon.h…

Linux 必备:“lsof” 命令 —— 解开系统资源的神秘密码

lsof 似侦探,揭示 Linux 中文件进程关系。图文指南助您探索。 lsof应急排查的作用 发现非法连接,检测未经授权的访问或攻击。定位服务故障,查看是否有进程占用关键端口。找出资源占用过高的进程,优化系统性能。追踪恶意软件的异…

博主正在AI+宠物创业中...

最近开始创业啦,csdn上没太大时间一一回复大家,说一声抱歉啦! AI宠物创业中,宠有灵犀CTO,北大硕士 双学位 前阿里巴巴达摩院,邮箱17387842007163.com 我们瞄准了宠物赛道,做的是 供应链电商社交…

One-for-All:上交大提出视觉推理的符号化与逻辑推理分离的新范式 | ECCV 2024

通过对多样化基准的严格评估,论文展示了现有特定方法在实现跨领域推理以及其偏向于数据偏差拟合方面的缺陷。从两阶段的视角重新审视视觉推理:(1)符号化和(2)基于符号或其表示的逻辑推理,发现推…

罐装食品检测检测系统源码分享 # [一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

罐装食品检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

一起学习LeetCode热题100道(57/100)

57.电话号码的字母组合(学习) 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例 1: 输入:digit…

ETL数据集成丨实现SQLServer数据库的高效实时数据同步

SQL Server,作为一款功能强大的关系型数据库管理系统(RDBMS),在企业级应用中占据着举足轻重的地位。它不仅提供了可靠的数据存储与管理能力,还集成了高级数据分析、报表服务、集成服务以及商业智能等功能,为…