本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——2Yolo使用之ONNX模型准备

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——2Yolo使用之ONNX模型准备

​ 大家好,因为板端BPU环境,可以加速目标检测的速度,所以今天在此先给大家带来如何准备一个模型,下一期会给大家带来如何在板端部署这一期的目标识别模型

​ 本文给大家带来的是yolov5-2.0 版本,在我最先接触的就是这个板子,当时也是参考了地平线社区的大佬带来一些方法,当然这个参考是在下一期哈哈、

​ 这一期其方法上是通用的,出这一期也是能够方便大家以后学会yolo任何版本的使用。

​ 因为我没有研究很深入,我写是针对比赛,至于其他版本会不会在使用过程中有小坑,在地平线官网也是有教程的,大家需要其他版本的可以去看看其他大佬的文章。

1.获取目标检测源码

​ 首先,是要获得yolov5-2.0得源码,正常情况是要教大家去github进行下载源码的,但是咳咳好像不太容易,因为“科学上网”

​ 当然下载完成2.0版本还有有很多bug的,这里给大家以附件形式给出我的源码吧

​ 下载的源码里主要由一下文件夹

image-20240802203012603

2.数据准备与标记

​ 要训练一个模型,首先需要一定的图片数据,然后标记,接下来开始告诉大家如何进行这些准备

​ 当然你首先要有Pyhton环境,这里就不教大家配置Python了,我这里使用的是Anaconda+Pycharm

​ 之前发现哔哩哔哩有好多讲解使用,大家可以看下

2.1 数据集准备

​ 首先建立一个文件夹dataset,里面放置image和label,每个子文件夹里面放置train和test。然后把你的jpg或者png图片放在image的train里面

image-20240802203525930

2.2 数据标记

​ 打开你的命令行,输入如下

pip install labelimg

image-20240802204001016

​ 稍等安装完毕,然后在命令行输入,如下内容,你会发现弹出如下窗口

labelimg

image-20240802204130724

​ 接下来点击View-选择第一行设置自动保存模式

image-20240802204209178

​ 接下来点击 Open Dir——>选择你刚才image所在的目录

image-20240802204350234

​ 接下来选择 Change Save Dir 找到你的label文件夹里的train

image-20240802204743843

​ 最后保证选择Yolo模式

image-20240802205052804

​ 此刻你就可以看到你的图片已经加载进来了

image-20240802205131915

​ 这里把鼠标移动到页面里,按下键盘里w,会出现一个十字

image-20240802205239892

​ 这时候你就可以,进行绘制矩形了,绘制完成后,就会出现一个提示框,这里写上你的标签

image-20240802205304825

​ 当你打完这个标签之后,使用键盘键A和D,可以切换上一张,下一张,最后你标记完成你所有图片,应该是下面这个样子

​ 一个文件夹有图片,另外一个文件夹里面是txt格式文件

image-20240802205653908

3.配置文件

3.1目录结构

​ 在你下载的源码中创建下面这样的文件夹,接下来,我将挨个进行刚才没有提及的文件进行解释

image-20240802205927731

3.2 test

​ 对于test里面的文件夹,这里下面我给大家提供一个分割脚本,其实本质是就是将刚才打标签的所有内容,进行划分,分成两部分

​ 当然下面代码是要大家改一些东西的,一些路径字符串我已经给大家写好了,大家改成自己对应的就可以了

import os
import shutil
from sklearn.model_selection import train_test_splitdef move_files(src_dir, dst_dir, files, extension):"""将指定的文件从源目录移动到目标目录。"""os.makedirs(dst_dir, exist_ok=True)  # 如果目标目录不存在,则创建for base_name in files:src_path = os.path.join(src_dir, f"{base_name}{extension}")dst_path = os.path.join(dst_dir, f"{base_name}{extension}")shutil.move(src_path, dst_path)def split_dataset(src_images_dir, src_labels_dir, dst_dirs, train_ratio=0.8, val_ratio=0.1):"""将数据集分为训练集、验证集和测试集,并移动到指定目录。参数:- src_images_dir: 图片的源目录。- src_labels_dir: 标签的源目录。- dst_dirs: 目标目录的字典,包含'train', 'val', 'test'对应的图片和标签目录。- train_ratio: 训练集在总数据中的比例。- val_ratio: 验证集在总数据中的比例。"""test_ratio = 1 - train_ratio - val_ratioassert test_ratio > 0, "Invalid ratios: Sum of train and val ratios must be less than 1."# 读取并分割数据files = [os.path.splitext(file)[0] for file in os.listdir(src_images_dir)]train_files, test_files = train_test_split(files, test_size=test_ratio, random_state=42)train_files, val_files = train_test_split(train_files, test_size=val_ratio / (train_ratio + val_ratio),random_state=42)# 移动文件到相应的目录for part, file_list in [('train', train_files), ('val', val_files), ('test', test_files)]:move_files(src_images_dir, dst_dirs[part]['images'], file_list, '.jpg') #这里使用的是jpg格式,如果是png需要修改move_files(src_labels_dir, dst_dirs[part]['labels'], file_list, '.txt')def main():# 定义源目录src_images_dir = r'刚才的tain里面的所有图片'src_labels_dir = r'刚才label所有txt'# 定义目标目录dst_dirs = {'train': {'images': r'训练集图片路径','labels': r'训练集标签路径'},'val': {'images': r'验证集图片路径','labels': r'验证集标签路径'},'test': {'images': r'测试集标签路径','labels': r'测试集标签路径'}}# 调用函数,进行数据划分和文件移动split_dataset(src_images_dir, src_labels_dir, dst_dirs, train_ratio=0.8, val_ratio=0.1)if __name__ == '__main__':main()

3.3 my_model.yaml

​ 对于这个yaml文件,大家只需要吧第一个参数nc改成自己的实际类别,对于小白其他参数不需要管

# parameters
nc: 1  # number of classes
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple# anchors
anchors:- [10,13, 16,30, 33,23]  # P3/8- [30,61, 62,45, 59,119]  # P4/16- [116,90, 156,198, 373,326]  # P5/32# YOLOv5 backbone
backbone:# [from, number, module, args][[-1, 1, Focus, [64, 3]],  # 0-P1/2[-1, 1, Conv, [128, 3, 2]],  # 1-P2/4[-1, 3, BottleneckCSP, [128]],[-1, 1, Conv, [256, 3, 2]],  # 3-P3/8[-1, 9, BottleneckCSP, [256]],[-1, 1, Conv, [512, 3, 2]],  # 5-P4/16[-1, 9, BottleneckCSP, [512]],[-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32[-1, 1, SPP, [1024, [5, 9, 13]]],[-1, 3, BottleneckCSP, [1024, False]],  # 9]# YOLOv5 head
head:[[-1, 1, Conv, [512, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 6], 1, Concat, [1]],  # cat backbone P4[-1, 3, BottleneckCSP, [512, False]],  # 13[-1, 1, Conv, [256, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 4], 1, Concat, [1]],  # cat backbone P3[-1, 3, BottleneckCSP, [256, False]],  # 17[-1, 1, Conv, [256, 3, 2]],[[-1, 14], 1, Concat, [1]],  # cat head P4[-1, 3, BottleneckCSP, [512, False]],  # 20[-1, 1, Conv, [512, 3, 2]],[[-1, 10], 1, Concat, [1]],  # cat head P5[-1, 3, BottleneckCSP, [1024, False]],  # 23[[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)]

3.4 my_para.yaml

​ 对于这个yaml文件,下面四个参数都要修改,具体修改下面已经用中文给出大家了

# COCO 2017 dataset http://cocodataset.org - first 128 training images
# Download command:  python -c "from yolov5.utils.google_utils import *; gdrive_download('1n_oKgR81BJtqk75b00eAjdv03qVCQn2f', 'coco128.zip')"
# Train command: python train.py --data coco128.yaml
# Default dataset location is next to /yolov5:
#   /parent_folder
#     /coco128
#     /yolov5# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
train: "训练集图片的路径"  # 128 images
val: "验证集的图片路径"  # 128 images# 这个地方写类别个数,数字
nc: 1# class names
names: ['刚才标记的字符串名字','标记的第二个label名字']

4.训练配置

4.1train.py

​ 对于训练,打开train.py 按照我下面截图框进行设置,下面是解释

​ (1)cfg 这个把刚才的my_mode.yaml路径放进来

​ (2)data这个把刚才的my_para.yaml路径放进来

​ (3)epochs:这个设置轮数

​ (4)device:选择cpu,当然我这里是0 是因为我配置了cuda

​ (5)img-size:这里注意一下。这里选择672*672 和我一样就行,方便后面转模型,我也没有研究很深入,好像是转模型有点影响

image-20240802211637078

4.2 model/yolo.py

​ 现在我们是训练阶段,我给大家提供的里面就是我现在截图这个样子,

​ 大家需要把红框的这个取消注释

​ 把红框下面的进行注释掉

image-20240802212009895

4.3正式训练

​ 到现在你就可以愉快的进行训练啦

​ 当你看到类似下面这种情况,代表你的模型正常训练了

image-20240802212419007

4.4训练完成

​ 训练时间还是挺漫长的,当你最后训练完成了,你会发现,控制台输出了一个日志,当然不一定和我的一模一样,因为我的是v5-7.0版本

image-20240802212455738

​ 哈哈大同小异,反正根据日志找到位置就好了,然后你会看到,里面有这些,通常我们会使用best.pt

​ 到此为止,windows的模型就训练得到啦

image-20240802212626331

5 ONNX模型转化

​ 这一步就很简单了,大家只需要,先把yolo.py里面的换到处onnx该使用的那一行就好啦

image-20240802213044574

​ 这个时候大家吧expoer.py里面的weights路径改成刚才的pt就行了

​ 运行代码你就会发现,现在onnx成功转化了,然后你就可以使用这个进行下一期的bin模型转化了

image-20240802213032934

6.总结与下期预告

本期,给大家带来了如何在windows训练yolov5,大家可以试试

当然本期介绍确实没啥含金量,网上有关教程也满天飞,我也参考了好多大佬的文章,也就是对于大佬们详细版本的总结一下

下一期讲给大家带来与地平线更为相关的内容,包括bin模型转化环境,以及转化过程的提炼版本

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PromQL全方位解读:监控与性能分析的关键技术

一、PromQL简介 Prometheus Query Language (PromQL) 是一个专为Prometheus监控系统设计的强大查询语言,它允许用户对收集的时间序列数据进行高效、灵活的查询和分析。PromQL的设计哲学在于提供简洁而强大的语法,以支持复杂的数据检索和实时监控场景。本…

7B 开源模型突破 IMO 形式化证明,霸榜数学竞赛

总览 去年底,著名数学家、菲尔兹奖获得者陶哲轩就提出 AI 将加速数学研究,成为数学家的可靠伙伴,并且在形式化语言 Lean 的帮助下,成功证明了多项式 Freiman-Ruzsa 猜想。在今年的国际数学奥林匹克竞赛(IMO&#xff0…

24澳中博览会|2025非洲水协年会暨展览|2025山西水展

2024澳中博览会 2025非洲水协年会暨展览 2025年山西国际水展暨水利工程设计与施工、水处理技术设备、泵管阀、智慧水务及环保展 承办单位:山西泽嘉国际展览有限公司 上海泽嘉展览服务有限公司 战略合作伙伴 : 美国迈阿密水展 欧 洲 海 水 脱 盐 淡 化…

新版Next.js 15中5个令人惊叹的特性

前端岗位内推来了 Next.js 15已经到来,一切比以往更好! 从全新的编译器到700倍更快的构建时间,创建具有卓越性能的全栈Web应用从未如此简单。 让我们探索v15的最新特性: 1. create-next-app升级:更清晰的UI&#xff0c…

Android进程保活:如何让app一直运行

目录 1)为什么需要进行进程保活呢?需求是什么? 2)进程分类 3)进程的优先级 4)如何提高进程优先级 5)如何进行进程保活 一、为什么需要进行进程保活呢?需求是什么? 比如…

mysql高级语句的查询语句

一、排序语法,关键字排序 升序和降序 默认的排序方式就是升序 升序:ASC 降序:DESC 配合语法:order by 语法 1、升序 select * from info order by name; 根据名字升序排序,不需要加ASC select * from info order…

ChinaJoy 2024,VERYCLOUD睿鸿股份与你相聚

🎮2024 ChinaJoy于26日正式开幕 🕗7月26-28日 🌐VERYCLOUD睿鸿股份在BTOB商务洽谈馆 🌟W4-B785展位 🎇展台交流好礼相送 与多行业好友现场相聚、畅谈🧐 现场游戏企业云集 专业观众、玩家纷至沓来 与游戏/短…

配置frp实现内网穿透(.toml配置文件)

简介 frp 是一款高性能的反向代理应用,专注于内网穿透。它支持多种协议,包括 TCP、UDP、HTTP、HTTPS 等,并且具备 P2P 通信功能。使用 frp,您可以安全、便捷地将内网服务暴露到公网,通过拥有公网 IP 的节点进行中转。…

APACHE安装与应用

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

乱弹篇(40)人类追求长寿

不要认为只有中国的老龄化才严重,实际上全球都面临老龄化,其中日本最为严重。 这是随着人类生活和医学水平的不断提高,寿命才会比过去数十年有了大幅度的提升。据资料显示,目前全球平均预期寿命估计为73岁。与百年之前相比&#…

上半年手游出海吸金超624亿,混合变现帮助游戏提升收益

2024年上半年,海外游戏市场总收入达到惊人的325亿美元,App Store平台收入同比增长11%。这一数据反映了手游市场的巨大潜力和活力,不论是在App Store还是Google Play,玩家们对手游的热情有增无减,支撑了开发者们收益的不…

5行代码快速Git配置ssh

0 流程步骤 检查本地主机是否已经存在ssh key生成ssh key获取ssh key公钥内容(id_rsa.pub)复制该内容,到Github账号上添加公钥,进入Settings设置验证是否设置成功 1 代码 # 1.检查本地主机是否已经存在ssh key cd ~/.ssh ls # …

WEB前端15-Router路由

Vue2-router路由 在使用Vue.js构建现代单页面应用程序(SPA)时,路由管理是至关重要的一部分。Vue Router 是 Vue.js 官方的路由管理器,它允许你在应用程序中实现基于组件的页面导航。本文将介绍Vue Router的基本概念和用法&#x…

LSTM与GNN强强结合!全新架构带来10倍推理速度提升

今天来推荐一个深度学习领域很有创新性的研究方向:LSTM结合GNN。 GNN擅长处理图数据关系和特征,而LSTM擅长处理时间序列数据及长期依赖关系。通过将两者结合,我们可以有效提升时间序列预测的准确性和效率,尤其是在处理空间和时间…

vue配置多个环境变量ENV【收藏版】

vue配置多个环境变量 1. 创建环境变量文件 在你的Vue项目根目录下,你可以创建以下环境变量文件: .env:所有环境都会加载的通用变量。 .env.local:本地覆盖,不会被git跟踪。 .env.[mode]:只有指定模式才会…

光伏气象仿真系统有什么优势?

光伏气象仿真系统作为这一领域的核心工具,凭借其独特的优势,正逐步成为行业标配。本文将围绕数据可靠性、功能齐全性、海外布局支持、系统开放性以及合作方式灵活性五个方面,深入探讨光伏气象仿真系统的显著优势。 1.数据可靠:权威…

Java中的Heap(堆)(如果想知道Java中有关堆的知识点,那么只看这一篇就足够了!)

前言:(Heap)是一种特殊的完全二叉树,它在诸多算法中有着广泛的应用,本文将详细介绍Java中的堆。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 先让我们看一下本文大…

微信小程序-获取手机号:HttpClientErrorException: 412 Precondition Failed: [no body]

问题: 412 异常就是你的请求参数获取请求头与服务器的不符,缺少请求体! 我的问题: 我这里获取微信手机号的时候突然给我报错142,但是代码用的是原来的代码,换了一个框架就噶了! 排查问题&am…

Springboot手工艺品交易平台—计算机毕业设计源码11541

摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对手工艺品交易平台等问题,对手工…

【MySQL进阶】事务隔离级别 MVCC

目录 MySQL事务隔离级别 1. 读未提交(Read Uncommitted) 2. 读已提交(Read Committed) 3. 可重复读(Repeatable Read)(默认隔离级别) 4. 串行化(Serializable) 表格总结 MVCC …