yolov8训练自己得数据集

首先标注数据使用lebalme 或者 lebalimg

标注的时候选择txt格式就行,yolov8训的时候用这个格式,别的看情况可以写代码转格式

标注完之后要训练之前需要划分数据集,比如7:3 8:2 之类的,这个就看个人了,一般5000张以内基本7:3开就行,大概8千到1万就8:2开,或者8.5:1.5开,看个人。

划分数据集,我上个7:3和8:2开的代码:

8:2开的demo

import os

import shutil

from sklearn.model_selection import train_test_split

def split_dataset(image_dir, label_dir, train_ratio, val_ratio, test_ratio=None):

# 获取所有图像文件名(假设图像和标签文件同名)

all_images = [f for f in os.listdir(image_dir) if f.endswith('.jpg')]

# 创建对应的标签文件名列表,假设标签文件扩展名为 .txt

all_labels = [f.replace('.jpg', '.txt') for f in all_images]

# 按比例划分训练集和验证集(以及可选的测试集)

train_images, temp_images, train_labels, temp_labels = train_test_split(

all_images, all_labels, test_size=(1 - train_ratio), random_state=42

)

# 如果指定了测试集比例

if test_ratio:

# 调整验证集比例,确保验证集和测试集的比例正确

val_ratio_adjusted = val_ratio / (val_ratio + test_ratio)

# 按调整后的比例划分验证集和测试集

val_images, test_images, val_labels, test_labels = train_test_split(

temp_images, temp_labels, test_size=(1 - val_ratio_adjusted), random_state=42

)

else:

# 如果未指定测试集比例,全部分配给验证集

val_images, test_images, val_labels, test_labels = temp_images, [], temp_labels, []

# 创建目标目录,如果不存在则创建

os.makedirs('datasets/images/train', exist_ok=True)

os.makedirs('datasets/images/val', exist_ok=True)

os.makedirs('datasets/images/test', exist_ok=True)

os.makedirs('datasets/labels/train', exist_ok=True)

os.makedirs('datasets/labels/val', exist_ok=True)

os.makedirs('datasets/labels/test', exist_ok=True)

# 复制训练集文件到目标目录

for img, lbl in zip(train_images, train_labels):

shutil.copy(os.path.join(image_dir, img), os.path.join('datasets/images/train', img))

shutil.copy(os.path.join(label_dir, lbl), os.path.join('datasets/labels/train', lbl))

# 复制验证集文件到目标目录

for img, lbl in zip(val_images, val_labels):

shutil.copy(os.path.join(image_dir, img), os.path.join('datasets/images/val', img))

shutil.copy(os.path.join(label_dir, lbl), os.path.join('datasets/labels/val', lbl))

# 复制测试集文件到目标目录(如果有测试集)

for img, lbl in zip(test_images, test_labels):

shutil.copy(os.path.join(image_dir, img), os.path.join('datasets/images/test', img))

shutil.copy(os.path.join(label_dir, lbl), os.path.join('datasets/labels/test', lbl))

# 打印训练集、验证集和测试集的图片数量

print(f"Training images: {len(train_images)}")

print(f"Validation images: {len(val_images)}")

if test_ratio:

print(f"Testing images: {len(test_images)}")

# 示例使用

image_dir = 'datasets/images' # 图像文件目录

label_dir = 'datasets/labels' # 标签文件目录

# 按照 80% 训练集,10% 验证集,10% 测试集的比例划分数据集

split_dataset(image_dir, label_dir, train_ratio=0.8, val_ratio=0.1, test_ratio=0.1)

7:3开的demo

import os import shutil from sklearn.model_selection import train_test_split

def split_dataset(image_dir, label_dir, train_ratio): # 获取所有图像文件名(假设图像和标签文件同名) all_images = [f for f in os.listdir(image_dir) if f.endswith('.jpg')] all_labels = [f.replace('.jpg', '.txt') for f in all_images]

# 按比例划分训练集和验证集 train_images, val_images, train_labels, val_labels = train_test_split( all_images, all_labels, test_size=(1 - train_ratio), random_state=42 )

# 创建目标目录 train_image_dir = os.path.join(image_dir, 'train') val_image_dir = os.path.join(image_dir, 'val') train_label_dir = os.path.join(label_dir, 'train') val_label_dir = os.path.join(label_dir, 'val') os.makedirs(train_image_dir, exist_ok=True) os.makedirs(val_image_dir, exist_ok=True) os.makedirs(train_label_dir, exist_ok=True) os.makedirs(val_label_dir, exist_ok=True)

# 复制文件到目标目录 for img, lbl in zip(train_images, train_labels): shutil.copy(os.path.join(image_dir, img), os.path.join(train_image_dir, img)) shutil.copy(os.path.join(label_dir, lbl), os.path.join(train_label_dir, lbl))

for img, lbl in zip(val_images, val_labels): shutil.copy(os.path.join(image_dir, img), os.path.join(val_image_dir, img)) shutil.copy(os.path.join(label_dir, lbl), os.path.join(val_label_dir, lbl))

print(f"Training images: {len(train_images)}") print(f"Validation images: {len(val_images)}")

# 示例使用 image_dir = 'datasets/images' # 图像文件目录 label_dir = 'datasets/labels' # 标签文件目录 split_dataset(image_dir, label_dir, train_ratio=0.7) # 按照 70% 训练集和 30% 验证集的比例划分数据集

训练的代码demo

from ultralytics import YOLO

def main():

# 加载YOLOv8模型(这里以yolov8s为例)

model = YOLO('yolov8s.pt') # 你可以使用预训练的模型权重

# 设置超参数

hyperparameters = {

'epochs': 1, # 训练轮数

'imgsz': 640, # 输入图像大小

'batch': 8, # 批次大小

'device': 0, # 使用的GPU设备编号,-1表示使用CPU

'lr0': 0.01, # 初始学习率

'lrf': 0.01, # 最终学习率

'momentum': 0.937, # 动量

'weight_decay': 0.0005, # 权重衰减

'warmup_epochs': 3.0, # 预热轮数

'warmup_momentum': 0.8, # 预热动量

'warmup_bias_lr': 0.1, # 预热偏置学习率

'box': 7.5, # box 损失增益

'cls': 0.5, # cls 损失增益

'dfl': 1.5, # dfl 损失增益

'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, # 透视度数

'flipud': 0.0, # 上下翻转概率

'fliplr': 0.5, # 左右翻转概率

'mosaic': 1.0, # 马赛克增强

'mixup': 0.0, # MixUp增强

'copy_paste': 0.0, # 复制粘贴增强

'auto_augment': 'randaugment', # 自动增强策略

'erasing': 0.4, # 随机擦除增强

'crop_fraction': 1.0, # 裁剪比例

'cfg': None, # 模型配置文件

'tracker': 'botsort.yaml', # 跟踪器配置文件

'save_dir': 'runs/train', # 保存目录

'rect': False, # 是否使用矩形训练

'cos_lr': False, # 是否使用余弦学习率

'close_mosaic': 10, # 关闭马赛克增强的epoch

'resume': False, # 是否恢复训练

'amp': True, # 是否使用混合精度

'fraction': 1.0, # 数据集使用比例

'profile': False, # 是否性能分析

'freeze': None, # 冻结层

'multi_scale': False, # 是否使用多尺度训练

'overlap_mask': True, # 是否使用重叠掩码

'mask_ratio': 4, # 掩码比例

'dropout': 0.0, # Dropout 概率

'val': True, # 是否进行验证

'split': 'val', # 验证集拆分

'save_json': False, # 是否保存为JSON

'save_hybrid': False, # 是否保存混合模型

'conf': None, # 置信度阈值

'iou': 0.7, # IOU 阈值

'max_det': 300, # 最大检测数量

'half': False, # 是否使用半精度

'dnn': False, # 是否使用DNN

'plots': True, # 是否绘制图表

'source': None, # 数据源

'vid_stride': 1, # 视频步长

'stream_buffer': False, # 是否使用流缓冲

'visualize': False, # 是否可视化

'augment': False, # 是否数据增强

'agnostic_nms': False, # 是否使用类别无关NMS

'classes': None, # 使用的类别

'retina_masks': False, # 是否使用视网膜掩码

'embed': None, # 嵌入

'show': False, # 是否显示

'save_frames': False, # 是否保存帧

'save_txt': False, # 是否保存为TXT

'save_conf': False, # 是否保存置信度

'save_crop': False, # 是否保存裁剪结果

'show_labels': True, # 是否显示标签

'show_conf': True, # 是否显示置信度

'show_boxes': True, # 是否显示边界框

'line_width': None, # 线宽

'format': 'torchscript', # 格式

'keras': False, # 是否使用Keras

'optimize': False, # 是否优化

'int8': False, # 是否使用int8量化

'dynamic': False, # 是否动态

'simplify': False, # 是否简化

'opset': None, # ONNX opset版本

'workspace': 4, # 工作空间

'nms': False # 是否使用NMS

}

# 训练模型

model.train(

data=r'D:\PycharmProjects\Project\ultralytics-main\datasets\mydata.yaml', # 数据集配置文件

**hyperparameters

)

# 评估模型

results = model.val()

# 使用模型进行推理

results = model(r'D:\PycharmProjects\Project\ultralytics-main\datasets\images\train\a_1559.jpg') # 输入图片路径

# 打印结果

print(results)

if __name__ == "__main__":

main()

训练结果出来了出现那个路径就是训练成功了

其中超参数适用的场景,根据所需调整

epochs (训练轮数)

场景:决定模型训练的轮数。较多的轮数可以提高模型的性能,但会增加训练时间。 适用:一般任务,建议从较小的值开始,如 50,然后根据模型收敛情况调整。imgsz (输入图像大小)

场景:决定输入图像的大小。较大的图像大小可以提高检测精度,但会增加计算量。 适用:高分辨率任务,推荐使用 640 或 1024。batch (批次大小)

场景:决定每个批次中处理的图像数量。较大的批次大小可以提高训练稳定性,但需要更多的显存。 适用:显存充足时,可以增大批次大小,如 16 或 32。device (设备编号)

场景:指定训练使用的设备编号。-1 表示使用 CPU,其他数字表示使用对应编号的 GPU。 适用:有多 GPU 环境时,可指定不同设备。lr0 (初始学习率)

场景:控制初始的学习率。较高的学习率可以加速收敛,但可能导致不稳定。 适用:一般从 0.01 开始,根据需要调整。lrf (最终学习率)

场景:训练结束时的学习率。通常设置为初始学习率的一个较小比例。 适用:通常设置为 0.01。momentum (动量)

场景:控制优化器的动量。动量可以帮助模型在梯度下降过程中保持稳定。 适用:一般设置为 0.937。weight_decay (权重衰减)

场景:控制正则化的权重衰减。防止模型过拟合。 适用:一般设置为 0.0005。warmup_epochs (预热轮数)

场景:控制预热阶段的轮数。在预热阶段,学习率逐渐增加到初始学习率。 适用:一般设置为 3.0。warmup_momentum (预热动量)

场景:控制预热阶段的动量。预热阶段,动量逐渐增加到正常动量。 适用:一般设置为 0.8。warmup_bias_lr (预热偏置学习率)

场景:控制预热阶段偏置项的学习率。 适用:一般设置为 0.1。box (box 损失增益)

场景:控制边界框损失的增益。 适用:一般设置为 7.5。cls (cls 损失增益)

场景:控制分类损失的增益。 适用:一般设置为 0.5。dfl (dfl 损失增益)

场景:控制分布焦点损失的增益。 适用:一般设置为 1.5。hsv_h (HSV 色调增益)

场景:数据增强时的色调增益。 适用:一般设置为 0.015。hsv_s (HSV 饱和度增益)

场景:数据增强时的饱和度增益。 适用:一般设置为 0.7。hsv_v (HSV 值增益)

场景:数据增强时的值增益。 适用:一般设置为 0.4。degrees (旋转度数)

场景:数据增强时的图像旋转度数。 适用:一般设置为 0.0。translate (平移增益)

场景:数据增强时的图像平移增益。 适用:一般设置为 0.1。scale (尺度增益)

场景:数据增强时的图像尺度增益。 适用:一般设置为 0.5。shear (剪切度数)

场景:数据增强时的图像剪切度数。 适用:一般设置为 0.0。perspective (透视度数)

场景:数据增强时的图像透视度数。 适用:一般设置为 0.0。flipud (上下翻转概率)

场景:数据增强时的图像上下翻转概率。 适用:一般设置为 0.0。fliplr (左右翻转概率)

场景:数据增强时的图像左右翻转概率。 适用:一般设置为 0.5。mosaic (马赛克增强)

场景:数据增强时的马赛克增强概率。 适用:一般设置为 1.0。mixup (MixUp增强)

场景:数据增强时的 MixUp 增强概率。 适用:一般设置为 0.0。copy_paste (复制粘贴增强)

场景:数据增强时的复制粘贴增强概率。 适用:一般设置为 0.0。auto_augment (自动增强策略)

场景:选择自动增强策略。 适用:一般设置为 'randaugment'。erasing (随机擦除增强)

场景:数据增强时的随机擦除增强概率。 适用:一般设置为 0.4。crop_fraction (裁剪比例)

场景:数据增强时的裁剪比例。 适用:一般设置为 1.0。cfg (模型配置文件)

场景:指定自定义的模型配置文件。 适用:根据具体需求设置。tracker (跟踪器配置文件)

场景:指定跟踪器配置文件。 适用:一般设置为 'botsort.yaml'。save_dir (保存目录)

场景:指定训练结果的保存目录。 适用:一般设置为 'runs/train'。rect (是否使用矩形训练)

场景:决定是否使用矩形训练。 适用:一般设置为 False。cos_lr (是否使用余弦学习率)

场景:决定是否使用余弦学习率调度。 适用:一般设置为 False。close_mosaic (关闭马赛克增强的 epoch)

场景:指定在训练多少个 epoch 后关闭马赛克增强。 适用:一般设置为 10。resume (是否恢复训练)

场景:决定是否从上次中断的地方恢复训练。 适用:一般设置为 False。amp (是否使用混合精度)

场景:决定是否使用混合精度训练。 适用:一般设置为 True。fraction (数据集使用比例)

场景:指定使用的数据集比例。 适用:一般设置为 1.0。profile (是否性能分析)

场景:决定是否进行性能分析。 适用:一般设置为 False。freeze (冻结层)

场景:指定要冻结的模型层。 适用:根据需要设置。multi_scale (是否使用多尺度训练)

场景:决定是否使用多尺度训练。 适用:一般设置为 False。overlap_mask (是否使用重叠掩码)

场景:决定是否使用重叠掩码。 适用:一般设置为 True。mask_ratio (掩码比例)

场景:指定掩码比例。 适用:一般设置为 4。dropout (Dropout 概率)

场景:指定 Dropout 概率。 适用:一般设置为 0.0。val (是否进行验证)

场景:决定是否在训练期间进行验证。 适用:一般设置为 True。split (验证集拆分)

场景:指定验证集拆分方式。 适用:一般设置为 'val'。save_json (是否保存为 JSON)

场景:决定是否保存验证结果为 JSON 格式。 适用:一般设置为 False。save_hybrid (是否保存混合模型)

场景:决定是否保存混合模型。 适用:一般设置为 False。conf (置信度阈值)

场景:指定置信度阈值。 适用:根据需要设置。iou (IOU 阈值)

场景:指定 IOU 阈值。 适用:一

Copyright © 2088 斯诺克世界杯_世界杯排名榜 - zhaoxiaotian.com All Rights Reserved.
友情链接