rock3a: 基于自建数据集+yolov5s模型的rknn模型训练部署全流程

news2024/9/28 13:19:38

上一篇文章其实已经详述了模型训练到部署的整个流程,但是数据集到模型都是用的官方的coco数据集,这里为了记录开发板的模型训练到部署的整个流程,重新开了一篇文章进行记录。

首先准备数据集和rockchip官方推荐的yolov5源代码

这里需要注意的是数据集中的标签文件内容 一行只能有5个数,分别是类别和(x,y,w,h)

但是我平时用的labelimg.exe 生成的xml文件转化为txt标签文本文件后 一行有6个数,分别为类别,(x,y,w,h),以及置信度,这里需要做一下转换。

然后需要将coco/yaml128.yaml配置文件中的部分参数做一下修改 主要是训练类别数和训练类别名称

 一般做目标检测(比如我)只做一类检测,这里需要将类别数改为1,并将类别标签改为实际的标签名。

接下来就是训练模型,在yolov5-master路径下,键入命令

python3 train.py --data coco128.yaml --weights '' --cfg yolov5s.yaml --img 64

该命令的意思是读取coco128.yaml配置文件里面的数据集路径和类别数、类别名,模型架构为yolov5s,也就是small版本的模型,考虑到开发板的性能,所以这里选择的是small版本的模型,然后重新训练模型。训练模型完成后,需要将模型进行转换,转换为onnx模型。

这里需要将model/yolo.py文件某个部分进行修改,才能正确的将pt模型导出为onnx模型。

注:训练时不需要修改该部分代码  导出模型时需要修改该部分代码

椭圆处是需要注释的部分。

在yolov5-master 主目录下,键入命令

python3   export.py --weights yolov5s.pt --img 640 --batch 1 --opset 12 --include onnx

可以将pt模型转化为onnx模型。将转化后的onnx模型拷贝出来。

接下来在已经安装rknn-toolkit的虚拟机上,对onnx模型进行转换。

首先采用Netron.exe软件打开转化好的onnx模型查看其网络结构

并记下其三个输出的标号。

然后将onnx模型拷贝到/home/rock/workspace/rknn-toolkit2-1.4.0/examples/onnx/yolov5 这个目录下。

该目录下的test.py是瑞芯微官方已经写好的demo文件。

我在这里类比test.py写了一个onnx2rknn.py  ,功能与test.py差不多,只是少了连板推理部分。

注意需要在onnx2rknn.py文件中做部分修改

修改完成后,键入命令 python3 onnx2rknn.py文件,正常情况下会生成一个rknn结尾的文件。

接下来将该rknn文件拷贝到开发板上的对应目录下,我这里是

/home/rock/software/rknpu2-main/examples/rknn_yolov5_demo/install/rknn_yolov5_demo_Linux

相对于原始文件,这里我们需要修改如下几个部分:

  1. 需要在源代码中修改类别数

 

  1. 需要在配置文件中修改类别数

配置文件一共有两个,如上图所示。

我这里将配置文件里面的类别数修改为我自己的类别数

然后在开发板重新编译,键入命令

sh build-linux_RK356X.sh

然后进入 install/rknn_yolov5_demo_Linux/ 路径下,去执行可执行文件

这里说一句:

模型训练初期和模型多次迭代后,其运行速度是不一样的。

实测,当模型开始迭代时,运行一次目标检测耗时大约120ms,当模型迭代300个epoch时,运行一次目标检测耗时60ms,这其中的原因不得而知,如果有大佬知道的欢迎讨论

到此为止,基于自建数据集的模型训练到模型转化,模型部署已经搭建完毕。

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

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

相关文章

基于Node.js Vue企业产品展示网站

摘 要随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代&am…

CAN201-Computer Network(2)

文章目录4. Network Layer4.1 Router4.1.1 Input port functions4.1.2 Destination-based forwarding4.1.3 Switching fabrics4.1.4 Input port queueing4.1.5 Output ports4.2 Internet Protocol4.2.1 IP fragmentation, reassembly4.3 IPv4 addressing4.3.1 Subnets4.3.2 Net…

高等数学(第七版)同济大学 习题11-4 个人解答

高等数学(第七版)同济大学 习题11-4 函数作图软件:Mathematica 1.设有一分布着质量的曲面Σ,在点(x,y,z)处它的面密度为μ(x,y,z),用对面积的曲面积分表示这曲面对于x轴的转动惯量.\begin{aligned}&1. \ 设有一分…

IB生物课程介绍与Topic 1: Cell Biology考点分享

准备让孩子就读国际学校或者孩子正在国际学校就读的家长肯定听说过“IB”或者“IB班”,那IB究竟是什么呢?IB与IB课程 IB是International Baccalaureate(国际文凭)的简称,其课程体系国际文凭大学预科课程(In…

Educational Codeforces Round 141 (Rated for Div. 2)A——C

ps:先自我检讨...自从世界杯开始后,就一直摆烂到现在。直到打了今年的第一场cf,看见打的这么菜,真是想remake/。后面我会陆陆续续的补完前段时间没有打的比赛... Dashboard - Educational Codeforces Round 141 (Rated for Div. …

ReentrantLock

目录 ReentrantLock ReentrantLock语法 ReentrantLock可重入 ReentrantLock可打断 ReentrantLock锁超时 ReentrantLock解决哲学家就餐问题 ReentrantLock公平锁 ReentrantLock条件变量 ReentrantLock ReentrantLock 相比于synchronized的特点 : 可中断:比如A线程拥有…

基于移动最小二乘法的曲线曲面拟合论文阅读笔记

基于移动最小二乘法的曲线曲面拟合论文阅读笔记 论文地址:http://www.cnki.com.cn/Article/CJFDTotal-GCTX200401016.htm 一、Problem Statement 传统的曲线(曲面)拟合方法一般使用最小二乘法, 通过使误差的平方和最小, 得到一个线性方程组&#xff0…

通过alist挂在阿里网盘的方法

1、在github官网https://github.com/alist-org/alist/releases/download/v3.8.0/alist-windows-amd64.zip下载alist软件客户端,双击运行,可以看到默认的密码和服务器地址,打开网页http://localhost:5244/manage/accounts,填写密码…

【Linux】Linux工具

文章目录软件包管理器yumVIM编辑器Linux编译器-gcc/g使用gcc如何完成预处理(进行宏替换)编译(生成汇编)汇编(生成机器课识别代码)链接在这里涉及到一个重要的概念: 函数库函数库一般分为静态库和动态库两种gcc选项gcc选项记忆Linux项目自动化构建工具-make/Makefile背景理解实例…

解决vue中报错 Duplicate keys detected:‘1‘. This may cause an update error.

报错截图: 报错原因: 通过上图的报错信息我们不难看出,报错的主要原因出现在 key 值上,报错的意思大概是检测到重复的 key 值,通俗来讲就是你的 key 值不是唯一的。 解决方案: 问题的根源找到了&#xff…

【初阶数据结构】——链表常见面试题剖析

文章目录前言题目1:移除链表元素题目分析思路1:暴力求解思路2:取非val值尾插至新链表思路讲解思考代码实现不带哨兵位带哨兵位题目2:合并两个有序链表题目分析思路讲解代码实现不带哨兵位带哨兵位题目3:反转链表题目分…

用ode45解微分方程遇到的实际问题

最近在用ode45解微分方程数值解,试图复现论文中的图。一般来说说微分方程(组)只要按照响应的条件去撰写好对应的回调函数即可,基本没什么难度,但对于本文遇到的的这个问题,可能还需要一些技巧去实现解法&am…

动态路由和导航守卫

一、动态路由1、什么是动态路由?将URL地址中可变的内容设置成参数,根据不同的参数渲染不同的组件。(组件可以复用)2、动态路由如何进行参数的传递:(1)如何设置URL地址中的参数:’/ur…

【手写 Vue2.x 源码】第十二篇 - 生成 ast 语法树-流程说明

一,前言 上篇,主要介绍了 vue 数据渲染核心流程,涉及以下几个点: 初次渲染时 template 模板被编译为 ast 语法树;通过 ast 语法树生成 render 函数;通过 render 函数返回 vnode 虚拟节点;使用…

基于K8s的DevOps平台实践(三)

文章目录前言1. Jenkins与k8s集成🍑 插件安装及配置🍑 演示动态slave pod🍑 Pod-Template中容器镜像的制作🍑 实践通过Jenkinsfile实现demo项目自动发布到kubenetes环境2. Jenkins集成Sonarqube🍑 sonarqube架构简介&a…

初阶产品经理必看:如何快速进阶B端产品经理

​从去年开始,大批的互联网企业开始转战B端,众多传统企业也早在几年前就开始向互联网转型。 产业互联网的兴起,让一个岗位的潜藏价值正在逐渐爆发,尤其是富有经验的背景,更加让身价越来越高。 这个岗位就是&#xff…

QProcess的非阻塞式用法以及QApplication::processEvents的使用

一、QProcess的阻塞模式QProcess的应用场景非常广泛。可以使用它在qt程序中执行其他进程,并与之进行通信。当使用它执行一些终端命令和操作时,命令和操作往往是需要一定的时间的,这时QProcess本身提供了方法如:waitForStarted() /…

神经网络自适应PID控制及其应用

神经网络自适应PID控制及其应用 总结来自重庆大学宋永瑞教授2022暑期校园行学术会议 1. 研究背景 目前人工智能的发展为很多领域里的研究提供了可延展性,提供了新的研究问题的思路,无人系统和人工智能正走向深度融合,无人系统里具有核心驱动作…

C语言及算法设计课程实验三:最简单的C程序设计——顺序程序设计(四)

C语言及算法设计课程实验三:最简单的C程序设计——顺序程序设计(四)一、实验目的二、 实验内容2.4、将"China”译成密码三、 实验步骤3.4、顺序程序设计实验题目4:将"China”译成密码的实验步骤3.4.1、变量的定义与赋初…

Android EventBus源码深入解析

前言 EventBus:是一个针对Android进行了优化的发布/订阅事件总线。 github对应地址:EventBus 大家肯定都已经比较熟悉了,这里重点进行源码分析; EventBus源码解析 我们重点从以下三个方法入手,弄清楚register、unre…