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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

国家药品价格查询官网-在线网站查询方法

查询药品上市价格对于个人和机构来说都是非常有必要的,对个人可以很好的验证该药品是否存在虚高的情况,对药企来说可以根据同类药品市场价格指导自产药品的定价,对其它机构来说了解药品价格可以帮助选择价格合理的药品供应商,降低…

upload-labs关卡10(点和空格绕过)通关思路

文章目录 前言一、回顾前几关知识点二、靶场第十关通关思路1、看源代码2、bp抓包绕过3、检查文件是否成功上传 总结 前言 此文章只用于学习和反思巩固文件上传漏洞知识,禁止用于做非法攻击。注意靶场是可以练习的平台,不能随意去尚未授权的网站做渗透测…

轻松搭建短域名短链接服务系统,可选权限认证,并自动生成证书认证把nginx的http访问转换为https加密访问,完整步骤和代码

轻松搭建短域名短链接服务系统,可选权限认证,并自动生成证书认证把nginx的http访问转换为https加密访问,完整步骤和代码。 在互联网信息爆炸的时代,网址复杂而冗长,很难在口头告知他人,也难以分享到社交媒体…

快速搭建本地的chatgpt

快速搭建本地的chatgpt 参考:一篇文章教你使用Docker本地化部署Chatgpt(非api,速度非常快!!!)及裸连GPT的方式(告别镜像GPT)-CSDN博客 前提是linux下 已安装docker 命…

基于SpringBoot的SSMP整合案例(消息一致性处理与表现层开发)

消息一致性处理 在后端执行完相应的操作后,我们需要将执行操作后的结果与数据返回前端,前端 调用我们传回去的数据,前端是如何知道我们传回去的数据名称的? 答:前后端遵循了同一个"协议"。这个协议就是定义…

深度学习_14_单层|多层感知机及代码实现

单层感知机: 功能: 能完成二分类问题 问题: 模型训练采用X*W b训练出模型,对数据只进行了一层处理,也就是说训练出来的模型仅是个线性模型,它无法解决XOR问题,所以模型在训练效果上&#xf…

竞赛 题目:基于机器视觉opencv的手势检测 手势识别 算法 - 深度学习 卷积神经网络 opencv python

文章目录 1 简介2 传统机器视觉的手势检测2.1 轮廓检测法2.2 算法结果2.3 整体代码实现2.3.1 算法流程 3 深度学习方法做手势识别3.1 经典的卷积神经网络3.2 YOLO系列3.3 SSD3.4 实现步骤3.4.1 数据集3.4.2 图像预处理3.4.3 构建卷积神经网络结构3.4.4 实验训练过程及结果 3.5 …

torch - 张量Tensor常见的形式

1.Scalar 通常就是一个数值 x tensor(42.) 输出x: 2.Vector 特征向量 例如:[-5., 2., 0.]在深度学习中通常表示特征,如词向量特征,某一维度特征等 3.Matrix 一般计算的都是矩阵,通常都是多维的。 可以做矩阵的…

MySQL优化的底层逻辑

文章目录 前言索引的底层结构数据与索引的关系聚簇索引的数据存储普通索引的数据存储 索引的命中逻辑怎么理解索引失效总结 前言 去年刚开始写博客的时候写了一篇《MySQL性能调优参考》,文章中提到优化的几个技巧,比如数据类型的使用、范式和反范式的合…

CI/CD --git版本控制系统

目录 一、git简介 二、git使用 三、github远程代码仓库 一、git简介 Git特点: 速度简单的设计对非线性开发模式的强力支持(允许成千上万个并行开发的分支)完全分布式有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数…

【C++学习手札】模拟实现vector

🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:くちなしの言葉—みゆな 0:37━━━━━━️💟──────── 5:28 🔄 ◀️ ⏸ ▶️ ☰…

微信小程序Error: ENOENT: no such file

问题描述 当编译的时候 会提示找不到这个文件(index),但是确信项目目录里已经删除了该页面路径,并且app.json的pages列表中也 导致这个问题应该是:新添加了文件,后面删除了或者修改了文件名,导…

MySQL初始化报错。VCRUNTIME140_1.dll缺失

从自己电脑内搜索此dll,粘贴到服务器的以下位置即可。

电路综合-基于简化实频的集总参数电路匹配3-将任意阻抗用集总参数匹配至归一化阻抗

电路综合-基于简化实频的集总参数电路匹配3-将任意阻抗用集总参数匹配至归一化阻抗 前面的相关理论: 电路综合-基于简化实频的集总参数电路匹配1 电路综合-基于简化实频的集总参数电路匹配2-得出解析解并综合 理论这两个已经介绍过了,直接给出案例 代码…

「Verilog学习笔记」实现3-8译码器①

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 分析 ① 本题要求根据38译码器的功能表实现该电路,同时要求采用基础逻辑门实现,那么就需要将功能表转换为逻辑表达式。 timescale 1ns/1nsmodule d…

Python---练习:编写一段Python代码,生成一个随机的4位验证码

案例:编写一段Python代码,生成一个随机的4位验证码 提前:定义一个字符串 str1 "23456789abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ" 编写Python代码: ① 思考:如果只生成4个字符的验证码&…

黑五来袭,如何利用海外代理进行助力

黑五作为下半年年度尤为重要的一个节日,是各大商家的必争之地,那么海外代理是如何帮助跨境商家做好店铺管理和营销呢? 为什么跨境人都关注海外代理,下面我们来进行介绍。 一、什么是海外代理 海外代理就是我们所说的&#xff1…

锂离子电池充电的系统抖动问题解决方案

前言 在设计锂离子电池充电器时,会因为充电电流波动导致电压波动,系统异常。 所以分析了锂离子电池的特性,给出了几种解决方法。 有纰漏请指出,转载请说明。 学习交流请发邮件 1280253714qq.com 理论 锂电池简单地可看做一…

VBA_MF系列技术资料1-222

MF系列VBA技术资料 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧,我参考大量的资料,并结合自己的经验总结了这份MF系列VBA技术综合资料,而且开放源码(MF04除外),其中MF01-04属于定…

【算法每日一练]-图论(保姆级教程 篇4(遍历))#传送门 #负环判断 #灾后重建

今天继续 目录 题目:传送门 思路: 题目:负环判断 思路: 题目:灾后重建 思路: 题目:传送 门 思路: 先跑一边floyd,然后依次加入每个传送门,O(n^5)不行…