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 (冻结

### YOLOv11 数据集划分建议 对于YOLOv11模型,在准备数据集时合理地划分训练集、验证集和测试集至关重要。通常情况下,推荐采用70%-15%-15%的比例来分配这三个子集[^1]。这种做法不仅能够确保各子集中类别的分布尽可能接近原始数据集的情况,而且有助于更准确地衡量模型泛化能力。 当处理特定领域或自定义的数据集时,可能需要先完成图像采集并对其进行精确标注,之后再考虑按照上述比例进行分割操作。为了简化这一过程,可以利用Python脚本实现自动化处理,比如通过`shuffle`函数打乱顺序后再依据设定好的百分比提取相应数量样本形成不同用途的集合[^3]。 值得注意的是,实际应用中可根据具体需求调整这些比率;例如某些项目可能会倾向于更大的训练集以促进学习效果,而减少用于验证的部分至约10%,即遵循8:1:1这样的配置方案也是可行的选择之一。 ```python import os from sklearn.model_selection import train_test_split def split_dataset(image_paths, labels, train_size=0.7, val_size=0.15, test_size=0.15): # Split into training and temporary sets first. remaining_size = 1 - train_size X_train, X_temp, y_train, y_temp = train_test_split( image_paths, labels, stratify=labels, random_state=42, train_size=train_size) # Then split the temp set further into validation and testing sets. relative_val_size = val_size / remaining_size X_val, X_test, y_val, y_test = train_test_split( X_temp, y_temp, stratify=y_temp, random_state=42, train_size=relative_val_size) return (X_train, y_train), (X_val, y_val), (X_test, y_test) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值