1.rk3588的yolov5运行:pt_onnx_rknn转换及rknn在rk3588系统python运行

news2025/1/17 13:53:58

        自己有点笨,查资料查了一周才完美的实现了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 output
        for i in range(self.nl):
            x[i] = self.m[i](x[i])  # conv

        return 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 subprocess

p = 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的模型部署了。

   完成以上环境部署后,后面多个模型时,可以根据实际情况进行嵌套检测,就简单了。

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

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

相关文章

vue引入前端工程内的图片

一、public目录下的图片 public目录下的图片引入方式&#xff1a; <!--/images/图片名称&#xff0c;这种属于绝对路径&#xff0c;/指向public目录 --> <img src"/images/image.png"> 二、src目录下的图片 先在vue.config.js进行配置&#xff0c;并指…

Flutter笔记:Matrix4矩阵变换与案例

Flutter笔记 Matrix4矩阵变换及其案例 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/134474764 【简介…

Lec14 File systems 笔记

文件系统中核心的数据结构就是inode和file descriptor 分层的文件系统&#xff1a; 在最底层是磁盘&#xff0c;也就是一些实际保存数据的存储设备&#xff0c;正是这些设备提供了持久化存储。在这之上是buffer cache或者说block cache&#xff0c;这些cache可以避免频繁的读…

使用共享内存进行通信的代码和运行情况分析,共享内存的特点(拷贝次数,访问控制),加入命名管道进行通信的代码和运行情况分析

目录 示例代码 头文件(comm.hpp) log.hpp 基础版 -- 服务端 代码 运行情况 加入客户端 代码 运行情况 两端进行通信 客户端 代码 注意点 服务端 代码 两端运行情况 共享内存特点 拷贝次数少 管道的拷贝次数 共享内存的拷贝次数 没有访问控制 管道 共享…

三十、W5100S/W5500+RP2040树莓派Pico<PPPoE>

文章目录 1 前言2 简介2 .1 什么是PPPoE&#xff1f;2.2 PPPoE的优点2.3 PPPoE数据交互原理2.4 PPPOE应用场景 3 WIZnet以太网芯片4 PPPOE示例概述以及使用4.1 流程图4.2 准备工作核心4.3 连接方式4.4 主要代码概述4.5 结果演示 5 注意事项6 相关链接 1 前言 PPPoE是一种在以太…

【机器学习 | 假设检验】那些经常被忽视但重要无比的假设检验!! 确定不来看看?(附详细案例)

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

代码随想录算法训练营Day 54 || 392.判断子序列、115.不同的子序列

392.判断子序列 力扣题目链接(opens new window) 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;&quo…

STM32-基本定时器

一、基本定时器的作用 定时触发输出直接驱动DAC。 二、基本定时器的框图 以STM32F103系列为例&#xff0c;具体开发板请查看开发手册。 类别定时器总线位数计数方向预分频系数是否可以产生DMA捕获/比较通道互补输出基本定时器TIM6 / TIM7APB116位向上1~65536可以0无通用定时…

一起学docker系列之四docker的常用命令--系统操作docker命令及镜像命令

目录 前言1 操作 Docker 的命令1.1 启动 Docker1.2 停止 Docker1.3 重启 Docker1.4 查看 Docker 状态1.5 查看 Docker 所有命令的信息1.6 查看某个命令的帮助信息 2 操作镜像的命令2.1 查看所有镜像2.2 搜索某个镜像2.3 下载某个镜像2.4 查看镜像所占空间2.5 删除镜像2.6 强制删…

基于猕猴感觉运动皮层Spike信号的运动解码分析不同运动参数对解码的影响

公开数据集中文版详细描述参考前文&#xff1a;https://editor.csdn.net/md/?not_checkout1&spm1011.2124.3001.6192神经元Spike信号分析参考前文&#xff1a;https://blog.csdn.net/qq_43811536/article/details/134359566?spm1001.2014.3001.5501神经元运动调制分析参考…

2D槽道流

之前看槽道流时&#xff0c;一直无法在二维槽道流里计算出湍流状态&#xff0c;后来了解到二维槽道流需要额外添加随机扰动&#xff0c;但是这个体积力的植入方式一直不知道。而且看稳定性分析中的OS方程的推导&#xff0c;也是基于2d的NS方程&#xff0c;至今还是很疑惑这个问…

Struts2 数据校验之四兄弟

现在是科技的时代&#xff0c;大多数人都在网上购物了&#xff0c; 我们都碰到过相同的问题&#xff0c;各大网站弄的那些各种各样的注册页面&#xff0c;相信大家都深有体会。 有了这验证就很好的保证了我们的信息的准确性和安全性。 接下来我给大家讲解一下用struts2怎么实…

H5ke11--3介绍本地,会话存储

代码顺序: 1.设置input,捕获input如果有多个用属性选择符例如 input[typefile]点击事件.向我们的本地存储设置键值对 2.在点击事件外面设置本地存储表示初始化的值.点击上面的事件才能修改我们想修改的值 会话(session)浏览a数据可以写到本地硬盘,关闭页面数据就没了 本地(…

2023年【P气瓶充装】报名考试及P气瓶充装复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年P气瓶充装报名考试为正在备考P气瓶充装操作证的学员准备的理论考试专题&#xff0c;每个月更新的P气瓶充装复审考试祝您顺利通过P气瓶充装考试。 1、【多选题】充装过程中出现充气头漏气的主要原因为&#xff1…

Java Web——JavaScript运算符与流程语句

1. 运算符 1.1. 算数运算符 数字是用来计算的&#xff0c;比如&#xff1a;乘法 * 、除法 / 、加法 、减法 - 等等&#xff0c;所以经常和算术运算符一起。 算术运算符&#xff1a;也叫数学运算符&#xff0c;主要包括加、减、乘、除、取余&#xff08;求模&#xff09;等 …

git拉取普通idea Java项目module没有build的问题

在不断完成一个项目的时候&#xff0c;会有不断新加的module&#xff0c;我们用git拉取时会发生没有识别新module的情况。 解决方法是右键项目名称&#xff0c;然后点击Open Module Settings 接下来&#xff0c;点击Module&#xff0c;加号&#xff0c;新建Module的名字就是在g…

高效文件管理:一键批量修改文件名,并统一转换为大写扩展名

在日常生活和工作中&#xff0c;文件处理成为了一项必不可少的任务。无论是个人还是企业&#xff0c;都需要管理大量的文件&#xff0c;包括图片、文档、音频和视频等。这些文件的名字可能千奇百怪&#xff0c;格式各不相同&#xff0c;而且往往需要按照一定的规则进行修改或整…

MFC 对话框

目录 一、对话款基本认识 二、对话框项目创建 三、控件操作 四、对话框创建和显示 模态对话框 非模态对话框 五、动态创建按钮 六、访问控件 控件添加控制变量 访问对话框 操作对话框 SendMessage() 七、对话框伸缩功能实现 八、对话框小项目-逃跑按钮 九、小项…

十一、统一网关GateWay(搭建网关、过滤器、跨越解决)

目录 一、网关技术的实现 在SpringCloud中网关的实现包括两种: 作用&#xff1a; 二、搭建网关服务 1、新建模块&#xff0c;并添加依赖 2、新建Gateway包&#xff0c;并编写启动类 3、编写yml文件 4、启动服务&#xff0c;并在网页内测试 5、步骤 三、路由断言工厂 …

Vue3 shallowRef 和 shallowReactive

一、shallowRef 使用shallowRef之前需要进行引入&#xff1a; import { shallowRef } from vue; 使用方法和ref 的使用方法一致&#xff0c;以下是二者的区别&#xff1a; 1. 如果ref 和 shallowRef 都传入的是普通数据类型的数据&#xff0c;那么他们的效果是一样的&#x…