模型训练篇 | yolov9来了!手把手教你如何用yolov9训练自己的数据集

2024-02-28 05:12

本文主要是介绍模型训练篇 | yolov9来了!手把手教你如何用yolov9训练自己的数据集,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:Hello大家好,我是小哥谈。YOLOv9是一种目标检测算法,它是YOLO(You Only Look Once)系列算法的最新版本。本节课就带领大家如何基于YOLOv9来训练自己的目标检测模型,本次作者就以安全帽佩戴检测为案例进行说明,让大家可以轻松了解整个模型训练过程!~🌈  

     目录

​🚀1.算法介绍

🚀2.数据标注

🚀3.模型训练

🚀4.源码修正

🚀1.算法介绍

继2023年1月YOLOv8正式发布一年多以后,YOLOv9终于来了!👋我们知道,YOLO是一种基于图像全局信息进行预测的目标检测算法。自2015年Joseph RedmonAli Farhadi等人提出初代模型以来,领域内的研究者们已经对YOLO进行了多次更新迭代,模型性能越来越强大。💪

此次,YOLOv9由中国台湾Academia Sinica、台北科技大学等机构联合开发,相关的论文已经放出。💞

如今的深度学习方法重点关注如何设计最合适的目标函数,从而使得模型的预测结果能够最接近真实情况。同时,必须设计一个适当的架构,可以帮助获取足够的信息进行预测。然而,现有方法忽略了一个事实,即当输入数据经过逐层特征提取和空间变换时,大量信息将会丢失。因此,YOLOv9深入研究了数据通过深度网络传输时数据丢失的重要问题,即信息瓶颈和可逆函数。

研究者提出了可编程梯度信息(programmable gradient information,PGI) 的概念来应对深度网络实现多个目标所需要的各种变化。PGI可以为目标任务计算目标函数提供完整的输入信息,从而获得可靠的梯度信息来更新网络权值。

此外,研究者基于梯度路径规划设计了一种新的轻量级网络架构,即通用高效层聚合网络(Generalized Efficient Layer Aggregation Network,GELAN)。该架构证实了PGI可以在轻量级模型上取得优异的结果。

研究者在基于MS COCO数据集的目标检测任务上验证所提出的GELAN和PGI。结果表明,与基于深度卷积开发的SOTA方法相比,GELAN仅使用传统卷积算子即可实现更好的参数利用率。

对于PGI而言,它的适用性很强,可用于从轻型到大型的各种模型。我们可以用它来获取完整的信息,从而使从头开始训练的模型能够比使用大型数据集预训练的SOTA模型获得更好的结果。下图展示了一些比较结果。👇

对于新发布的YOLOv9,曾参与开发YOLOv7、YOLOv4、Scaled-YOLOv4 和DPT的Alexey Bochkovskiy给予了高度评价,表示YOLOv9优于任何基于卷积或transformer的目标检测器。

YOLOv9看起来就是新的SOTA实时目标检测器,他自己的自定义训练教程也在路上了。

来源:https://twitter.com/skalskip92/status/1760717291593834648

论文题目:《YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information》

论文地址:  https://arxiv.org/abs/2402.13616

代码实现:  GitHub - WongKinYiu/yolov9: Implementation of paper - YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information 

YOLOv9官方发布的代码存在一些问题,作者已经进行了修正并测试成功,需要完整代码的可在我的“资源”中下载。


🚀2.数据标注

利用labelimg或者make sense软件来标注数据,关于如何使用labelimg或者make sense软件来为自己的数据集打上标签,请参考作者专栏文章:👇

说明:♨️♨️♨️

数据标注工具的使用教程:

YOLOv5入门实践(1)— 手把手教你使用labelimg标注数据集(附安装包+使用教程)

YOLOv5入门实践(2)— 手把手教你使用make sense标注数据集(附工具地址+使用教程)


🚀3.模型训练

第1步:准备数据集

将数据集放在datasets文件夹中。datasets属于放置数据集的地方,位于PycharmProjects中,C:\Users\Lenovo\PycharmProjects中(这是我的电脑位置,跟你的不一定一样,反正位于PycharmProjects中,如果没有,可自行创建),属于项目的同级文件夹。具体如下图所示:

打开datasets文件夹,可以看到本次安全帽训练所使用的数据集。

安全帽佩戴检测数据集是我手动标注好的,可以在我的博客“资源”中下载。

打开数据集文件,我们会看到数据集文件包括imageslabels两个文件夹,其中,images放的是数据集图片,包括trainval两个文件夹,labels放的是经过labelimg标注所生成的标签,也包括trainval两个文件夹。💑

​关于此处数据集的逻辑关系,用一张图总结就是:⬇️⬇️⬇️

​第2步:创建yaml文件

打开pycharm,选择yolov9-main项目源码文件,在data文件下新建一个helmet.yaml,如下图所示:👇

​打开helmet.yaml,按照如下图所示的进行配置:

说明:♨️♨️♨️

1.train和val为绝对路径地址,可根据自己数据集的路径地址自行设置。

2.nc指的是分类,即模型训练结果分类,此处为在用labelimg或者make sense为数据集标注时候确定。

3.由于本次进行的是安全帽佩戴检测模型训练,所以分两类,分别是:helmet(佩戴安全帽)和nohelmet(不佩戴安全帽)

打开coco.yaml文件,可以看到里面写的是相对路径,和我们的写法不同,但是都可以使用,据我所知还有很多种数据集读取方式:

path: ../datasets/coco  # dataset root dir
train: train2017.txt  # train images (relative to 'path') 118287 images
val: val2017.txt  # val images (relative to 'path') 5000 images
test: test-dev2017.txt  # 20288 of 40670 images, submit to https://competitions.codalab.org/competitions/20794# Classes
names:0: person1: bicycle2: car3: motorcycle4: airplane5: bus6: train7: truck8: boat9: traffic light10: fire hydrant11: stop sign12: parking meter13: bench14: bird15: cat16: dog17: horse18: sheep19: cow20: elephant21: bear22: zebra23: giraffe24: backpack25: umbrella26: handbag27: tie28: suitcase29: frisbee30: skis31: snowboard32: sports ball33: kite34: baseball bat35: baseball glove36: skateboard37: surfboard38: tennis racket39: bottle40: wine glass41: cup42: fork43: knife44: spoon45: bowl46: banana47: apple48: sandwich49: orange50: broccoli51: carrot52: hot dog53: pizza54: donut55: cake56: chair57: couch58: potted plant59: bed60: dining table61: toilet62: tv63: laptop64: mouse65: remote66: keyboard67: cell phone68: microwave69: oven70: toaster71: sink72: refrigerator73: book74: clock75: vase76: scissors77: teddy bear78: hair drier79: toothbrush# Download script/URL (optional)
download: |from utils.general import download, Path# Download labels#segments = True  # segment or box labels#dir = Path(yaml['path'])  # dataset root dir#url = 'https://github.com/WongKinYiu/yolov7/releases/download/v0.1/'#urls = [url + ('coco2017labels-segments.zip' if segments else 'coco2017labels.zip')]  # labels#download(urls, dir=dir.parent)# Download data#urls = ['http://images.cocodataset.org/zips/train2017.zip',  # 19G, 118k images#        'http://images.cocodataset.org/zips/val2017.zip',  # 1G, 5k images#        'http://images.cocodataset.org/zips/test2017.zip']  # 7G, 41k images (optional)#download(urls, dir=dir / 'images', threads=3)

第3步:下载预训练权重

打开YOLOv9官方仓库地址,可以根据需要下载相应的预训练权重。

预训练权重下载地址:GitHub - WongKinYiu/yolov9: Implementation of paper - YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information

​ 下载完毕后,在主目录下新建weights文件夹,然后将下载的权重文件放在weights文件夹下。具体如下图所示:👇

​第4步:配置路径

在项目里找到train.py文件,在'--weights'参数的default处设置为'weights/yolov9-c.pt',在'--cfg'参数的default处设置为'models/detect/yolov9-c.yaml',在'--data'参数的efault处设置为前面所创建的安全帽检测的helmet.yaml文件的路径。关于此处的设置具体如下图所示:👇

备注:此处根据具体情况进行设置。

第5步:调节参数

  • epochs中的参数设置为100,表示需经过100轮训练。
  • batch-size表示一次训练所抓取的数据样本数量,其大小影响训练速度和模型优化,此处将其参数设置为4。

备注:此处根据具体情况进行设置。

第6步:开始训练

在train.py中点击“运行”。具体运行结果如下图所示:👇

​训练完毕,训练结果如下图所示:

由结果可知,训练结果还是很不错的。👏👏👏 


🚀4.源码修正

我在进行模型训练的过程中,发现作者所上传的源码存在部分错误,现修正如下:👇

修正1:

2024.2.22日官网发布的代码存在bug,将utils文件下loss_tal.py脚本中的第167行中的p改为p[0]p[1],改完能运行。(bug产生的原因是列表导致后面方法错误,具体原因正在读源码!)

原代码:

feats = p[1] if isinstance(p, tuple) else p

修改为:

feats = p[1] if isinstance(p, tuple) else p[0]

或者

feats = p[1] if isinstance(p, tuple) else p[1]

修正2:

将train.py文件参数第4行的'--hyp'参数修改,即:

原代码:

parser.add_argument('--hyp', type=str, default=ROOT / 'data/hyps/hyp.scratch-low.yaml', help='hyperparameters path')

修改为

 parser.add_argument('--hyp', type=str, default=ROOT / 'data/hyps/hyp.scratch-high.yaml', help='hyperparameters path')

说明:关于更多YOLOv9内容, 欢迎关注后续系列精彩文章!~🍉 🍓 🍑 🍈 🍌 🍐

这篇关于模型训练篇 | yolov9来了!手把手教你如何用yolov9训练自己的数据集的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/754478

相关文章

Spring 请求之传递 JSON 数据的操作方法

《Spring请求之传递JSON数据的操作方法》JSON就是一种数据格式,有自己的格式和语法,使用文本表示一个对象或数组的信息,因此JSON本质是字符串,主要负责在不同的语言中数据传递和交换,这... 目录jsON 概念JSON 语法JSON 的语法JSON 的两种结构JSON 字符串和 Java 对象互转

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

SpringBoot使用GZIP压缩反回数据问题

《SpringBoot使用GZIP压缩反回数据问题》:本文主要介绍SpringBoot使用GZIP压缩反回数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot使用GZIP压缩反回数据1、初识gzip2、gzip是什么,可以干什么?3、Spr

SpringBoot集成Milvus实现数据增删改查功能

《SpringBoot集成Milvus实现数据增删改查功能》milvus支持的语言比较多,支持python,Java,Go,node等开发语言,本文主要介绍如何使用Java语言,采用springboo... 目录1、Milvus基本概念2、添加maven依赖3、配置yml文件4、创建MilvusClient

SpringValidation数据校验之约束注解与分组校验方式

《SpringValidation数据校验之约束注解与分组校验方式》本文将深入探讨SpringValidation的核心功能,帮助开发者掌握约束注解的使用技巧和分组校验的高级应用,从而构建更加健壮和可... 目录引言一、Spring Validation基础架构1.1 jsR-380标准与Spring整合1

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

SpringBatch数据写入实现

《SpringBatch数据写入实现》SpringBatch通过ItemWriter接口及其丰富的实现,提供了强大的数据写入能力,本文主要介绍了SpringBatch数据写入实现,具有一定的参考价值,... 目录python引言一、ItemWriter核心概念二、数据库写入实现三、文件写入实现四、多目标写入

使用Python将JSON,XML和YAML数据写入Excel文件

《使用Python将JSON,XML和YAML数据写入Excel文件》JSON、XML和YAML作为主流结构化数据格式,因其层次化表达能力和跨平台兼容性,已成为系统间数据交换的通用载体,本文将介绍如何... 目录如何使用python写入数据到Excel工作表用Python导入jsON数据到Excel工作表用

Mysql如何将数据按照年月分组的统计

《Mysql如何将数据按照年月分组的统计》:本文主要介绍Mysql如何将数据按照年月分组的统计方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql将数据按照年月分组的统计要的效果方案总结Mysql将数据按照年月分组的统计要的效果方案① 使用 DA

鸿蒙中Axios数据请求的封装和配置方法

《鸿蒙中Axios数据请求的封装和配置方法》:本文主要介绍鸿蒙中Axios数据请求的封装和配置方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.配置权限 应用级权限和系统级权限2.配置网络请求的代码3.下载在Entry中 下载AxIOS4.封装Htt