手把书教你使用YOLOv9训练自己的数据集(附YOLOv9网络结构图)
挂科边缘(毕业版) 2024-08-20 13:37:02 阅读 87
文章目录
前言一、YOLOv9代码下载地址1.yolov9模型结构图
二、数据集准备1.数据集标注软件2.voc数据集格式转换3.数据集划分4.修改yolo的训练配置文件
三、YOLO环境配置教程1.pytorch环境安装2.其他依赖安装
四、训练文件修改总结
前言
YOLOv9通过研究数据传输时的信息丢失问题,提出了可编程梯度信息(PGI)和通用高效层聚合网络(GELAN)架构,提高了参数利用率和模型性能。与SOTA方法相比,GELAN仅使用传统卷积算子即可实现更好的参数利用率。PGI适用于从轻型到大型的各种模型,使从头开始训练的模型能够获得更好的结果。YOLOv9被评价为新的SOTA实时目标检测器。论文地址链接: YOLOv9论文
一、YOLOv9代码下载地址
官网的源码下载地址 :链接: link
官网打不开的话,从我的网盘下载就行,链接: 源码下载
提取码: eajp
1.yolov9模型结构图
根据yolov9.yaml画出yolo整体结构图,如下图所示
二、数据集准备
1.数据集标注软件
数据集使用标注软件标注好,我这里推荐两个标注软件,一个是labelimg,另外一个是labelme,可以在python环境,使用pip install labelimg或者pip install labelme进行安装,看你选择哪个标注工具标注了,我使用labelimg标注工具
安装完成在终端输入命令启动标注软件
下面是软件界面
设置自动保存标注生成的标注文件
2.voc数据集格式转换
标注格式如果选择VOC格式,后面需要代码转换格式,如果选择yolo格式就不用转换,voc格式转换yolo格式代码如下:
<code>import xml.etree.ElementTree as ET
import os, cv2
import numpy as np
from os import listdir
from os.path import join
classes = []
def convert(size, box):
dw = 1. / (size[0])
dh = 1. / (size[1])
x = (box[0] + box[1]) / 2.0 - 1
y = (box[2] + box[3]) / 2.0 - 1
w = box[1] - box[0]
h = box[3] - box[2]
x = x * dw
w = w * dw
y = y * dh
h = h * dh
return (x, y, w, h)
def convert_annotation(xmlpath, xmlname):
with open(xmlpath, "r", encoding='utf-8') as in_file:code>
txtname = xmlname[:-4] + '.txt'
txtfile = os.path.join(txtpath, txtname)
tree = ET.parse(in_file)
root = tree.getroot()
filename = root.find('filename')
img = cv2.imdecode(np.fromfile('{}/{}.{}'.format(imgpath, xmlname[:-4], postfix), np.uint8), cv2.IMREAD_COLOR)
h, w = img.shape[:2]
res = []
for obj in root.iter('object'):
cls = obj.find('name').text
if cls not in classes:
classes.append(cls)
cls_id = classes.index(cls)
xmlbox = obj.find('bndbox')
b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
float(xmlbox.find('ymax').text))
bb = convert((w, h), b)
res.append(str(cls_id) + " " + " ".join([str(a) for a in bb]))
if len(res) != 0:
with open(txtfile, 'w+') as f:
f.write('\n'.join(res))
if __name__ == "__main__":
postfix = 'png' # 图像后缀
imgpath = r'E:\A-毕业设计代做数据\helmet\test\images' # 图像文件路径
xmlpath = r'E:\A-毕业设计代做数据\helmet\test\annotations' # xml文件文件路径
txtpath = r'E:\A-毕业设计代做数据\helmet\test\labels' # 生成的txt文件路径
if not os.path.exists(txtpath):
os.makedirs(txtpath, exist_ok=True)
list = os.listdir(xmlpath)
error_file_list = []
for i in range(0, len(list)):
try:
path = os.path.join(xmlpath, list[i])
if ('.xml' in path) or ('.XML' in path):
convert_annotation(path, list[i])
print(f'file { list[i]} convert success.')
else:
print(f'file { list[i]} is not xml format.')
except Exception as e:
print(f'file { list[i]} convert error.')
print(f'error message:\n{ e}')
error_file_list.append(list[i])
print(f'this file convert failure\n{ error_file_list}')
print(f'Dataset Classes:{ classes}')
代码需要修改的地方如下:
1.postfix参数填图片的后缀,需要注意图片格式要统一,是png格式就写png,是jpg格式就写jpg
2.imgpath参数填图片所在的路径
3.xmlpath参数填标注文件的路径
4.txtpath参数填生成的yolo格式的文件
3.数据集划分
划分训练集和验证集代码如下:
from sklearn.model_selection import train_test_split
val_size = 0.2
#test_size = 0.2
postfix = 'jpg'
imgpath = r'E:\A-毕业设计代做数据\datasets\images'
txtpath = r'E:\A-毕业设计代做数据\datasets\labels'
output_train_img_folder =r'E:\A-毕业设计代做数据\datasets\dataset_kengwa/images/train'
output_val_img_folder = r'E:\A-毕业设计代做数据\datasets\dataset_kengwa/images/val'
output_train_txt_folder = r'E:\A-毕业设计代做数据\datasets\dataset_kengwa\labels/train'
output_val_txt_folder = r'E:\A-毕业设计代做数据\datasets\dataset_kengwa\labels/val'
os.makedirs(output_train_img_folder, exist_ok=True)
os.makedirs(output_val_img_folder, exist_ok=True)
os.makedirs(output_train_txt_folder, exist_ok=True)
os.makedirs(output_val_txt_folder, exist_ok=True)
listdir = [i for i in os.listdir(txtpath) if 'txt' in i]
train, val = train_test_split(listdir, test_size=val_size, shuffle=True, random_state=0)
#todo:需要test放开
# train, test = train_test_split(listdir, test_size=test_size, shuffle=True, random_state=0)
# train, val = train_test_split(train, test_size=val_size, shuffle=True, random_state=0)
for i in train:
img_source_path = os.path.join(imgpath, '{}.{}'.format(i[:-4], postfix))
txt_source_path = os.path.join(txtpath, i)
img_destination_path = os.path.join(output_train_img_folder, '{}.{}'.format(i[:-4], postfix))
txt_destination_path = os.path.join(output_train_txt_folder, i)
shutil.copy(img_source_path, img_destination_path)
shutil.copy(txt_source_path, txt_destination_path)
for i in val:
img_source_path = os.path.join(imgpath, '{}.{}'.format(i[:-4], postfix))
txt_source_path = os.path.join(txtpath, i)
img_destination_path = os.path.join(output_val_img_folder, '{}.{}'.format(i[:-4], postfix))
txt_destination_path = os.path.join(output_val_txt_folder, i)
shutil.copy(img_source_path, img_destination_path)
shutil.copy(txt_source_path, txt_destination_path)
#
# for i in train:
# shutil.copy('{}/{}.{}'.format(imgpath, i[:-4], postfix), r'E:\1-cheng\4-yolo-dataset-daizuo\multi-classify\bird-boat-horse-aeroplane-sheep\dataset20231219/images/train/{}.{}'.format(i[:-4], postfix))
# shutil.copy('{}/{}'.format(txtpath, i), r'E:\1-cheng\4-yolo-dataset-daizuo\multi-classify\bird-boat-horse-aeroplane-sheep\dataset20231219/labels/train/{}'.format(i))
#
# for i in val:
# shutil.copy('{}/{}.{}'.format(imgpath, i[:-4], postfix), r'E:\1-cheng\4-yolo-dataset-daizuo\multi-classify\bird-boat-horse-aeroplane-sheep\dataset20231219/images/val/{}.{}'.format(i[:-4], postfix))
# shutil.copy('{}/{}'.format(txtpath, i), r'E:\1-cheng\4-yolo-dataset-daizuo\multi-classify\bird-boat-horse-aeroplane-sheep\dataset20231219/labels/val/{}'.format(i))
#todo:需要test则放开
# for i in test:
# shutil.copy('{}/{}.{}'.format(imgpath, i[:-4], postfix), 'images/test/{}.{}'.format(i[:-4], postfix))
# shutil.copy('{}/{}'.format(txtpath, i), 'labels/test/{}'.format(i))
需要修改的地方如下
下面四个参数只需在自己电脑任意位置新建一个文件夹就行,用于存放生成的训练集和验证集,比如新建一个文件夹叫dataset_kengwa,后面的路径不用动,如下图左边的框出来的路径覆盖成你的就行
数据集有以下两种方式放置,都可以进行训练,常见的数据集放置是第一种,也有开源的数据集按照第二种方式放置的,我都遇见过,也能训练起来
4.修改yolo的训练配置文件
我们需要在项目下创建一个data.yaml的文件,文件名根据数据集名称取,我这里方便演示直接叫data.yaml,如下图所示
代码如下:
<code>train: E:\Desktop\new-yolov9\yolotest\images\train # train images (relative to 'path') 4 images
val: E:\Desktop\new-yolov9\yolotest\images\val # val images (relative to 'path') 4 images
nc: 2
# class names
names: ['dog','cat']
三、YOLO环境配置教程
YOLOv9/YOLOv8/YOLOv7/YOLOv5环境都是通用的,只需要安装一次就行
1.pytorch环境安装
手把书安装教程链接参考:链接: link
2.其他依赖安装
安装requirements.txt文件的环境,需要注释掉下面两行,前面的步骤已经安装了,不注释的话会覆盖前面的会安装最新版本的pytorch,所以注释掉
手把书安装教程链接参考:链接: link
四、训练文件修改
在项目里找到train_dual.py文件,
1.在’–weights参数的defaut处设置为’weights/volov9-c.pt,
2.在’–cfg’参数的defaut处设置为’models/detect
yolov9-c.yam",
3.在’–data’参数的efault处设置为前面所创建的data.yam|文件的路径。
4.‘–hyp’参数可以默认
4.’–epochs’中的参数设置为100,表示需经过100轮训练。
5.'–batch-size’表示一次训练所抓取的数据样本数量,其大小影响训练速度和模型优化,此处将其参数设置为4,根据自己电脑性能设置大一些也是可以的
圈出来的参数是常用的参数,需要注意的是’–weights参数可以留空,就是不需要权重,从头训练,一般做科研改进工作时候可以不用预训练权重
device=‘cpu’,参数意思是:你电脑是GPU你就填0,CPU就填cpu,GPU是有英伟达显卡的电脑使用的,如果没有英伟达显卡训练非常慢,因为我电脑没有英伟达显卡,这里训练只用了几张数据集进行测试,你们也可以租云服务器训练,方法都是一样的,后期有空会出一起环境配置视频,我以前的作品也有环境配置教程的,你们可以翻一下看看
修改完直接鼠标右击运行就行
总结
YOLOv9训练自己数据集到此结束,后期出一期推理的教程,有问题可以留言,创作不易,请帮忙点个爱心呗,谢谢
下一篇: wifi基础(一):无线电波与WIFI信号干扰、衰减
本文标签
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。