yolov5训练并生成rknn模型部署在RK3588开发板上,实现NPU加速推理

news2024/9/28 13:28:08

简介

RK3588是瑞芯微(Rockchip)公司推出的一款高性能、低功耗的集成电路芯片。它采用了先进的28纳米工艺技术,并配备了八核心的ARM Cortex-A76和Cortex-A55处理器,以及ARM Mali-G76 GPU。该芯片支持多种接口和功能,适用于广泛的应用领域。

本篇为yolov5部署在RK3588的教程。

一、yolov5训练数据

请选择v5.0版本:Releases · ultralytics/yolov5 (github.com)

训练方法请按照官方的READEME文件进行。 

转换前将model/yolo.py的 Detect 类下的

    def forward(self, x):
        z = []  # inference output
        for i in range(self.nl):
            if os.getenv('RKNN_model_hack', '0') != '0':
                z.append(torch.sigmoid(self.m[i](x[i])))
                continue
            x[i] = self.m[i](x[i])  # conv
            bs, _, ny, nx = x[i].shape  # x(bs,255,20,20) to x(bs,3,20,20,85)
            x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous()

            if not self.training:  # inference
                if self.onnx_dynamic or self.grid[i].shape[2:4] != x[i].shape[2:4]:
                    self.grid[i], self.anchor_grid[i] = self._make_grid(nx, ny, i)

                y = x[i].sigmoid()
                if self.inplace:
                    y[..., 0:2] = (y[..., 0:2] * 2 + self.grid[i]) * self.stride[i]  # xy
                    y[..., 2:4] = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i]  # wh
                else:  # for YOLOv5 on AWS Inferentia https://github.com/ultralytics/yolov5/pull/2953
                    xy, wh, conf = y.split((2, 2, self.nc + 1), 4)  # y.tensor_split((2, 4, 5), 4)  # torch 1.8.0
                    xy = (xy * 2 + self.grid[i]) * self.stride[i]  # xy
                    wh = (wh * 2) ** 2 * self.anchor_grid[i]  # wh
                    y = torch.cat((xy, wh, conf), 4)
                z.append(y.view(bs, -1, self.no))
        if os.getenv('RKNN_model_hack', '0') != '0':
            return z
        return x if self.training else (torch.cat(z, 1),) if self.export else (torch.cat(z, 1), x)

修改为:

    def forward(self, x):
        z = []
        for i in range(self.nl):
            x[i] = self.m[i](x[i])

        return x

但在训练阶段请勿修改。

接着将训练好的best.pt放在工程文件夹下,使用yolov5工程中的export.py将其转换为onnx模型

python export.py --weights best.pt

二、下载RKNN-Toolkit2

1、下面的请在 Ubuntu下进行,创建一个Python环境

conda create -n rknn152 python=3.8

激活环境rknn152

conda activate rknn152

拉取rockchip-linux/rknn-toolkit2 at v1.5.2 (github.com)仓库。我是直接下载的1.5.2版本的zip包。

git clone git@github.com:rockchip-linux/rknn-toolkit2.git

2、安装依赖(requirements_cp38-1.5.2.txt,在rknn-toolkit2/doc目录下)

pip install -r /home/yuzhou/rknn15/rknn-toolkit2-1.5.2/doc/requirements_cp38-1.5.2.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

安装rknn-toolkit2,位置在packages文件夹下面,请选择合适的版本。

pip install /home/yuzhou/rknn15/rknn-toolkit2-1.5.2/packages/rknn_toolkit2-1.5.2+b642f30c-cp38-cp38-linux_x86_64.whl

3、开发环境与板子连接

sudo apt-get install adb

使用USB-typeC线连接到板子的TypeC0接口,PC端识别到虚拟机中。
在开发环境中检查是否连接成功

adb devices

如果连接成功会返回板子的设备ID,如下:

List of devices attached
* daemon not running; starting now at tcp:5037
* daemon started successfully
75370ea69f64098d    device

三、onnx转rknn模型

在rknn-toolkit2工程文件夹中浏览至./examples/onnx/yolov5,将我们在yolov5工程中转换得到的best.onnx复制到该文件夹下,需要修改该文件夹下的test.py中的内容。

  • ONNX_MODEL:模型名;
  • RKNN_MODEL:转换后的rknn模型名;
  • IMG_PATH:推理的图片路径;
  • DATASET:需要打开txt文件修改,改为IMG_PATH的图片名
  • CLASSES:修改为自己数据集的类别

添加target_platform='rk3588'。

进入此目录,运行:

python test.py

如上图如此,说明没有问题,并且在该目录下会生成一个推理图片,以及转换好的rknn模型。

四、下载NPU工程

git clone https://github.com/rockchip-linux/rknpu2

将rknn_server和rknn库发送到板子上

adb push /home/yuzhou/rknn15/rknpu2-1.5.0/runtime/RK3588/Linux/rknn_server/aarch64/usr/bin/rknn_server /usr/bin/
adb push /home/yuzhou/rknn15/rknpu2-1.5.0/runtime/RK3588/Linux/librknn_api/aarch64/librknnrt.so /usr/bin/
adb push /home/yuzhou/rknn15/rknpu2-1.5.0/runtime/RK3588/Linux/librknn_api/aarch64/librknn_api.so /usr/bin/

 在板子上运行rknn_server服务

adb shell 
root@ok3588:/# chmod +x /usr/bin/rknn_server
root@ok3588:/# rknn_server &
[1] 6932
root@ok3588:/# start rknn server, version:1.5.0 (17e11b1 build: 2023-05-18 21:43:39)
I NPUTransfer: Starting NPU Transfer Server, Transfer version 2.1.0 (b5861e7@2020-11-23T11:50:51)

在开发环境中检测rknn_server是否运行成功

(base) yuzhou@yuzhou-HP:~$ adb shell
root@ok3588:/# pgrep rknn_server
6932

有返回进程id说明运行成功。

git clone https://github.com/rockchip-linux/rknpu2.git

五、部署在rk3588上

修改include文件中的头文件postprocess.h

#define OBJ_CLASS_NUM     80  #这里的数字修改为数据集的类的个数

修改model目录下的coco_80_labels_list.txt文件,改为自己的类并保存

car

将转换后的rknn文件放在model/RK3588目录下

在model目录下放入需要推理的图片

cd /home/yuzhou/rknn15/rknpu2-1.5.0/examples/rknn_yolov5_demo

编译,运行shell 

bash ./build-linux_RK3588.sh

成功后生成install目录,将文件推到我们的板子上面

adb push /home/yuzhou/rknn15/rknpu2-1.5.0/examples/rknn_yolov5_demo /mydatas/

与rk3588进行交互 

adb shell 

进入我们传入文件的目录下 

cd /mydatas/rknn_yolov5_demo_Linux

使用npu加速推理

./rknn_yolov5_demo ./model/RK3588/best5s.rknn ./model/6.jpg

 将生成的图片拉取到本地来

adb pull /mydatas/rknn_yolov5_demo_Linux/6out.jpg /home/yuzhou/rknn-toolkit2/examples/onnx/yolov5_rk3588_demo/test

参考文章

瑞芯微RK3588开发板:虚拟机yolov5模型转化、开发板上python脚本调用npu并部署 全流程_yolov5模型在rk3588-CSDN博客

yolov5训练pt模型并转换为rknn模型,部署在RK3588开发板上——从训练到部署全过程_yolov5 rknn-CSDN博客

瑞芯微rk3588部署yolov5模型实战_在rk3588上部署yolov5-CSDN博客

yolov5训练并生成rknn模型以及3588平台部署_yolov5 在rk3588上的部署-CSDN博客

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

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

相关文章

python写爬虫爬取京东商品信息

工具库 爬虫有两种方案: 第一种方式是使用request模拟请求,并使用bs4解析respond得到数据。第二种是使用selenium和无头浏览器,selenium自动化操作无头浏览器,由无头浏览器实现请求,对得到的数据进行解析。 第一种方…

分布式技术知识体系

分布式架构知识与技术 1.分布式相关理论与组件原理 理解分布式基础理论(CAP/BASE) 掌握分布式必知必会的核心知识与技能 摸清分布式系统研发与设计的各个环节 2.分布式相关技术及实践 掌握分布式各应用场景与实践技术栈 熟练运用分布式中间件 完成软件…

java面向对象编程基础

对象: java程序中的对象: 本质上是一种特殊的数据结构 对象是由类new出来的,有了类就可以创建对象 对象在计算机的执行原理: student s1new student();每次new student(),就是在堆内存中开辟一块内存区域代表一个学生对象s1变…

第十届蓝桥杯大赛个人赛省赛(软件类)真题- CC++ 研究生组-最短路

6 肉眼观察&#xff0c; 看起来短的几条路对比下来是6~ #include <iostream> using namespace std; int main() {printf("6");return 0; }

学习或复习电路的game推荐:nandgame(NAND与非门游戏)、Turing_Complete(图灵完备)

https://www.nandgame.com/ 免费 https://store.steampowered.com/app/1444480/Turing_Complete/ 收费&#xff0c;70元。据说可以导出 Verilog &#xff01;

蓝桥杯需要掌握的几个案例(C/C++)

文章目录 蓝桥杯C/C组的重点主要包括以下几个方面&#xff1a;以下是一些在蓝桥杯C/C组比赛中可能会涉及到的重要案例类型&#xff1a;1. **排序算法案例**&#xff1a;2. **查找算法案例**&#xff1a;3. **数据结构案例**&#xff1a;4. **动态规划案例**&#xff1a;5. **图…

Python文件读写操作

文件操作注意点 注意点&#xff1a; 1. for line in file --> 会将偏移量移到末尾 2. buffering1 --> 缓冲区中遇到换行就刷新&#xff0c;即向磁盘中写入 3. 读操作结束后&#xff0c;文本偏移量就会移动到读操作结束位置 """编写一个程序,循环不停的写入…

SQLServer TRY_CONVERT函数

TRY_CONVERT&#xff1a;数据库中的安全转换利器 在数据库操作中&#xff0c;数据类型转换是一个常见的需求。然而&#xff0c;传统的转换方法在面对无法转换的数据时&#xff0c;往往会抛出错误&#xff0c;影响程序的稳定性和用户体验。为了解决这个问题&#xff0c;SQL Serv…

Mysql数据库:事务管理

目录 一、Mysql事务的概述 1、Mysql事务的概念 2、事务的ACID四大特性 3、事务之间的相互影响 4、事务的四种隔离级别 5、MySQL与Oracle自动提交事务的区别 6、事务隔离级别的作用范围 二、Mysql事务相关操作 1、查询和设置事务隔离级别 1.1 全局级事务隔离级别 1.1…

手撕算法-买卖股票的最佳时机 II(买卖多次)

描述 分析 使用动态规划。dp[i][0] 代表 第i天没有股票的最大利润dp[i][1] 代表 第i天持有股票的最大利润 状态转移方程为&#xff1a;dp[i][0] max(dp[i-1][0], dp[i-1][1] prices[i]); // 前一天没有股票&#xff0c;和前一天有股票今天卖掉的最大值dp[i][1] max(dp[i-1…

广州迅腾文化传播助力品牌传播的力量:以声塑形

在市场竞争日益激烈的今天&#xff0c;品牌传播成为企业塑造形象、提升竞争力的关键一环。通过精准的品牌传播策略&#xff0c;企业能够迅速吸引目标消费者的注意&#xff0c;实现新产品的快速推广和市场的占领。品牌传播不仅关乎企业的形象塑造&#xff0c;更关乎企业与消费者…

RIP,EIGRP,OSPF的区别

1.路由协议 能否选择出最优路径 2.路由协议 是否能够完成故障切换/多久能够完成故障切换 3.路由协议 是否会占用过大硬件资源 -- RIP -- 路由信息协议 跳数:一次三层设备的转发算一跳 中间隔的设备数量 不按照链路带宽来算 Rip认为路径一样,这个时候。 下面这个跳数不…

Linux:点命令source

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 source命令用于读取一个文件的内容并在当前Shell环境&#xff08;包括交互式Shell或是非交互式Shell&#xff09;执行里面的命令。它被称为点命令是因为命令名source也可…

(三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练

这里写目录标题 一、colmap解算数据放入高斯1. 将稀疏重建的文件放入高斯2. 将稠密重建的文件放入高斯 二、vkitti数据放入高斯 一、colmap解算数据放入高斯 运行Colmap.bat文件之后&#xff0c;进行稀疏重建和稠密重建之后可以得到如下文件结构。 1. 将稀疏重建的文件放入高…

稀碎从零算法笔记Day23-LeetCode:二叉树的最大深度

题型&#xff1a;链表、二叉树的遍历 链接&#xff1a;104. 二叉树的最大深度 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上…

JAVA面向对象编程 JAVA语言入门基础

类与对象的概念 类 (Class) 和对象 (Object) 是面向对象程序设计方法中最核心的概念。 类是对某一类事物的描述(共性)&#xff0c;是抽象的、概念上的定义&#xff1b;而对象则是实际存在的属该类事物的具体的个体&#xff08;个性&#xff09;&#xff0c;因而也称为实例(In…

《边缘计算:连接未来的智慧之桥》

随着物联网、5G等技术的快速发展&#xff0c;边缘计算作为一种新兴的计算模式&#xff0c;正逐渐引起人们的广泛关注。边缘计算通过将数据处理和存储功能放置在距离数据产生源头更近的位置&#xff0c;实现了更快速、更可靠的数据处理和交换&#xff0c;为各行各业带来了前所未…

JS13-事件的绑定和事件对象Event

绑定事件的两种方式/DOM事件的级别 DOM0的写法&#xff1a;onclick element.onclick function () {}举例&#xff1a; <body> <button>点我</button> <script>var btn document.getElementsByTagName("button")[0];//这种事件绑定的方式…

SAP BAS开发Fiori项目中的各种文件详解(manifest.json, package.json, ui5.yaml, i18n等)

1. 背景 在SAP BAS中新建好一个Fiori项目后&#xff0c;系统会自动生成一系列的文件&#xff0c;例如package.json, ui5.yaml, manifest.json, i18n等。对于不熟悉web应用程序开发的同学&#xff0c;这些文件理解起来会很困惑。 在这篇文章中&#xff0c;我会详细介绍这些文件…

图论基础|841.钥匙和房间、463. 岛屿的周长

目录 841.钥匙和房间 思路&#xff1a;本题是一个有向图搜索全路径的问题。 只能用深搜&#xff08;DFS&#xff09;或者广搜&#xff08;BFS&#xff09;来搜。 463. 岛屿的周长 841.钥匙和房间 力扣题目链接 (opens new window) 有 N 个房间&#xff0c;开始时你位于 0…