深度学习笔记_10YOLOv8系列自定义数据集实验

1、mydaya.yaml 配置方法

# 这里分别指向你训练、验证、测试的文件地址,只需要指向图片的文件夹即可。但是要注意图片和labels名称要对应
# 训练集、测试集、验证机文件路径,可以是分类好的TXT文件,也可以直接是图片文件夹路径
train:   # train images (relative to 'path') 128 images
val:  # val images (relative to 'path') 128 images
test: 

# 共有几个类别
nc : 1

# Classes
names: 
0: person
1: bicycle
2: car

2、配置数据集文件夹

2.1简易配置:

2.2细节配置:

mydata

…dataSet #之后会在Main文件夹内自动生成train.txt,val.txt,test.txt和trainval.txt四个文件,存放训练集、验证集、测试集图片的名字(无后缀.jpg)

…images # 存放图片

…labels # 存放图片对应的标签文件

…xml # 存放图片对应的xml文件

dataSet 文件夹下面存放训练集、验证集、测试集的划分,通过脚本生成,

可以创建一个split_train_val.py文件,代码内容如下:

import os  # 导入操作系统模块,用于文件路径操作
import random  # 导入随机数模块,用于随机抽样

# 设置训练验证数据集占总数据集的百分比
trainval_percent = 0.7
# 设置训练数据集占训练验证数据集的百分比
train_percent = 0.7
# 存储XML文件的文件夹路径
xmlfilepath = 'dataset/data/xml'
# 存储训练验证数据集和测试数据集的路径
txtsavepath = 'dataset/data/dataSet'
# 获取XML文件夹下所有文件的文件名列表
total_xml = os.listdir(xmlfilepath)

# 获取XML文件的总数
num = len(total_xml)
# 生成从0到num-1的列表
list = range(num)
# 计算训练验证数据集的数量
tv = int(num * trainval_percent)
# 计算训练数据集的数量
tr = int(tv * train_percent)
# 从列表中随机抽取tv个元素作为训练验证数据集的索引
trainval = random.sample(list, tv)
# 从训练验证数据集的索引中随机抽取tr个元素作为训练数据集的索引
train = random.sample(trainval, tr)

# 打开训练验证数据集、测试数据集、训练数据集和验证数据集的文件,准备写入数据
ftrainval = open('dataset/data/dataSet/trainval.txt', 'w')
ftest = open('dataset/data/dataSet/test.txt', 'w')
ftrain = open('dataset/data/dataSet/train.txt', 'w')
fval = open('dataset/data/dataSet/val.txt', 'w')

# 遍历总的XML文件列表
for i in list:
    # 获取当前XML文件的文件名,并去除文件扩展名
    name = total_xml[i][:-4] + '\n'
    # 判断当前文件索引是否在训练验证数据集中
    if i in trainval:
        # 将文件名写入训练验证数据集文件
        ftrainval.write(name)
        # 如果当前文件索引在训练数据集中
        if i in train:
            # 将文件名写入训练数据集文件
            ftrain.write(name)
        else:
            # 否则将文件名写入验证数据集文件
            fval.write(name)
    else:
        # 如果当前文件索引不在训练验证数据集中,则将文件名写入测试数据集文件
        ftest.write(name)

# 关闭所有文件
ftrainval.close()
ftrain.close()
fval.close()
ftest.close()

创建voc_label.py文件,将训练集、验证集、测试集生成label标签(训练中要用到),同时将数据集路径导入txt文件中,代码内容如下: 

# -*- coding: utf-8 -*-
# xml解析包
import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join


sets = ['train', 'test', 'val']
classes = ['E2', 'J20', 'B2', 'F14', 'Tornado', 'F4', 'B52', 'JAS39','Mirage2000']


# 进行归一化操作
def convert(size, box): # size:(原图w,原图h) , box:(xmin,xmax,ymin,ymax)
    dw = 1./size[0]     # 1/w
    dh = 1./size[1]     # 1/h
    x = (box[0] + box[1])/2.0   # 物体在图中的中心点x坐标
    y = (box[2] + box[3])/2.0   # 物体在图中的中心点y坐标
    w = box[1] - box[0]         # 物体实际像素宽度
    h = box[3] - box[2]         # 物体实际像素高度
    x = x*dw    # 物体中心点x的坐标比(相当于 x/原图w)
    w = w*dw    # 物体宽度的宽度比(相当于 w/原图w)
    y = y*dh    # 物体中心点y的坐标比(相当于 y/原图h)
    h = h*dh    # 物体宽度的宽度比(相当于 h/原图h)
    return (x, y, w, h)    # 返回 相对于原图的物体中心点的x坐标比,y坐标比,宽度比,高度比,取值范围[0-1]


# year ='2012', 对应图片的id(文件名)
def convert_annotation(image_id):
    '''
    将对应文件名的xml文件转化为label文件,xml文件包含了对应的bunding框以及图片长款大小等信息,
    通过对其解析,然后进行归一化最终读到label文件中去,也就是说
    一张图片文件对应一个xml文件,然后通过解析和归一化,能够将对应的信息保存到唯一一个label文件中去
    一张图片文件对应一个xml文件,然后通过解析和归一化,能够将对应的信息保存到唯一一个label文件中去
    labal文件中的格式:calss x y w h  同时,一张图片对应的类别有多个,所以对应的bunding的信息也有多个
    '''
    # 对应的通过year 找到相应的文件夹,并且打开相应image_id的xml文件,其对应bund文件
    in_file = open('/home/featurize/work/yolov5-master/data/mydata/xml/%s.xml' % (image_id), encoding='utf-8')
    # 准备在对应的image_id 中写入对应的label,分别为
    # <object-class> <x> <y> <width> <height>
    out_file = open('/home/featurize/work/yolov5-master/data/mydata/labels/%s.txt' % (image_id), 'w', encoding='utf-8')
    # 解析xml文件
    tree = ET.parse(in_file)
    # 获得对应的键值对
    root = tree.getroot()
    # 获得图片的尺寸大小
    size = root.find('size')
    # 如果xml内的标记为空,增加判断条件
    if size != None:
        # 获得宽
        w = int(size.find('width').text)
        # 获得高
        h = int(size.find('height').text)
        # 遍历目标obj
        # 遍历目标obj
        for obj in root.iter('object'):
            # 获得difficult
            difficult_obj = obj.find('difficult')
            difficult = difficult_obj.text if difficult_obj is not None else '0'
            # 获得类别 =string 类型
            cls = obj.find('name').text
            # 如果类别不是对应在我们预定好的class文件中,或difficult==1则跳过
            if cls not in classes or int(difficult) == 1:
                continue
            # 通过类别名称找到id
            cls_id = classes.index(cls)
            # 找到bndbox 对象
            xmlbox = obj.find('bndbox')
            # 获取对应的bndbox的数组 = ['xmin','xmax','ymin','ymax']
            b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
                 float(xmlbox.find('ymax').text))
            print(image_id, cls, b)
            # 带入进行归一化操作
            # w = 宽, h = 高, b= bndbox的数组 = ['xmin','xmax','ymin','ymax']
            bb = convert((w, h), b)
            # bb 对应的是归一化后的(x,y,w,h)
            # 生成 calss x y w h 在label文件中
            out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')


# 返回当前工作目录
wd = getcwd()
print(wd)


for image_set in sets:
    '''
    对所有的文件数据集进行遍历
    做了两个工作:
    1.将所有图片文件都遍历一遍,并且将其所有的全路径都写在对应的txt文件中去,方便定位
    2.同时对所有的图片文件进行解析和转化,将其对应的bundingbox 以及类别的信息全部解析写到label 文件中去
         最后再通过直接读取文件,就能找到对应的label 信息
    '''
    # 先找labels文件夹如果不存在则创建
    if not os.path.exists('/home/featurize/work/yolov5-master/data/mydata/labels'):
        os.makedirs('/home/featurize/work/yolov5-master/data/mydata/labels')
    # 读取在ImageSets/Main 中的train、test..等文件的内容
    # 包含对应的文件名称
    image_ids = open('/home/featurize/work/yolov5-master/data/mydata/dataSet/%s.txt' % (image_set)).read().strip().split()
    # 打开对应的2012_train.txt 文件对其进行写入准备
    list_file = open('/home/featurize/work/yolov5-master/data/mydata/%s.txt' % (image_set), 'w')
    # 将对应的文件_id以及全路径写进去并换行
    for image_id in image_ids:
        list_file.write('/home/featurize/work/yolov5-master/data/mydata/images/%s.jpg\n' % (image_id))
        # 调用  year = 年份  image_id = 对应的文件名_id
        convert_annotation(image_id)
    # 关闭文件
    list_file.close()

# os.system(‘comand’) 会执行括号中的命令,如果命令成功执行,这条语句返回0,否则返回1
# os.system("cat 2007_train.txt 2007_val.txt 2012_train.txt 2012_val.txt > train.txt")
# os.system("cat 2007_train.txt 2007_val.txt 2007_test.txt 2012_train.txt 2012_val.txt > train.all.txt")

3、选择模型

在ultralytics/models/v8/目录下是模型的配置文件,随着架构的增大,训练时间也是逐渐增大,只用修改一个参数,把nc改成自己的类别数,需要取整。

4、下载预训练模型

Releases · ultralytics/assets (github.com)

5、训练模型

yolo task=detect mode=train model=yolov8.yaml data=mydata.yaml epochs=200 batch=16  pretrained=yolov8n.pt

 训练参数说明:

参数默认值描述设置建议
modelNone模型文件路径,如 yolov8n.pt, yolov8n.yaml根据需要选择合适的预训练模型文件
dataNone数据文件路径,如 coco128.yaml选择合适的数据集配置文件
epochs100训练的周期数根据数据集大小和模型复杂度调整
timeNone训练时间(小时),如果提供,将覆盖epochs参数根据实际训练时间需求设置
patience50早停的周期数,等待无显著改进的周期数根据模型训练动态调整
batch16每个批次的图像数量根据硬件资源调整
imgsz640输入图像的尺寸根据硬件和模型性能要求调整
saveTrue是否保存训练检查点和预测结果通常保持默认
save_period-1每x周期保存检查点,如果<1则禁用根据需要设置
cacheFalse是否使用数据加载缓存,选项:True/ram, disk 或 False根据硬件资源和数据集大小决定
deviceNone运行设备,如 cuda device=0 或 device=cpu根据可用的硬件资源设置
workers8数据加载的工作线程数根据系统资源调整
projectNone项目名称根据需要自定义
nameNone实验名称自定义实验名以便识别
exist_okFalse是否覆盖现有实验如果需要重复实验,设置为True
pretrainedTrue是否使用预训练模型通常对于新的训练任务保持True
optimizer'auto'优化器,可选项:SGD, Adam等根据模型和数据集特性选择合适的优化器
verboseFalse是否打印详细输出开发和调试时可设为True
seed0重现性的随机种子需要重现结果时设置确定值
deterministicTrue是否启用确定性模式需要确保结果一致性时设置为True
single_clsFalse是否将多类数据作为单类训练特定应用场景下调整
rectFalse矩形训练,每个批次为最小填充特定应用场景下调整
cos_lrFalse是否使用余弦学习率调度器根据训练策略调整
close_mosaic10关闭马赛克增强的最后周期数根据训练需求调整
resumeFalse从最后检查点恢复训练需要从中断的训练继续时设置为True
ampTrue是否使用自动混合精度训练根据硬件支持选择
fraction1.0训练的数据集比例如需使用数据集的子集进行训练,调整此值
profileFalse训练期间记录ONNX和TensorRT速度性能分析时启用
freezeNone冻结训练期间的前n层或特定层特定模型调整时使用
lr00.01初始学习率根据模型和数据集特性调整
lrf0.01最终学习率根据训练策略调整
momentum0.937SGD动量/Adam beta1根据优化器类型调整
weight_decay0.0005优化器权重衰减通常保持默认值
warmup_epochs3.0热身周期数根据模型特性调整
warmup_momentum0.8热身初始动量根据训练策略调整
warmup_bias_lr0.1热身初始偏置学习率根据训练策略调整
box7.5盒子损失增益根据模型特性和训练数据调整
cls0.5类别损失增益根据分类任务的复杂性调整
dfl1.5DFL损失增益根据具体应用调整
pose12.0姿态损失增益(仅限姿态)仅在姿态检测任务中使用
kobj2.0关键点目标损失增益(仅限姿态)仅在姿态检测任务中使用
label_smoothing0.0标签平滑(比例)根据训练策略调整
nbs64标称批量大小根据硬件资源调整
overlap_maskTrue掩码在训练期间是否重叠(仅限分割训练)仅在分割任务中使用
mask_ratio4掩码下采样比例(仅限分割训练)仅在分割任务中使用
dropout0.0使用dropout正则化(仅限分类训练)仅在分类任务中使用
valTrue训练期间进行验证/测试通常保持默认
plotsFalse训练/验证期间保存图表和图像需要可视化训练过程时设置为True

6、labels.txt 文件数据说明

使用YOLOv8进行目标检测时,每个图像通常都伴随一个.txt文件,该文件包含了关于图像中对象的标注信息。这些.txt文件中的每一行都代表图像中的一个对象,包含以下信息:

类别ID:这是一个整数,代表了对象所属的类别。例如,如果你的数据集有“人”、“车”和“狗”三个类别,那么可能分别用0、1和2来表示这些类别。

中心X坐标:这是一个归一化后的值,代表对象边界框中心的X坐标(水平方向)。这个值是相对于整个图像宽度的比例。

中心Y坐标:这是一个归一化后的值,代表对象边界框中心的Y坐标(垂直方向)。这个值是相对于整个图像高度的比例。

边界框宽度:这也是一个归一化后的值,代表对象边界框的宽度。这个值是相对于整个图像宽度的比例。

边界框高度:这同样是一个归一化值,代表对象边界框的高度。这个值是相对于整个图像高度的比例。

7、训练结果文件说明

以乳腺癌目标检测结果为例:

best.pt:损失值最小的模型文件
last.pt:训练到最后的模型文件


args.yaml:模型训练的配置参数

confusion_matrix.png - 混淆矩阵
        这张图展示了分类模型的性能。每一行代表模型预测的类别,每一列代表实际的类别。对角线上的数值表示模型正确预测的数量。对角线上较深的颜色表示该类别预测正确的数量较多。

confusion_matrix_normalized.png - 标准化混淆矩阵:
        与普通混淆矩阵类似,但这里的值显示的是每个类别的预测正确比例。这有助于比较不同类别的预测准确性,尤其是在类别样本数量不平衡的情况下。

F1_curve.png - F1-置信度曲线
        此曲线显示了F1得分随着置信度阈值的变化。F1得分是精确度和召回率的调和平均值,曲线的峰值表示给定置信度阈值下精确度和召回率的最佳平衡点。

labels.jpg - 标签分布图和边界框分布图
        柱状图显示了不同类别的实例分布数量。散点图则展示了目标检测任务中边界框的空间分布情况,反映了常见的尺寸和长宽比。

labels_correlogram.jpg - 标签相关图
        相关图提供了不同类别标签之间的关系,以及它们在图像中位置的相关性。这有助于理解模型在识别不同类别时可能出现的关联或混淆。

P_curve.png - 精确度-置信度曲线
        这张曲线图展示了模型预测的精确度随着置信度阈值的变化。精确度是模型预测正确正例与预测为正例总数的比值。

PR_curve.png - 精确度-召回曲线
        这张曲线图展示了模型的精确度与召回率之间的关系。理想情况下,模型应在精确度和召回率之间保持良好的平衡。

R_curve.png - 召回-置信度曲线
        此曲线图显示了模型的召回率随置信度阈值的变化。召回率是模型正确预测的正例与实际正例总数的比值。

results.png 和 results.csv - 训练结果图表和数据


        这些图表和数据文件展示了模型在训练过程中的性能变化,包括损失函数的变化和评估指标(如精确度、召回率和mAP)的变化。

参考博客:

超详细YOLOv8目标检测全程概述:环境、训练、验证与预测详解_yolov8目标检测流程-CSDN博客

一文了解YOLOv8(附带各种任务详细说明链接):计算机视觉领域的新星_yolov8官方文档解读-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Litedram仿真验证(四):AXI接口完成板级DDR3读写测试(FPGA-Artix7)

目录 日常唠嗑一、仿真中遗留的问题二、板级测试三、工程获取及交流 日常唠嗑 接上一篇Litedram仿真验证&#xff08;三&#xff09;&#xff1a;AXI接口完成仿真&#xff08;FPGA/Modelsim&#xff09;之后&#xff0c;本篇对仿真后的工程进行板级验证。 本次板级验证用到的开…

学成在线 - 第3章任务补偿机制实现 + 分块文件清理

7.9 额外实现 7.9.1 任务补偿机制 问题&#xff1a;如果有线程抢占了某个视频的处理任务&#xff0c;如果线程处理过程中挂掉了&#xff0c;该视频的状态将会一直是处理中&#xff0c;其它线程将无法处理&#xff0c;这个问题需要用补偿机制。 单独启动一个任务找到待处理任…

Layer1 公链竞争破局者:Sui 生态的全面创新之路

随着 Sui 生态逐渐在全球范围内树立起声望&#xff0c;并通过与 Revolut 等前沿金融科技平台合作&#xff0c;推广区块链教育与应用&#xff0c;Sui 生态的未来发展方向已成为业界瞩目的焦点。如今&#xff0c;Sui 的总锁定价值已攀升至 5.93 亿美元&#xff0c;充分展示了其在…

分布式架构的演技进过程

最近看了一篇文章,觉得讲的挺不错,就借机给大家分享一下。 早期应用:早期的应用比较简单,访问人数有限,大部分的开发单机就能完成。 分离模型:在业务发展后,用户数量逐步上升,服务器的性能出现瓶颈;就需要将应用和数据分开存储,避免相互抢占资源。 缓存模式:随着系…

历代著名画家作品赏析-东晋顾恺之

中国历史朝代顺序为&#xff1a;夏朝、商朝、西周、东周、秦朝、西楚、西汉、新朝、玄汉、东汉、三国、曹魏、蜀汉、孙吴、西晋、东晋、十六国、南朝、刘宋、南齐、南梁、南陈、北朝、北魏、东魏、北齐、西魏、北周、隋&#xff0c;唐宋元明清&#xff0c;近代。 一、东晋著名…

现身说法暑期三下乡社会实践团一个好的投稿方法胜似千军万马

作为一名在校大学生,去年夏天我有幸参与了学院组织的暑期大学生三下乡社会实践活动,这段经历不仅让我深入基层,体验了不一样的生活,更是在新闻投稿的实践中,经历了一次从传统到智能的跨越。回忆起那段时光,从最初的邮箱投稿困境,到后来智慧软文发布系统的高效运用,每一步都刻印…

顺序栈的操作

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd;既然选择了远方&#xff0c;当不负青春…

什么是DDoS攻击?DDoS攻击的原理是什么?

一、DDoS攻击概念 DDoS攻击又叫“分布式拒绝服务”(Distributed DenialofService)攻击&#xff0c;它是一种通过控制大量计算机、物联网终端或网络僵尸&#xff08;Zombie&#xff09;来向目标网站发送大量请求&#xff0c;从而耗尽其服务器资源&#xff0c;导致正常用户无法访…

WEB基础--JDBC操作数据库

使用JDBC操作数据库 使用JDBC查询数据 五部曲&#xff1a;建立驱动&#xff0c;建立连接&#xff0c;获取SQL语句&#xff0c;执行SQL语句&#xff0c;释放资源 建立驱动 //1.加载驱动Class.forName("com.mysql.cj.jdbc.Driver"); 建立连接 //2.连接数据库 Stri…

【3dmax笔记】026:挤出和壳修改器的使用

文章目录 一、修改器二、挤出三、壳 一、修改器 3ds Max中的修改器是一种强大的工具&#xff0c;用于创建和修改复杂的几何形状。这些修改器可以改变对象的形状、大小、方向和位置&#xff0c;以生成所需的效果。以下是一些常见的3ds Max修改器及其功能&#xff1a; 挤出修改…

Google Earth Engine谷歌地球引擎计算遥感影像在每个8天间隔内的多年平均值

本文介绍在谷歌地球引擎&#xff08;Google Earth Engine&#xff0c;GEE&#xff09;中&#xff0c;求取多年时间中&#xff0c;遥感影像在每1个8天时间间隔内的多年平均值的方法。 本文是谷歌地球引擎&#xff08;Google Earth Engine&#xff0c;GEE&#xff09;系列教学文章…

神经网络案例实战

&#x1f50e;我们通过一个案例详细使用PyTorch实战 &#xff0c;案例背景&#xff1a;你创办了一家手机公司&#xff0c;不知道如何估算手机产品的价格。为了解决这个问题&#xff0c;收集了多家公司的手机销售数据&#xff1a;这些数据维度可以包括RAM、存储容量、屏幕尺寸、…

JavaScript数字分隔符

● 如果现在我们用一个很大的数字&#xff0c;例如2300000000&#xff0c;这样真的不便于我们进行阅读&#xff0c;我们希望用千位分隔符来隔开它&#xff0c;例如230,000,000; ● 下面我们使用_当作分隔符来尝试一下 const diameter 287_266_000_000; console.log(diameter)…

论文分享[cvpr2018]Non-local Neural Networks非局部神经网络

论文 https://arxiv.org/abs/1711.07971 代码https://github.com/facebookresearch/video-nonlocal-net 非局部神经网络 motivation:受计算机视觉中经典的非局部均值方法[4]的启发&#xff0c;非局部操作将位置的响应计算为所有位置的特征的加权和。 非局部均值方法 NLM&#…

Python实现Chiikawa

写在前面 哈&#xff1f;呀哈&#xff01;本期小编给大家素描版Chiikawa&#xff01; 主人公当然是我们可爱的吉伊、小八以及乌萨奇啦~ Chiikawa小小可爱 《Chiikawa》是一部来自日本的超萌治愈系漫画与动画作品&#xff0c;由作者秋田祯信创作。"Chiikawa"这个名字…

【Kolmogorov-Arnold网络 替代多层感知机MLPs】KAN: Kolmogorov-Arnold Networks

KAN: Kolmogorov-Arnold Networks 论文地址 代码地址 知乎上的讨论&#xff08;看一下评论区更正&#xff09; Abstract Inspired by the Kolmogorov-Arnold representation theorem, we propose Kolmogorov-Arnold Networks (KANs) as promising alternatives to Multi-Layer…

支持LLM的Markdown笔记;ComfyUI-HiDiffusion图片生成和对图像进行高质量编辑

✨ 1: ComfyUI-HiDiffusion ComfyUI-HiDiffusion是一个为HiDiffusion技术使用而定制的节点。HiDiffusion技术是专门用于在计算机视觉和图像处理中生成和改进图片质量的先进算法。该技术通常应用于图像的超分辨率、去噪、风格转换等方面。 ComfyUI-HiDiffusion的主要特点包含提…

Julia 语言环境安装与使用

1、Julia 语言环境安装 安装教程&#xff1a;https://www.runoob.com/julia/julia-environment.html Julia 安装包下载地址为&#xff1a;https://julialang.org/downloads/。 安装步骤&#xff1a;注意&#xff08;勾选 Add Julia To PATH 自动将 Julia 添加到环境变量&…

(五)JSP教程——response对象

response对象主要用于动态响应客户端请求&#xff08;request&#xff09;&#xff0c;然后将JSP处理后的结果返回给客户端浏览器。JSP容器根据客户端的请求建立一个默认的response对象&#xff0c;然后使用response对象动态地创建Web页面、改变HTTP标头、返回服务器端地状态码…

C++string续

一.find_first_of与find 相同&#xff1a;都是从string里面找字符&#xff0c;传参格式一样(都可以从某个位置开始找) 不同&#xff1a;find_first_of只能找字符&#xff0c;find可以找字符串 find_first_of参数里面的string与char*是每个字符的集合&#xff0c;指找出string…
最新文章