文章目录
一、参数解析
文件位置在/ultics/cfg/default.yaml
这段配置文件用于 Ultralytics YOLO 模型的训练、验证、预测和导出等操作。以下是每个参数的作用及其用途:
task: detect # 指定YOLO的任务类型,如检测(detect)、分割(segment)、分类(classify)、姿态(pose)等
mode: train # 指定当前模式,比如训练(train)、验证(val)、预测(predict)、导出(export)、跟踪(track)、基准测试(benchmark)等。
# -------------------------------------------
# 训练设置
# -------------------------------------------
model: # 指定模型文件的路径,如 yolov8n.pt 或自定义模型配置文件的路径
data: # 数据文件的路径,如 coco128.yaml,包含训练和验证数据集的配置。
epochs: 100 # 训练的总 epoch 数,即模型将进行多少轮训练。
time: # 指定训练的总时间(小时),如果设置了这个值,会覆盖 epochs 的设置。
patience: 100 # EarlyStopping 的耐心值,即在训练过程中如果验证集上的表现没有改善,最多等待多少 epoch 后停止训练。
batch: 16 # 每个批次的图像数量,-1 表示自动调整批次大小。
imgsz: 640 # 输入图像的尺寸,训练和验证模式下的图像大小。可以是单一整数(宽高相同)或列表(宽高不同)。
save: True # 是否保存训练检查点和预测结果。
save_period: -1 # 每隔多少 epoch 保存一次检查点,-1 表示禁用定期保存。
val_period: 1 # 每隔多少 epoch 进行一次验证。
cache: False # 数据加载时是否使用缓存。True 表示使用内存缓存,disk 表示使用磁盘缓存,False 表示不使用缓存。
device: # 指定设备,如 cuda:0(第一个 GPU)、cpu(CPU)等。
workers: 8 # 数据加载时的工作线程数量(每个分布式训练进程的线程数)。
project: # 项目名称,用于存储实验结果的文件夹名。
name: # 实验名称,结果将保存在 project/name 目录下。
exist_ok: False # 是否覆盖已存在的实验目录。
pretrained: True # 是否使用预训练模型。True 表示使用默认的预训练模型,False 表示不使用,或者可以指定一个自定义模型路径。
optimizer: auto # 优化器类型,自动选择优化器,或指定如 SGD、Adam、AdamW 等。
verbose: True # 是否打印详细输出信息。
seed: 0 # 随机种子,用于确保结果的可重复性。
deterministic: True # 是否启用确定性模式,确保结果一致。
single_cls: False # 是否将多类数据当作单一类别进行训练。
rect: False # 是否使用余弦学习率调度器。
cos_lr: False # (bool) use cosine learning rate scheduler
close_mosaic: 10 # 在训练的最后多少 epoch 禁用 mosaic 数据增强,0 表示禁用 mosaic 数据增强。
resume: False # 是否从上一个检查点恢复训练。
amp: True # 是否使用自动混合精度训练(AMP),可以加速训练并减少内存使用。
fraction: 1.0 # 训练数据集的比例,1.0 表示使用所有训练图像。
profile: False # 是否在训练期间对 ONNX 和 TensorRT 的速度进行分析。
freeze: None # 冻结前 n 层或指定层的索引,使其在训练中不更新。
multi_scale: False # 是否在训练中使用多尺度数据增强。
# -------------------------------------------
# 分割设置
# -------------------------------------------
overlap_mask: True # 是否在训练中允许掩膜重叠(仅适用于分割任务)。
mask_ratio: 4 # 掩膜下采样比率(仅适用于分割任务)。
# -------------------------------------------
# 分类设置
# -------------------------------------------
dropout: 0.0 # 是否在分类训练中使用 dropout 正则化。
# -------------------------------------------
# 验证/测试设置
# -------------------------------------------
val: True # 是否在训练期间进行验证或测试。
split: val # 用于验证的数据集划分类型,如 val、test 或 train。
save_json: False # 是否将结果保存到 JSON 文件中。
save_hybrid: False # 是否保存混合版本的标签(标签 + 额外的预测)。
conf: # 对于检测任务的对象置信度阈值。
iou: 0.7 # NMS(非极大值抑制)的 IoU 阈值
max_det: 300 # 每张图像的最大检测数。
half: False # 是否使用半精度(FP16)。
dnn: False # 是否使用 OpenCV DNN 进行 ONNX 推理。
plots: True # 是否保存训练/验证过程中的图表和图像。
# -------------------------------------------
# 预测设置
# -------------------------------------------
source: # 指定图像或视频的源目录
vid_stride: 1 # 视频的帧率步幅
stream_buffer: False # 是否缓冲所有流媒体帧(True)或返回最新的帧(False)。
visualize: False # 是否可视化模型特征。
augment: False # 是否对预测源应用图像增强
agnostic_nms: False # 是否使用类无关的 NMS。
classes: # 指定要过滤的类别
retina_masks: False # 是否使用高分辨率分割掩膜。
embed: # 回指定层的特征向量/嵌入。
# -------------------------------------------
# 可视化设置
# -------------------------------------------
show: False # 是否显示预测的图像和视频(如果环境允许)
save_frames: False # 是否保存预测的单个视频帧
save_txt: False # 是否将结果保存为 .txt 文件
save_conf: False # 是否保存结果的置信度分数
save_crop: False # 是否保存裁剪后的图像及其结果
show_labels: True # 是否显示预测标签,如 person
show_conf: True # 是否显示预测置信度,如 0.99
show_boxes: True # 是否显示预测边界框
line_width: # 指定边界框的线宽。如果为 None,则根据图像大小缩放
# -------------------------------------------
# 导出设置
# -------------------------------------------
format: torchscript # 导出格式,可以是 torchscript、onnx、coreml 等。
keras: False # 是否使用 Keras 进行导出
optimize: False # 对 TorchScript 模型进行移动端优化
int8: False # 对 CoreML/TF 进行 INT8 量化
dynamic: False # 对 ONNX/TF/TensorRT 使用动态轴
simplify: False # 是否简化 ONNX 模型
opset: # 指定 ONNX 操作集版本
workspace: 4 # TensorRT 的工作区大小(GB)
nms: False # 对 CoreML 添加 NMS
# 超参数--------------------------------
lr0: 0.01 # 初始学习率。决定了模型参数在每次更新时的步长。较大的学习率可能导致训练不稳定,较小的学习率则可能导致收敛速度慢。
lrf: 0.01 # 最终学习率(lr0 * lrf)。学习率衰减系数,通常在训练过程中逐渐减少学习率,以帮助模型在训练的后期更稳定地收敛。
momentum: 0.937 # 动量(用于 SGD 优化器)或 Adam 优化器的 beta1。动量帮助加速收敛,并减少训练过程中的振荡。
weight_decay: 0.0005 # 权重衰减(L2 正则化)。防止过拟合,增加模型的泛化能力
warmup_epochs: 3.0 # 预热阶段的 epoch 数。在训练开始时使用较小的学习率逐渐增大,有助于提高模型的稳定性。
warmup_momentum: 0.8 # 预热阶段的初始动量。动量在预热阶段的值,帮助训练初期更平稳。
warmup_bias_lr: 0.1 # 预热阶段的初始偏置学习率。对偏置项的学习率进行预热处理。
box: 7.5 # 边界框损失的权重系数。调整边界框损失在总损失中的权重。
cls: 0.5 # 类别损失的权重系数。调整类别损失在总损失中的权重。
dfl: 1.5 # DFL(Distribution Focal Loss)损失的权重系数。用于目标检测中的分布焦点损失。
pose: 12.0 # 姿态损失的权重系数(仅适用于姿态估计任务)
kobj: 1.0 # 关键点对象损失的权重系数。调整关键点检测中的损失权重。
label_smoothing: 0.0 # 标签平滑系数。减少模型对训练数据的过拟合,通过平滑标签来提高模型的泛化能力。
nbs: 64 # 理想的批次大小。用于参考,以便根据 GPU 内存自动调整批次大小。
# -------------------------------------------
# 数据增强设置
# -------------------------------------------
hsv_h: 0.015 # HSV 色调的增强比例。对图像进行色调调整的范围
hsv_s: 0.7 # HSV 饱和度的增强比例。对图像进行饱和度调整的范围
hsv_v: 0.4 # HSV 亮度的增强比例。对图像进行亮度调整的范围
degrees: 0.0 # 图像旋转角度范围。定义图像旋转的最大角度
translate: 0.1 # 图像平移范围。图像的最大平移比例
scale: 0.5 # 图像缩放范围。定义图像缩放的比例
shear: 0.0 # 图像剪切范围。图像剪切的最大角度
perspective: 0.0 # 图像透视变换范围。图像的透视变换比例,范围是 0 到 0.001
flipud: 0.0 # 图像上下翻转的概率。0.0 表示不进行上下翻转
fliplr: 0.5 # 图像左右翻转的概率。0.5 表示有 50% 的概率进行左右翻转。
bgr: 0.0 # 图像通道 BGR 的概率。0.0 表示不进行 BGR 通道转换。
mosaic: 1.0 # Mosaic 数据增强的概率。1.0 表示总是进行 Mosaic 数据增强
mixup: 0.0 # 图像 mixup 的概率。0.0 表示不使用 mixup 数据增强
copy_paste: 0.0 # 图像 copy-paste 的概率。0.0 表示不使用 copy-paste 数据增强
auto_augment: randaugment # 自动数据增强策略。randaugment、autoaugment 或 augmix 等。
erasing: 0.4 # 随机擦除的概率。用于分类训练中,增强数据的多样性。
crop_fraction: 1.0 # 分类评估/推理中的图像裁剪比例。1.0 表示使用完整图像。
cfg: # 自定义配置文件路径。用于覆盖默认的 defaults.yaml 配置。
tracker: botsort.yaml # 跟踪器类型。选择不同的跟踪器配置文件,如 botsort.yaml 或 bytetrack.yaml。
二、自定义训练集
2.1(检测)
自定义训练集为VOC格式。
如下所示:
- images
1.jpg - Annotations
1.xml
2.2 分类
分类数据集的摆放如下所示:
- train 比例一般为80%
class1(图片文件夹)
class2
class3 - val
class1(图片文件夹)
class2
class3
三、训练之前的准备操作
3.1 检测的准备
1 在yolov8文件夹中新建data文件夹,在data文件夹下放置
- images (VOC的图片)
- Annotations(VOC的标注文件)
- ImageSets
- lables
2 在YOLOv8文件夹下执行splitDataset.py
代码如下:
import os
import random
trainval_percent = 0.99
train_percent = 0.99
xmlfilepath = 'data/Annotations'
txtsavepath = 'data/ImageSets'
total_xml = os.listdir(xmlfilepath)
num = len(total_xml)
list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list, tv)
train = random.sample(trainval, tr)
ftrainval = open('data/ImageSets/trainval.txt', 'w')
ftest = open('data/ImageSets/test.txt', 'w')
ftrain = open('data/ImageSets/train.txt', 'w')
fval = open('data/ImageSets/val.txt', 'w')
for i in list:
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()
3 再执行XML2TXT.py
代码如下:
# -*- 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 = ["canjiao", "shaoxi", "duoxi", "duojiao", "shaojiao", "lianjiao", "pinayi", "yiwu", "lianxi", "wugaiban", "OK", "blackyiwu"]
# classes = ["ok", "YiWu", "CanLiu", "ShaoJian", "BianXing", "PaoMianTiePian", "PaoMianLouTie"]
# classes = ["OK", "NG"]
# 进行归一化操作
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文件中去
labal文件中的格式:calss x y w h 同时,一张图片对应的类别有多个,所以对应的bunding的信息也有多个
'''
print(image_id)
# 对应的通过year 找到相应的文件夹,并且打开相应image_id的xml文件,其对应bund文件
in_file = open('data/Annotations/%s.xml' % (image_id), encoding='utf-8')
# 准备在对应的image_id 中写入对应的label,分别为
# <object-class> <x> <y> <width> <height>
out_file = open('data/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
for obj in root.iter('object'):
# 获得difficult ??
difficult = obj.find('difficult').text
# 获得类别 =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)
# 支持的图片格式
supported_image_formats = ['.jpg', '.jpeg']
for image_set in sets:
'''
对所有的文件数据集进行遍历
做了两个工作:
1.将所有图片文件都遍历一遍,并且将其所有的全路径都写在对应的txt文件中去,方便定位
2.同时对所有的图片文件进行解析和转化,将其对应的bundingbox 以及类别的信息全部解析写到label 文件中去
最后再通过直接读取文件,就能找到对应的label 信息
'''
# 先找labels文件夹如果不存在则创建
if not os.path.exists('data/labels/'):
os.makedirs('data/labels/')
# 读取在ImageSets/Main 中的train、test..等文件的内容
# 包含对应的文件名称
# image_ids = open('data/ImageSets/%s.txt' % (image_set)).read().strip().split()
image_list = os.listdir("data/images")
image_ids = [filename.split(".")[0] for filename in image_list]
print(image_ids)
# 打开对应的2012_train.txt 文件对其进行写入准备
list_file = open('data/%s.txt' % (image_set), 'w')
# print(image_ids)
# 将对应的文件_id以及全路径写进去并换行
for image_id in image_ids:
# 检查图片格式并写入对应的路径
for ext in supported_image_formats:
image_path = 'data/images/%s%s' % (image_id, ext)
#print(image_path)
if os.path.exists(image_path):
list_file.write('%s\n' % image_path)
break
# 调用 year = 年份 image_id = 对应的文件名_id
convert_annotation(image_id)
# 关闭文件
list_file.close()
3.2 分类的训练前准备
1 新建datas文件夹,在文件夹中放置
- train
class1
class2
class3 - val
class1
class2
class3
2 在yolov8文件夹下放置代码train_classify.py
代码如下:
from ultralytics import YOLO
# 这里使用的是linux系统进行训练 配置好YOLO8环境,一键运行该文件即可自动训练
# Load a model
pretrainedModelPath = "/data/h2413_/v8_yolo/runs/classify/train25/weights/best.pt"
model = YOLO(pretrainedModelPath) # load a pretrained model (recommended for training)
results = model.train(data='datas', batch=8, workers=10, epochs=100, imgsz=640, lr0=0.00001, lrf=0.00001)
然后执行即可。
695

被折叠的 条评论
为什么被折叠?



