提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
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.8,conda 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()的所有参数以及相关描述,表格如下:
| 参数 | 默认值 | 描述 |
|---|---|---|
| model | None | 指定用于训练的模型文件。接受 .pt 预训练模型或 .yaml 配置文件的路径。定义模型结构或初始化权重的关键。 |
| data | None | 数据集配置文件的路径(例如 coco8.yaml)。该文件包含数据集特定的参数,包括训练和验证数据的路径、类名和类数。 |
| epochs | 100 | 总训练周期数。每个周期代表对整个数据集的一次完整遍历。调整此值会影响训练时长和模型性能。 |
| time | None | 最大训练时间(小时)。如果设置,该参数会覆盖 epochs 参数,允许训练在指定时长后自动停止。对时间有限的训练场景非常有用。 |
| patience | 100 | 在验证指标无改进的情况下等待的周期数,超过该周期后提前停止训练。帮助防止过拟合,当性能停滞时停止训练。 |
| batch | 16 | 批量大小,有三种模式:设置为整数(例如 batch=16),自动模式为60% GPU内存利用率(batch=-1),或指定利用率的自动模式(batch=0.70)。 |
| imgsz | 640 | 训练目标图像大小。所有图像在输入模型之前都会被调整为这个尺寸。影响模型精度和计算复杂度。 |
| save | True | 启用训练检查点和最终模型权重的保存。用于恢复训练或模型部署。 |
| save_period | -1 | 模型检查点保存频率,以周期数为单位。值为 -1 则禁用此功能。对于长时间训练过程中保存中间模型非常有用。 |
| cache | False | 启用数据集图像的内存缓存(True/ram)、磁盘缓存(disk),或禁用缓存(False)。通过减少磁盘 I/O 提高训练速度,但会增加内存使用量。 |
| device | None | 指定训练的计算设备:单个 GPU(device=0)、多个 GPU(device=0,1)、CPU(device=cpu),或 Apple Silicon 的 MPS(device=mps)。 |
| workers | 8 | 数据加载的工作线程数(每个 RANK 如果是多 GPU 训练)。影响数据预处理和输入模型的速度,尤其在多 GPU 设置中非常有用。 |
| project | None | 保存训练输出的项目目录名称。允许有组织地存储不同的实验。 |
| name | None | 训练运行的名称。用于在项目文件夹内创建子目录,存储训练日志和输出。 |
| exist_ok | False | 如果为 True,允许覆盖现有的项目/名称目录。对于迭代实验非常有用,无需手动清除以前的输出。 |
| pretrained | True | 确定是否从预训练模型开始训练。可以是布尔值或特定模型路径的字符串,用于加载权重。增强训练效率和模型性能。 |
| optimizer | ‘auto’ | 训练的优化器选择。选项包括 SGD、Adam、AdamW、NAdam、RAdam、RMSProp 等,或自动根据模型配置选择。影响收敛速度和稳定性。 |
| verbose | False | 启用详细输出,在训练期间提供详细的日志和进度更新。用于调试和密切监控训练过程。 |
| seed | 0 | 设置训练的随机种子,确保在相同配置下结果可重现。 |
| deterministic | True | 强制使用确定性算法,确保可重现性,但可能由于限制非确定性算法而影响性能和速度。 |
| single_cls | False | 在多类数据集中将所有类视为单一类进行训练。对于二分类任务或只关注对象存在而不是分类时非常有用。 |
| rect | False | 启用矩形训练,优化批次组成以最小化填充。可以提高效率和速度,但可能影响模型精度。 |
| cos_lr | False | 使用余弦学习率调度器,按照余弦曲线调整学习率。帮助更好地管理学习率以便更好地收敛。 |
| close_mosaic | 10 | 在最后 N 个周期禁用镶嵌数据增强,以在完成前稳定训练。设置为 0 则禁用此功能。 |
| resume | False | 从最后保存的检查点恢复训练。自动加载模型权重、优化器状态和周期数,无缝继续训练。 |
| amp | True | 启用自动混合精度(AMP)训练,减少内存使用并可能加速训练,对精度影响最小。 |
| fraction | 1.0 | 指定用于训练的数据集部分。允许在数据集子集上进行训练,对实验或资源有限时非常有用。 |
| profile | False | 启用 ONNX 和 TensorRT 速度的训练期间剖析,用于优化模型部署。 |
| freeze | None | 冻结模型的前 N 层或按索引指定的层,减少可训练参数数量。用于微调或迁移学习。 |
| lr0 | 0.01 | 初始学习率(例如 SGD=1E-2,Adam=1E-3)。调整此值对优化过程至关重要,影响模型权重的更新速度。 |
| lrf | 0.01 | 最终学习率作为初始学习率的分数 = (lr0 * lrf),与调度器结合使用以随时间调整学习率。 |
| momentum | 0.937 | SGD 的动量因子或 Adam 的 beta1,影响在当前更新中合并过去梯度的程度。 |
| weight_decay | 0.0005 | L2 正则化项,惩罚大权重以防止过拟合。 |
| warmup_epochs | 3.0 | 学习率预热周期数,逐渐从低值增加到初始学习率,以稳定初期训练。 |
| warmup_momentum | 0.8 | 预热阶段的初始动量,逐渐调整为设定的动量值。 |
| warmup_bias_lr | 0.1 | 预热阶段的偏置参数学习率,帮助稳定初期训练。 |
| box | 7.5 | 损失函数中 box 损失组件的权重,影响对准确预测边界框坐标的重视程度。 |
| cls | 0.5 | 总损失函数中分类损失的权重,相对于其他组件影响正确类别预测的重要性。 |
| dfl | 1.5 | 分布焦点损失的权重,在某些 YOLO 版本中用于细粒度分类。 |
| pose | 12.0 | 在姿态估计模型中姿态损失的权重,影响对准确预测姿态关键点的重视程度。 |
| kobj | 2.0 | 姿态估计模型中关键点物体性损失的权重,平衡检测置信度与姿态准确性。 |
| label_smoothing | 0.0 | 应用标签平滑,将硬标签软化为目标标签与标签上的均匀分布的混合,可以提高泛化能力。 |
| nbs | 64 | 损失归一化的名义批次大小。 |
| overlap_mask | True | 确定训练期间分割掩码是否应重叠,适用于实例分割任务。 |
| mask_ratio | 4 | 分割掩码的下采样比例,影响训练期间使用的掩码分辨率。 |
| dropout | 0.0 | 分类任务中的 dropout 率,通过训练期间随机省略单元来防止过拟合。 |
| val | True | 启用训练期间的验证,允许定期评估模型在单独数据集上的性能。 |
| plots | False | 生成并保存训练和验证指标以及预测示例的图表,提供对模型性能和学习进展的可视化洞察。 |
五、训练意外终止之后继续训练(断点训练)
如果你的训练意外终止,想从终止的地方继续开始训练,你可以修改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万+

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



