1.rk3588的yolov5运行:pt_onnx_rknn转换及rknn在rk3588系统python运行
自己有点笨,查资料查了一周才完美的实现了yolov5在rk3588环境下的运行,在这里写具体步骤希望大家少走弯路。具体步骤如下:
一、yolov5的原代码下载及pt文件转换为onnx文件
1.yolov5的原代码下载及环境搭建
在这里一定要下载正确版本的源代码,否则pt到onnx文件的转换很容易出错。进入网盘链接下载即可:https://pan.baidu.com/s/1D-9UzyfNgrACdqliLwkrEg ,提取码:qnbv
下载后在\yolov5-master\文件夹下打开requirements.txt文件,里面有很多需要安装的包,根据这个文件安装好所有yolov5需要的包即可。
2.pt文件转换为onnx文件
yolov5训练好的权重文件为pt文件,由于训练麻烦,在这里我们用自带的yolov5s.pt文件转换。我已经将这个文件放在\yolov5-master\文件夹下面,大家可以找到。
在转换之前,我们需要对yolov5的几个py文件做个修改。修改如下:
(1) 修改models/yolo.py Detect类下的forward函数。首先将该forward函数注释了(一定记着,模型训练时必须用这个函数,不要删了),再修改为下面的函数即可:
def forward(self, x):z = [] # inference outputfor i in range(self.nl):x[i] = self.m[i](x[i]) # convreturn x
修改前的函数如下(代码已经被我注释):
# def forward(self, x):# z = [] # inference output# for i in range(self.nl):# 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.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)## if isinstance(self, Segment): # (boxes + masks)# xy, wh, conf, mask = x[i].split((2, 2, self.nc + 1, self.no - self.nc - 5), 4)# xy = (xy.sigmoid() * 2 + self.grid[i]) * self.stride[i] # xy# wh = (wh.sigmoid() * 2) ** 2 * self.anchor_grid[i] # wh# y = torch.cat((xy, wh, conf.sigmoid(), mask), 4)# else: # Detect (boxes only)# xy, wh, conf = x[i].sigmoid().split((2, 2, self.nc + 1), 4)# 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, self.na * nx * ny, self.no))## return x if self.training else (torch.cat(z, 1), ) if self.export else (torch.cat(z, 1), x)
(2)修改yolov5-master/export.py文件
把第838行的'--opset'的defaut修改为12(一定要修改为12),修改后的代码如下:
parser.add_argument('--opset', type=int, default=12, help='ONNX: opset version')
如果运行export.py报错,则修改export.py文件的760行的代码,修改前后的代码如下:
修改前:
shape = tuple((y[0] if isinstance(y, tuple) else y).shape) # model output shape
修改后:
shape = tuple(y[0].shape)
其他修改的地方,在以上百度网盘的yolov5的代码中已经修改完,其中,以上几步也已经修改完。大家直接运行即可。
运行方式:直接运行pycharm文件,或者终端运行:python export.py
注意:
如果下载了其他的yolov5,除了修改上述的内容,还需要修改export.py的其他内容如下:
1.修改export_saved_model函数和run函数里面的一些参数,基本上模型参数,比如置信度等;
2.修改parse_opt函数里面的一些参数,常见修改如下:
(1)'--weights':后面需要修改为我们生成的pt文件的路径(可以是相对路径或者绝对路径),如我将要转换的模型yolov5s.pt,用相对路径修改后如下:
parser.add_argument('--weights', nargs='+', type=str, default='yolov5s.pt', help='model.pt path(s)')
(2)'--include':后面修改为“onnx",y因为我们要转换为onnx型。转换后如下:
parser.add_argument('--include',nargs='+',default=['onnx'],#'torchscript'help='torchscript, onnx, openvino, engine, coreml, saved_model, pb, tflite, edgetpu, tfjs, paddle')
(3)也可以修改'--iou-thres'和'--conf-thres'参数,该参数是yolov5的置信度,会影响模型最终检测的精度,但不会影响pt文件转换为onnx文件的成功与否。其他的大家可以根据需要进行修改,前面的修改后,Pt文件就可以成功转换为onnx文件了。
二、onnx文件转换为rknn文件
第一步将pt文件转换为了onnx文件,这里开始将onnx文件转换为rknn文件,这步转换我们需要搭建ubuntu20.04的虚拟环境,然后在ubuntu20.04的虚拟环境下转换(我开始用的ubuntu18.04的虚拟环境,但转换失败,所以大家还是乖乖的用ubuntu20.04吧)
1.搭建ubuntu20.04环境(这里不作具体介绍)
大家去官网下载ubuntu-20.04.6-desktop-amd64.iso文件即可,下载后,需要下载VMware-workstation-full-17.0.0-20800274.exe,大家可以去百度网盘下载,链接如下:https://pan.baidu.com/s/1UHU9ZiCNpqUbazdg0NW7sQ 提取码:rpff
之后具体的安装可以参照如下网址:【Ubuntu 20.04 虚拟机安装教程详解】_ubuntu20 虚拟机_千北@的博客-CSDN博客
2.安装Anaconda3
第1步安装好ubuntu20.04环境后,我们首先要安装Anaconda3,具体安装步骤如下:
(1)下载Anaconda3-2021.11-Linux-x86_64.sh文件,可以进入百度网盘下载,下载路径如下:
链接:https://pan.baidu.com/s/1egRszYlWcpwhmt3-VEH3lA 提取码:bg0c
(2)加入下载后将该文件放在了public文件夹下面,然后我们进入该文件夹打开终端,如下图所示:
然后在终端输入su进入根目录,在根目录下运行bash Anaconda3-2021.11-Linux-x86_64.sh即可,运行完后关闭终端,然后再次打开终端,终端运行conda-env list看是否安装好了Anaconda3。
3.rknn-toolkit2文件的搭建
第2步搭建好了Anaconda3,我们接下来就可以搭建rknn-toolkit2文件了,具体步骤如下:
(1)下载rknn-toolkit2文件,可以通过百度网盘下载,下载路径如下:
链接:https://pan.baidu.com/s/1QzyAG23WMMjmOLDW3J8ZGA 提取码:vs3c,下载后将该文件放在你要放的文件夹下面,我放在了home/下面。
新建一个rknn环境如下(这里一定是python3.8,其他版本容易转换出错):
conda create -n rknn python=3.8
然后激活该环境
conda activate rknn
进入home/rknn-toolkit2-master/doc/路径,该路径有一个requirements_cp38-1.5.2.txt文件,然后终端运行代码:
pip install -r requirements_cp38-1.5.2.txt -i https://mirror.baidu.com/pypi/simple
返回上一级目录,然后进入packages目录,安装rknn_toolkit2
pip install rknn_toolkit2-1.5.2+b642f30c-cp38-cp38-linux_x86_64.whl
完成后,输入命令 python
from rknn.api import RKNN
运行以上命令,若不报错,则说明已经成功安装了rknn-toolkit2,然后退出python,如下图:
把yolov5生成的onnx文件放到examples/onnx/yolov5文件夹下,然后终端进入该文件夹,再打开该文件夹的test.py文件,对里面的内容进行修改,具体修改如下:
上图的第11行是我们要转换的onnx文件的路径(相对路径或者绝对路径都可以)。
第12行是转换后的rknn文件的路径及文件名称。
第13行是我们要检测的图片的路径,第14行是数据的路径,第22行是我们的要检测的目标名称。这里用了官方的pt文件,所以写了80个类,后面可以根据我们要检测的实际的类进行修改。
然后再对第241行的target_platform修改为rk3588(因为我是要将该模型放在rk3588系统里),如果写成其他,转换后的rknn放到rk3588系统会报错。
最后运行test.py文件即可,成功后在该文件夹下会生成对应的rknn文件。注意:一般转移这个文件需要解除权限。我们在终端运行以下代码解除文件权限即可。
chmod -R 777 文件名
至此,我们的onnx转换为rknn文件完毕!
接下来是将rknn文件部署在rk3588系统里。
三、rk3588部署rknn文件
在第二步生成rknn文件后,接下来是如何部署在rk3588系统里,具体步骤如下:
首先在rk3588系统的ubuntu20.04环境下运行
git clone https://github.com/rockchip-linux/rknpu2.git
然后进入yolov5目录运行
cd /home/ptay/rknpu2-master/examples/rknn_yolov5_demo
再修改include文件中的头文件postprocess.h
#define OBJ_CLASS_NUM 2 #这里的数字修改为数据集的类的个数
修改model目录下的coco_80_labels_list.txt文件,改为自己的类并保存(比如我要检测的类为person,moto)
person
moto
将我们在ubuntu20.04虚拟环境下转换后的rknn文件放在rknpu2/examples/rknn_yolov5_demo/model/RK3588/目录下,然后终端切换到rknpu2/examples/rknn_yolov5_demo/运行以下代码:
bash ./build-linux_RK3588.sh
然后会在该文件下生成install目录(更新该文件夹即可看到include文件夹).
cd install/rknn_yolov5_demo_linux
在model目录下放入需要推理的图片
运行
./rknn_yolov5_demo ./model/RK3588/best.rknn ./model/bus.jpg
运行后即可获得需要的结果。
当然,最后一步可以通过python运行,如果用python 运行,我们需要写一个demo.py文件如下:
import cv2
import subprocessp = subprocess.Popen(['./rknn_yolov5_demo', './model/RK3588/best.rknn', './model/bus.jpg'])
p.wait()
picDetected = cv2.imread('out.jpg')
# cv2.imshow("ss",picDetected)
# cv2.waitKey(0)
然后在该文件夹运行
python demo.py
在同级文件夹下会生成一个out.jpg图片,该图片就是用rknn模型检测的图片结果。到这里,我们就完成了从pt文件到rk3588的模型部署了。
完成以上环境部署后,后面多个模型时,可以根据实际情况进行嵌套检测,就简单了。
相关文章:

1.rk3588的yolov5运行:pt_onnx_rknn转换及rknn在rk3588系统python运行
自己有点笨,查资料查了一周才完美的实现了yolov5在rk3588环境下的运行,在这里写具体步骤希望大家少走弯路。具体步骤如下: 一、yolov5的原代码下载及pt文件转换为onnx文件 1.yolov5的原代码下载及环境搭建 在这里一定要下载正确版本的源代码…...

适用于全部安卓手机的 5 大免费 Android 数据恢复
您是否面临这样一种情况,即在Android设备上丢失了一些重要文件,但不知道应该选择哪种Android数据恢复来取回它们? 如果您以前从未备份过Android数据,则很难解决问题。 本文将介绍排名前5位的免费Android数据恢复软件。 您可以获…...

【案例分享】BenchmarkSQL 5.0 压测 openGauss 5.0.0
一、前言 本次BenchmarkSQL 压测openGauss仅作为学习使用压测工具测试tpcc为目的,并不代表数据库性能如本次压测所得数据。实际生产性能压测,还需结合服务器软硬件配置、数据库性能参数调优、BenchmarkSQL 配置文件参数相结合,是一个复杂的过…...

Linux之 4 种休眠模式
目录 1. Linux之 4 种休眠模式 1. Linux之 4 种休眠模式 # echo standby >/sys/power/state //CPU和RAM在运行 # echo mem > /sys/power/state //挂起到内存(待机),关闭硬 盘、外设等设备 # echo disk > /sys/power/state //挂起到硬盘(休眠),关闭硬盘、外设等设备&…...

homeassiant主题
下载主题 https://github.com/maartenpaauw/home-assistant-community-themes.git 使用file editor到homeassiant路径下,新建文件夹themes文件夹,用terminal新建也可以。 使用file editor上传文件 使用Terminal解压 mkdir themes unzip home-assistan…...

《2020年最新面经》—字节跳动Java社招面试题
文章目录 前言:一面:01、Java基础知识答疑,简单概述一下?02、倒排索引了解吗?使用Java语言怎么实现倒排?03、详细讲解一下redis里面的哈希表,常用的Redis哈希表命名有哪些,举例说明其…...

2.3IP详解及配置
2.3IP详解及配置 一、ip地址组成 IP地址由4部分数字组成,每部分数字对应于8位二进制数字,各部分之间用小数点分开 这是点分 2进制 如果换算为10进制我们称为点分10进制. 每个ip地址由两部分组成网络地址(NetID)和主z机地址(HostID).网络地址表示其属于…...

Python程序打包指南:手把手教你一步步完成
最近感兴趣想将开发的项目转成Package,研究了一下相关文章,并且自己跑通了,走了一下弯路,这里记录一下如何打包一个简单的Python项目,展示如何添加必要的文件和结构来创建包,如何构建包,以及如何…...

Linux yum 使用时提示 获取 GPG 密钥失败Couldn‘t open file RPM-GPG-KEY-EPEL-7
资料 错误提示: no crontab for root - using an empty one 888 原因剖析: 第一次使用crontab -e 命令时会让我们选择编辑器,很多人会不小心选择默认的nano(不好用),或则提示no crontab for root - usin…...

OpenGL_Learn13(材质)
1. 材质 cube.vs #version 330 core layout (location 0) in vec3 aPos; layout (location 0 ) in vec3 aNormal;out vec3 FragPos; out vec3 Normal;uniform mat4 model; uniform mat4 view; uniform mat4 projection;void main() {FragPosvec3(model*vec4(aPos,1.0));Norma…...

buildadmin+tp8表格操作(1)----表头上方添加按钮和自定义按钮
buildAdmin 的表头上添加一些按钮,并实现功能 添加按钮 <template><!-- buttons 属性定义了 TableHeader 本身支持的顶部按钮,仅需传递按钮名即可 --><!-- 这里的框架自带的 顶部按钮 分别有 刷新 , 添加, 编辑&…...

MySQL 定时计划任务 事件的使用
目录 查看事件是否开启 开启事件 1)通过设置全局参数修改 2)更改配置文件 MySQL如何创建并执行事件? 例 1 MySQL查看事件状态信息 MySQL修改和删除事件 例 1 例 2 删除事件 例 3 在数据库管理中,经常要周期性的执行某…...

C++构造函数 拷贝构造函数 括号法显示法隐式转换法实现类
一.无参构造 & 有参构造 & 拷贝构造函数 拷贝的是自己所属的类,也就是克隆自己。 所以传参要穿自己的类名。 克隆归克隆,但是不能把本身给改了,所以参数前要加const。class Person { public:int age;public:Person(){cout<<&q…...

FreeRTOS中的内存分配策略
FreeRTOS为内存管理提供了几种不同的策略,分别由heap_1.c至heap_5.c实现。以下是每种策略: heap_1.c: 最简单的策略。只允许一次性的内存分配。不允许内存释放。对于只分配内存但不释放的系统特别有用,如仅在启动时分配任务和队列的系统。内存…...

HP惠普光影精灵7笔记本Victus by HP 16.1英寸游戏本16-d0000原装出厂Windows11.21H2预装OEM系统
下载链接:https://pan.baidu.com/s/1LGNeQR1AF1XBJb5kfZca5w?pwdhwk6 提取码:hwk6 可适用的型号: 16-d0111tx,16-d0112tx,16-d0125tx,16-d0127tx,16-d0128tx,16-d0129tx&#…...

组合模式 rust和java的实现
文章目录 组合模式介绍实现javarsut 组合模式 组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计…...

大数据基础设施搭建 - MySQL
文章目录 一、检查是否安装过MySQL二、上传安装包三、安装MySQL3.1 安装mysql依赖3.2 安装mysql-client3.3 安装mysql-server 四、启动MySQL五、配置MySQL5.1 修改密码(1)查看密码(2)登陆(3)设置复杂密码&a…...

二叉树递归遍历
能帮到你的话,就给个赞吧 😘 二叉树遍历算法 指遍历一遍二叉树就能得到答案 什么是二叉树遍历 二叉树遍历 前中后序遍历 递归遍历 3种时间节点 递归遍历会依次遍历到每个节点。 而前中后序则是在递归遍历的基础上选择操作发生的时间。 递归遍历 …...

【ArcGIS Pro二次开发】:CC工具箱1.1.1更新_免费_安装即可用
CC工具箱1.1.1更新【2023.11.15】 使用环境要求:ArcGIS Pro 3.0 一、下载链接 工具安装文件及使用文档: https://pan.baidu.com/s/1OJmO6IPtMfX_vob3bMtvEg?pwduh5rhttps://pan.baidu.com/s/1OJmO6IPtMfX_vob3bMtvEg?pwduh5r 二、使用方法 1、在下…...

Dubbo的优雅下线原理分析
文/朱季谦 Dubbo如何实现优雅下线? 这个问题困扰了我一阵,既然有优雅下线这种说法,那么,是否有非优雅下线的说法呢? 这,还真有。 可以从linux进程关闭说起,其实,我们经常使用到杀…...

leetcode做题笔记2342. 数位和相等数对的最大和
给你一个下标从 0 开始的数组 nums ,数组中的元素都是 正 整数。请你选出两个下标 i 和 j(i ! j),且 nums[i] 的数位和 与 nums[j] 的数位和相等。 请你找出所有满足条件的下标 i 和 j ,找出并返回 nums[i] nums[j]…...

c# YOLOV5目标检测部署
using Emgu.CV; using Emgu.CV.CvEnum; using Emgu.CV.Dnn; using Emgu.CV.Structure; using Emgu.CV.Util...

学习笔记6——垃圾回收
学习笔记系列开头惯例发布一些寻亲消息 链接:https://baobeihuijia.com/bbhj/contents/3/190801.html java垃圾回收(stop the world) 专注于堆和方法区的垃圾回收,年轻代,老年代,永久代判断对象是否还存…...

3.1 Windows驱动开发:内核远程堆分配与销毁
在开始学习内核内存读写篇之前,我们先来实现一个简单的内存分配销毁堆的功能,在内核空间内用户依然可以动态的申请与销毁一段可控的堆空间,一般而言内核中提供了ZwAllocateVirtualMemory这个函数用于专门分配虚拟空间,而与之相对应…...

C++: 模板初阶
文章目录 一. 泛型编程二. 函数模板函数模板的原理函数模板的实例化隐式实例化: 让编译器根据实参推演模板参数的实际类型显示实例化: 在函数名后的<>中制定模板参数的世纪类型 模板参数的匹配原则 三. 类模板类模板的定义格式类模板的实例化 一. 泛型编程 如何实现一个…...

人工智能基础_机器学习036_多项式回归升维实战3_使用线性回归模型_对天猫双十一销量数据进行预测_拟合---人工智能工作笔记0076
首先我们拿到双十一从2009年到2018年的数据 可以看到上面是代码,我们自己去写一下 首先导包,和准备数据 from sklearn.linear_model import SGDRegressor import numpy as np import matplotlib.pyplot as plt X=np.arange(2009.2020)#左闭右开,2009到2019 获取从2009到202…...

【算法挨揍日记】day29——139. 单词拆分、467. 环绕字符串中唯一的子字符串
139. 单词拆分 139. 单词拆分 题目描述: 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。 解题思路&am…...

YOLOv8-Seg改进:轻量级Backbone改进 | VanillaNet极简神经网络模型 | 华为诺亚2023
🚀🚀🚀本文改进:一种极简的神经网络模型 VanillaNet,支持vanillanet_5, vanillanet_6, vanillanet_7, vanillanet_8, vanillanet_9, vanillanet_10, vanillanet_11等版本,相比较yolov8-seg各个版本如下: layersparametersgradientsGFLOPsvanillanet_521230017523...

解决Requests中使用httpbin服务器问题:自定义URL的实现与验证
问题背景 在使用Python的Requests模块进行单元测试时,可能会遇到无法使用本地运行的httpbin服务器进行测试的问题。这是因为测试脚本允许通过环境变量HTTPBIN_URL指定用于测试的本地httpbin实例,但在某些测试用例中,URL是硬编码为httpbin.or…...

软考-高级-系统架构设计师教程(清华第2版)【第17章 通信系统架构设计理论与实践(P614~646)-思维导图】
软考-高级-系统架构设计师教程(清华第2版)【第17章 通信系统架构设计理论与实践(P614~646)-思维导图】 课本里章节里所有蓝色字体的思维导图...