欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > 深度学习每周学习总结Y2(Yolov5 使用自己的数据集进行训练 )

深度学习每周学习总结Y2(Yolov5 使用自己的数据集进行训练 )

2025/3/1 17:20:33 来源:https://blog.csdn.net/qq_33489955/article/details/145922006  浏览:    关键词:深度学习每周学习总结Y2(Yolov5 使用自己的数据集进行训练 )
  • 🍨 本文为🔗365天深度学习训练营 中的学习记录博客Y2中的内容

  • 🍖 原作者:K同学啊 | 接辅导、项目定制

  • ** 注意该训练营出现故意不退押金,恶意揣测偷懒用假的结果冒充真实打卡记录,在提出能够拿到视频录像证据后,仍然拉黑删除处理不沟通,并且学习资源也不对我开放。第一次报警后按照警方要求,继续沟通但仍然拉黑拒绝再次沟通。但是我有提前学习预习的习惯,学习资料有正常保存。目前据打卡结束还有一周,本篇为第12个月的第3篇学习,也是退押金活动的最后1篇学习。按照规则已经能够拿到押金退还,会照常打卡,打卡结束后(3月1日开始)如果仍旧没有拿到押金退还,将会继续通过一切法律手段维护作为消费者的合法权益。有相同经历者请与我联系。**

目录

    • 0.总结
    • 1. 初步建立数据文件夹
    • 2. 运行 split_train_val.py 文件
    • 3. 生成 train.txt、test.txt、val.txt 文件
    • 4. 创建 yolo02.yaml 文件
    • 5. 训练结果

上期内容:深度学习每周学习总结Y1(Yolov5 调用官方权重进行检测 )

0.总结

本期我们使用自己的数据进行训练,训练过程中遇到种种问题,但都有解决,现在已经可以正常跑起来了,值得注意的一点是,由于是新建的虚拟环境,cuda似乎没有利用起来,后续需要再研究一下。

YOLO(You Only Look Once)是一种非常流行的目标检测算法,用于从图像或视频中实时识别物体。与传统的目标检测方法不同,YOLO将目标检测任务转化为回归问题,在一个单独的神经网络中同时完成物体的定位和分类。因此,YOLO的主要特点是高效、实时,并且能够处理复杂的场景。

YOLO的工作流程如下:

  1. 图像分割:将输入图像分为多个网格。
  2. 边界框预测:每个网格预测一定数量的边界框,每个边界框包含物体的坐标、宽高以及该物体的类别概率。
  3. 目标分类与置信度:每个边界框会给出一个目标类别的概率,以及置信度分数,用来判断该框是否包含目标。

YOLO的版本更新迭代很快,最新的版本(如YOLOv5、YOLOv7等)对精度和速度进行了优化,并且提供了很多实际应用中可以直接使用的预训练模型。

对于初学者,以下是一些学习YOLO的步骤:

  1. 基础知识:学习一些基础的计算机视觉知识,如图像处理、卷积神经网络(CNN)等。
  2. 学习深度学习框架:YOLO是基于深度学习的,掌握一些深度学习框架(如TensorFlow、PyTorch)对于理解和使用YOLO非常重要。
  3. 阅读YOLO的论文:YOLO的创始人Joseph Redmon发布了YOLO的多篇论文,阅读这些论文可以帮助你更深入理解YOLO的工作原理。
  4. 动手实践:使用现有的YOLO模型进行实验,选择一些目标检测任务进行训练和优化。可以尝试使用开源的YOLO实现,如YOLOv5,它有详细的文档和示例,适合初学者。
  5. 调优和优化:在训练过程中尝试调节模型参数、使用不同的数据集以及进行模型评估和性能优化。

yolov5官方网站:https://github.com/ultralytics/yolov5

重要建议:

  • 如果你正在使用YOLOv5或YOLOv7,Python 3.7到3.10的版本是最为推荐的。

  • 在安装相关依赖时,可以创建一个虚拟环境,并确保Python版本与你的YOLO版本兼容,这样可以避免库冲突。

1. 初步建立数据文件夹

· 主目录. fruit_data(自己创建一个文件夹,将数据放到这里)· Annotations(放置我们的.xml文件). images(放置图片文件). lmageSets· Main(会在该文件夹内自动生成 train.txt、val.txt、test.txt 和 trainval.txt 四个文件,存放训练集、验证集、测试集图片的名字)

fruit_data初始有这两个文件夹(Annotations、images),其他都要我们自己创建并生成训练相关的文件
在这里插入图片描述
其中,Annotations、images文件夹内容分别如下:
在这里插入图片描述
在这里插入图片描述
在建立好 lmageSets文件夹 与下级空文件夹 Main后,我们进行下一步操作

2. 运行 split_train_val.py 文件

lmageSets文件夹下面有个Main子文件夹,其下面存放了 train.txt、val.txt、test.txt 和 trainval.txt四个文件,它们是通过 split_train_val.py 文件来生成的。

代码存放位置及代码如下:在这里插入图片描述
代码(代码执行是在vscode里):

# 导入必要的库
import os
import random
import argparse# 创建一个参数解析器
parser = argparse.ArgumentParser()# print(os.getcwd())  # 打印当前工作目录
# print(os.listdir())  # 打印当前目录下的文件和文件夹# 添加命令行参数,用于指定XML文件的路径,默认为 'Annotations' 文件夹
parser.add_argument('--xml_path', default=r'D:/DataAnalysis/jupyter_notebook_warehouse/pytorch_learn/yolov5-master/fruit_data/Annotations', type=str, help='input xml label path')# 添加命令行参数,用于指定输出txt标签文件的路径,默认为 'ImageSets/Main' 文件夹
parser.add_argument('--txt_path', default='D:/DataAnalysis/jupyter_notebook_warehouse/pytorch_learn/yolov5-master/fruit_data/ImageSets/Main', type=str, help='output txt label path')# 解析命令行参数
opt = parser.parse_args()# 定义训练验证集和测试集的划分比例
trainval_percent = 1.0  # 使用全部数据:表示使用所有数据来划分训练集和验证集(即没有丢弃任何数据)
train_percent = 0.9  # 训练集占训练验证集的90%:表示在训练验证集的基础上,将90%的数据用于训练集,剩下的10%用于验证集。# 训练验证集和测试集的划分比例示例
# 你可以调整 trainval_percent 和 train_percent 来控制训练集和验证集的划分。
# 例如,假设你想要70%的数据用于训练集,15%的数据用于验证集,15%的数据用于测试集,你可以这样调整
# trainval_percent = 0.85  # 训练验证集占比 85%
# train_percent = 0.8  # 训练集占训练验证集的 80%,即训练集占总数据的 68%# 设置XML文件夹的路径,根据命令行参数指定
xmlfilepath = opt.xml_path# 设置输出txt标签文件的路径,根据命令行参数指定
txtsavepath = opt.txt_path# 获取XML文件夹中的所有XML文件列表
total_xml = os.listdir(xmlfilepath)# 如果输出txt标签文件的文件夹不存在,创建它
if not os.path.exists(txtsavepath):os.makedirs(txtsavepath)# 获取XML文件的总数
num = len(total_xml)# 创建一个包含所有XML文件索引的列表
list_index = range(num)# 计算训练验证集的数量
tv = int(num * trainval_percent)# 计算训练集的数量
tr = int(tv * train_percent)# 从所有XML文件索引中随机选择出训练验证集的索引
trainval = random.sample(list_index, tv)# 从训练验证集的索引中随机选择出训练集的索引
train = random.sample(trainval, tr)# 打开要写入的训练验证集、测试集、训练集、验证集的txt文件
file_trainval = open(txtsavepath + '/trainval.txt', 'w')
file_test = open(txtsavepath + '/test.txt', 'w')
file_train = open(txtsavepath + '/train.txt', 'w')
file_val = open(txtsavepath + '/val.txt', 'w')# 遍历所有XML文件的索引
for i in list_index:name = total_xml[i][:-4] + '\n'  # 获取XML文件的名称(去掉后缀.xml),并添加换行符# 如果该索引在训练验证集中if i in trainval:file_trainval.write(name)  # 写入训练验证集txt文件if i in train:  # 如果该索引在训练集中file_train.write(name)  # 写入训练集txt文件else:file_val.write(name)  # 否则写入验证集txt文件else:file_test.write(name)  # 否则写入测试集txt文件# 关闭所有打开的文件
file_trainval.close()
file_train.close()
file_val.close()
file_test.close()

代码运行在这里插入图片描述
代码运行结果:在这里插入图片描述
对应文件已生成!运行后对应文件夹出现了四个文件

注:
关于更改训练验证集和测试集的比例,你可以调整 trainval_percent 和 train_percent 来控制训练集和验证集的划分。

例如,假设你想要70%的数据用于训练集,15%的数据用于验证集,15%的数据用于测试集,你可以这样调整:

trainval_percent = 0.85  # 训练验证集占比 85%
train_percent = 0.8  # 训练集占训练验证集的 80%,即训练集占总数据的 68%

3. 生成 train.txt、test.txt、val.txt 文件

需要运行的代码:voc_label.py,代码放置位置和 split_train_val.py 处于同一文件夹下
在这里插入图片描述
对应代码如下:

注意代码中需要申明数据集的类别名称,例如:classes = [“pineapple”, “snake fruit”, “dragon fruit”]

# -*- coding: utf-8 -*-
import xml.etree.ElementTree as ET
import os
from os import getcwd# 定义数据集的名称
sets = ['train', 'val', 'test']# 定义类别列表,这里有两个类别,可以根据需要添加更多类别
# classes = ["A", "B"]  # 请根据您的数据集修改这些类别名称
classes = ["pineapple", "snake fruit", "dragon fruit"]# 获取当前工作目录的绝对路径
abs_path = os.getcwd()
print(abs_path)# 定义一个函数,将边界框的坐标从绝对值转换为相对于图像大小的比例
def convert(size, box):dw = 1. / (size[0])  # 计算图像宽度的倒数dh = 1. / (size[1])  # 计算图像高度的倒数x = (box[0] + box[1]) / 2.0 - 1  # 计算中心点的x坐标y = (box[2] + box[3]) / 2.0 - 1  # 计算中心点的y坐标w = box[1] - box[0]  # 计算边界框的宽度h = box[3] - box[2]  # 计算边界框的高度x = x * dw  # 缩放x坐标w = w * dw  # 缩放宽度y = y * dh  # 缩放y坐标h = h * dh  # 缩放高度return x, y, w, h# 定义一个函数,将标注文件从XML格式转换为YOLO格式
def convert_annotation(image_id):in_file = open('D:/DataAnalysis/jupyter_notebook_warehouse/pytorch_learn/yolov5-master/fruit_data/Annotations/%s.xml' % (image_id), encoding='UTF-8')  # 打开XML标注文件out_file = open('D:/DataAnalysis/jupyter_notebook_warehouse/pytorch_learn/yolov5-master/fruit_data/labels/%s.txt' % (image_id), 'w')  # 打开要写入的YOLO格式标签文件tree = ET.parse(in_file)  # 解析XML文件root = tree.getroot()filename = root.find('filename').text  # 获取图像文件名filenameFormat = filename.split(".")[1]  # 获取文件格式size = root.find('size')  # 获取图像尺寸信息w = int(size.find('width').text)  # 获取图像宽度h = int(size.find('height').text)  # 获取图像高度for obj in root.iter('object'):difficult = obj.find('difficult').text  # 获取对象的难度标志cls = obj.find('name').text  # 获取对象的类别名称if cls not in classes or int(difficult) == 1:continuecls_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))b1, b2, b3, b4 = b# 标注越界修正if b2 > w:b2 = wif b4 > h:b4 = hb = (b1, b2, b3, b4)bb = convert((w, h), b)  # 调用convert函数,将边界框坐标转换为YOLO格式out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')  # 写入YOLO格式标签文件return filenameFormat# 获取当前工作目录
wd = getcwd()# 遍历每个数据集(train、val、test)
for image_set in sets:# 如果labels目录不存在,创建它if not os.path.exists('D:/DataAnalysis/jupyter_notebook_warehouse/pytorch_learn/yolov5-master/fruit_data/labels/'):os.makedirs('D:/DataAnalysis/jupyter_notebook_warehouse/pytorch_learn/yolov5-master/fruit_data/labels/')# 从数据集文件中获取图像ID列表image_ids = open('D:/DataAnalysis/jupyter_notebook_warehouse/pytorch_learn/yolov5-master/fruit_data/ImageSets/Main/%s.txt' % (image_set)).read().strip().split()# 打开要写入的文件,写入图像的文件路径和格式list_file = open('D:/DataAnalysis/jupyter_notebook_warehouse/pytorch_learn/yolov5-master/fruit_data/%s.txt' % (image_set), 'w')for image_id in image_ids:filenameFormat = convert_annotation(image_id)# list_file.write(abs_path + '/images/%s.%s\n' % (image_id, filenameFormat))  # 注意你的图片格式,如果是.jpg记得修改list_file.write('D:/DataAnalysis/jupyter_notebook_warehouse/pytorch_learn/yolov5-master/fruit_data/images/%s.%s\n' % (image_id, filenameFormat))list_file.close()

代码运行:
在这里插入图片描述
代码运行结果:
在这里插入图片描述
出现这四个文件,其中labels是标签数据,每个数据标签都由归一化的四个坐标构成在这里插入图片描述
在这里插入图片描述
train.txt、test.txt、val.txt 则存储了对应用于训练,测试,验证的图片路径,比如:在这里插入图片描述

4. 创建 yolo02.yaml 文件

这个文件名称可以自定义

放置路径如下:
在这里插入图片描述
对应代码:

注意代码中的路径,类别数量,类别名称需要改为自己的

#path: ../datasets/coco  # dataset root dir
train: ./fruit_data/train.txt  # train images (relative to 'path') 118287 images
val: ./fruit_data/val.txt  # train images (relative to 'path') 5000 images
#test: test-dev2017.txtnc: 3  # number of classesnames: ["pineapple", "snake fruit", "dragon fruit"] # 改成自己的类别

执行命令,我是在自己配置的环境里(anaconda prompt)运行该命令

python D:/DataAnalysis/jupyter_notebook_warehouse/pytorch_learn/yolov5-master/train.py --img 900 --batch 2 --epochs 100 --data D:/DataAnalysis/jupyter_notebook_warehouse/pytorch_learn/yolov5-master/data/yolo02.yaml --cfg D:/DataAnalysis/jupyter_notebook_warehouse/pytorch_learn/yolov5-master/models/yolov5s.yaml --weights weights/yolov5s.pt --device cpu

我这里cuda 没有配置好,如果有cuda 命令应该改为

python D:/DataAnalysis/jupyter_notebook_warehouse/pytorch_learn/yolov5-master/train.py --img 900 --batch 2 --epochs 100 --data D:/DataAnalysis/jupyter_notebook_warehouse/pytorch_learn/yolov5-master/data/yolo02.yaml --cfg D:/DataAnalysis/jupyter_notebook_warehouse/pytorch_learn/yolov5-master/models/yolov5s.yaml --weights weights/yolov5s.pt --device '0'

运行过程记录:在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我这里训练用时两个多小时,太慢了,所以最好把cuda配置好

5. 训练结果

根据上述结果保存路径,打开对应文件夹,其中部分结果展示
在这里插入图片描述

在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词