yolov8训练自己的数据集(简单最快上手版)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

YOLOv8就不多介绍,读者可以参考YoloV8使用文档地址YoloV8文档地址,该文档也包含详细的安装、训练、测试等教程。本篇文章旨在帮助新手快速上手使用YOLOv8进行训练自己特定的数据集。

环境

python>=3.8. PyTorch>=1.8

提示:以下是本篇文章正文内容,下面案例可供参考

一、环境搭建

1.pytorch-gpu

pytorch-gpu环境搭建可以直接看我的另一篇文章:cuda环境配置(anaconda虚拟环境版,含pytorch-gpu安装)
有详细的搭建教程。按照我所写的步骤一步一步来即可。

2.pycharm中导入虚拟环境

打开pycharm创建项目,并导入anaconda创建的虚拟环境,导入虚拟环境这一步也只需看我的另一篇文章即可:pycharm导入anaconda创建的虚拟环境

2.安装ultralytics

应该是从YOLOv8开始,yolo系列集成到了ultralytics第三方库,更加方便使用。只需再虚拟环境中pip install ultralytics安装即可。

二、数据集准备

1.labelimg工具安装

使用anaconda创建虚拟环境conda create -n labelimg python=3.8conda activate labelimg进入虚拟环境,输入pip install labelimg,回车。

在这里插入图片描述

2.创建数据集文件夹

在打标签之前,需要创建特定的文件夹,用来存放数据集中的图片和标签,如图:
在这里插入图片描述
data里的images存放要标记的图片,labels存放标签,即.txt文件,将你的图片数据集放到images文件夹里。

3.打标签

labelimg安装完成后,输入labelimg(别忘了要先进如上面所创建的虚拟环境),回车,然后就进入了labelimg工具界面(如果此处报错,可自行查找报错教程,问题不大):

在这里插入图片描述
点击openDir,选择上述所创建的文件夹imges即可,此时界面右下角的File List会显示你所有的图片信息,点击第一张,如图(这里我只放了一张图):
在这里插入图片描述
再点击Chage Save Dir,选择上述创建的labels文件夹,这一步是指定你标签保存的地方,然后检查是否为Yolo格式:
在这里插入图片描述
不是yolo的话,点击进行更换。

在这里插入图片描述
点击view,选择Auto Save mode,设置自动保存,single class mode(单类别模式)不用勾选。下面就是枯燥无味的打标签了:
按下W键,就可以画框,然后输入类别名称即可:
在这里插入图片描述
再按D键,就到下一张了,按A键回到上一张,重复,直到结束。这样data文件夹的images里存放的是图片,labels里则存放的是一个个txt文件,且文件名与images里的图片一一对应,自此数据集就准备完毕了。

三、YOLOv8训练

1.数据集划分

训练之前需要将数据集划分成训练集和测试集,这里我写了一个脚本,更换成你的数据集路径运行即可:

import os
import random
import shutil

def split_dataset(input_image_folder, input_label_folder, output_folder, test_ratio=0.2):
    # 创建训练集和验证集文件夹
    train_images_folder = os.path.join(output_folder, 'train', 'images')
    train_labels_folder = os.path.join(output_folder, 'train', 'labels')
    val_images_folder = os.path.join(output_folder, 'val', 'images')
    val_labels_folder = os.path.join(output_folder, 'val', 'labels')

    os.makedirs(train_images_folder, exist_ok=True)
    os.makedirs(train_labels_folder, exist_ok=True)
    os.makedirs(val_images_folder, exist_ok=True)
    os.makedirs(val_labels_folder, exist_ok=True)

    # 获取所有图像文件列表
    images = [f for f in os.listdir(input_image_folder) if f.endswith('.jpg') or f.endswith('.png')]

    # 随机打乱图像文件列表
    random.shuffle(images)

    # 计算验证集的数量
    val_size = int(len(images) * test_ratio)

    # 划分验证集和训练集
    val_images = images[:val_size]
    train_images = images[val_size:]

    # 复制验证集图像和标签
    for image in val_images:
        label = os.path.splitext(image)[0] + '.txt'
        if os.path.exists(os.path.join(input_label_folder, label)):
            shutil.copy(os.path.join(input_image_folder, image), os.path.join(val_images_folder, image))
            shutil.copy(os.path.join(input_label_folder, label), os.path.join(val_labels_folder, label))
        else:
            print(f"Warning: Label file {label} not found for image {image}")

    # 复制训练集图像和标签
    for image in train_images:
        label = os.path.splitext(image)[0] + '.txt'
        if os.path.exists(os.path.join(input_label_folder, label)):
            shutil.copy(os.path.join(input_image_folder, image), os.path.join(train_images_folder, image))
            shutil.copy(os.path.join(input_label_folder, label), os.path.join(train_labels_folder, label))
        else:
            print(f"Warning: Label file {label} not found for image {image}")


# 使用示例
input_image_folder = 'data/images' # 图片路径
input_label_folder = 'data/labels' # 标签路径
output_folder = 'datasets'
split_dataset(input_image_folder, input_label_folder, output_folder, test_ratio=0.2)

运行之后会生成一个datasets文件夹,如图:
在这里插入图片描述

2.yaml文件配置

在ultralytics的github中从ultralytics/cfg/models/v8的文件里找到yolov8.yaml文件下载到本地,放到你的项目里,修改文件开头的nc值,为你自己数据集所设置的标签类别数量:
在这里插入图片描述
再创建一个train.yaml文件,内容如下:

train: D:/yolov8/datasets/train # train images (relative to 'path') 128 images
val: D:/yolov8/datasets/val # val images (relative to 'path') 128 images
test: # val images (optional)

# Classes
names:
  0: dog
  1: cat

其中train为前面划分数据集生成的train文件夹的绝对路径,vla为val文件夹的绝对路径(一定要绝对路径!!!)
names为你要检测的类别名称,序号根据你的类别数量递增。

四、模型训练

一切准备就绪,开始训练!创建train.py文件(和yolov8.yaml、train.yaml在同一路径即可),内容如下:

from ultralytics import YOLO

if __name__ == '__main__':
    # 初始训练
    model = YOLO("yolov8.yaml").load("yolov8n.pt")# 加载预训练模型,如果本地没有会自动下载
    results = model.train(data="train.yaml", epochs=500, imgsz=640, batch=32, workers=16)

我这里使用的yolov8n模型,yolov8官网提供了多种预训练模型,读者可去yolov8的github上选择适合自己数据集的模型,各个模型效果如下(点击即可下载到本地):

其中yolov8模型如果本地没有,会自动下载,如果因为网络问题下载失败,可以自行到yolov8的github官网下载。
运行train.py文件,稍等片刻就会开始训练,model.train()里的参数可以根据自己硬件的配置进行修改,重点关注batch和workers,如果设置过大,会导致gpu内存溢出,无法训练。
model.train()的所有参数以及相关描述,表格如下:

参数默认值描述
modelNone指定用于训练的模型文件。接受 .pt 预训练模型或 .yaml 配置文件的路径。定义模型结构或初始化权重的关键。
dataNone数据集配置文件的路径(例如 coco8.yaml)。该文件包含数据集特定的参数,包括训练和验证数据的路径、类名和类数。
epochs100总训练周期数。每个周期代表对整个数据集的一次完整遍历。调整此值会影响训练时长和模型性能。
timeNone最大训练时间(小时)。如果设置,该参数会覆盖 epochs 参数,允许训练在指定时长后自动停止。对时间有限的训练场景非常有用。
patience100在验证指标无改进的情况下等待的周期数,超过该周期后提前停止训练。帮助防止过拟合,当性能停滞时停止训练。
batch16批量大小,有三种模式:设置为整数(例如 batch=16),自动模式为60% GPU内存利用率(batch=-1),或指定利用率的自动模式(batch=0.70)。
imgsz640训练目标图像大小。所有图像在输入模型之前都会被调整为这个尺寸。影响模型精度和计算复杂度。
saveTrue启用训练检查点和最终模型权重的保存。用于恢复训练或模型部署。
save_period-1模型检查点保存频率,以周期数为单位。值为 -1 则禁用此功能。对于长时间训练过程中保存中间模型非常有用。
cacheFalse启用数据集图像的内存缓存(True/ram)、磁盘缓存(disk),或禁用缓存(False)。通过减少磁盘 I/O 提高训练速度,但会增加内存使用量。
deviceNone指定训练的计算设备:单个 GPU(device=0)、多个 GPU(device=0,1)、CPU(device=cpu),或 Apple Silicon 的 MPS(device=mps)。
workers8数据加载的工作线程数(每个 RANK 如果是多 GPU 训练)。影响数据预处理和输入模型的速度,尤其在多 GPU 设置中非常有用。
projectNone保存训练输出的项目目录名称。允许有组织地存储不同的实验。
nameNone训练运行的名称。用于在项目文件夹内创建子目录,存储训练日志和输出。
exist_okFalse如果为 True,允许覆盖现有的项目/名称目录。对于迭代实验非常有用,无需手动清除以前的输出。
pretrainedTrue确定是否从预训练模型开始训练。可以是布尔值或特定模型路径的字符串,用于加载权重。增强训练效率和模型性能。
optimizer‘auto’训练的优化器选择。选项包括 SGD、Adam、AdamW、NAdam、RAdam、RMSProp 等,或自动根据模型配置选择。影响收敛速度和稳定性。
verboseFalse启用详细输出,在训练期间提供详细的日志和进度更新。用于调试和密切监控训练过程。
seed0设置训练的随机种子,确保在相同配置下结果可重现。
deterministicTrue强制使用确定性算法,确保可重现性,但可能由于限制非确定性算法而影响性能和速度。
single_clsFalse在多类数据集中将所有类视为单一类进行训练。对于二分类任务或只关注对象存在而不是分类时非常有用。
rectFalse启用矩形训练,优化批次组成以最小化填充。可以提高效率和速度,但可能影响模型精度。
cos_lrFalse使用余弦学习率调度器,按照余弦曲线调整学习率。帮助更好地管理学习率以便更好地收敛。
close_mosaic10在最后 N 个周期禁用镶嵌数据增强,以在完成前稳定训练。设置为 0 则禁用此功能。
resumeFalse从最后保存的检查点恢复训练。自动加载模型权重、优化器状态和周期数,无缝继续训练。
ampTrue启用自动混合精度(AMP)训练,减少内存使用并可能加速训练,对精度影响最小。
fraction1.0指定用于训练的数据集部分。允许在数据集子集上进行训练,对实验或资源有限时非常有用。
profileFalse启用 ONNX 和 TensorRT 速度的训练期间剖析,用于优化模型部署。
freezeNone冻结模型的前 N 层或按索引指定的层,减少可训练参数数量。用于微调或迁移学习。
lr00.01初始学习率(例如 SGD=1E-2,Adam=1E-3)。调整此值对优化过程至关重要,影响模型权重的更新速度。
lrf0.01最终学习率作为初始学习率的分数 = (lr0 * lrf),与调度器结合使用以随时间调整学习率。
momentum0.937SGD 的动量因子或 Adam 的 beta1,影响在当前更新中合并过去梯度的程度。
weight_decay0.0005L2 正则化项,惩罚大权重以防止过拟合。
warmup_epochs3.0学习率预热周期数,逐渐从低值增加到初始学习率,以稳定初期训练。
warmup_momentum0.8预热阶段的初始动量,逐渐调整为设定的动量值。
warmup_bias_lr0.1预热阶段的偏置参数学习率,帮助稳定初期训练。
box7.5损失函数中 box 损失组件的权重,影响对准确预测边界框坐标的重视程度。
cls0.5总损失函数中分类损失的权重,相对于其他组件影响正确类别预测的重要性。
dfl1.5分布焦点损失的权重,在某些 YOLO 版本中用于细粒度分类。
pose12.0在姿态估计模型中姿态损失的权重,影响对准确预测姿态关键点的重视程度。
kobj2.0姿态估计模型中关键点物体性损失的权重,平衡检测置信度与姿态准确性。
label_smoothing0.0应用标签平滑,将硬标签软化为目标标签与标签上的均匀分布的混合,可以提高泛化能力。
nbs64损失归一化的名义批次大小。
overlap_maskTrue确定训练期间分割掩码是否应重叠,适用于实例分割任务。
mask_ratio4分割掩码的下采样比例,影响训练期间使用的掩码分辨率。
dropout0.0分类任务中的 dropout 率,通过训练期间随机省略单元来防止过拟合。
valTrue启用训练期间的验证,允许定期评估模型在单独数据集上的性能。
plotsFalse生成并保存训练和验证指标以及预测示例的图表,提供对模型性能和学习进展的可视化洞察。

五、训练意外终止之后继续训练(断点训练)

如果你的训练意外终止,想从终止的地方继续开始训练,你可以修改train.py文件或者直接创建新的文件,这里演示直接创建新的文件resume.py,内容如下:


from ultralytics import YOLO 

if __name__ == '__main__':
model = YOLO('yolov8/runs/detect/train/weights/last.pt')  # 这里用你训练终止前保存的最近的一次模型,这个你应该很容易找到
# 继续训练
results = model.train(resume=True)

其实只修改train.py文件的model变量里的模型文件路径即可。

六、模型测试

训练完模型之后,你可以验证模型的检测效果,创建detec.py文件,内容如下:

from ultralytics import YOLO

# 加载训练好的模型
model = YOLO('path/to/trained/best.pt') # 这里用你训练完以后保存的模型文件

# 推理单张图片
results = model('path/to/image.jpg')

# 显示推理结果
results.show()

其他的验证方法可以自行搜索。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值