YOLOV8训练参数详解

YOLOV8训练参数详解

慕落 114 2024-01-17

image-20240117140252248

示例代码

后续讲解的参数都可以像model.train(data=‘coco128.yaml’, epochs=100, imgsz=640)这里一样,例如参数名A,参数值为B,则可以写为model.train(A=B)

单GPU和CPU训练示例

在COCO128数据集上训练YOLOv8n模型100个时期,图像大小为640。可以使用device参数指定训练设备。如果没有传递参数,并且有可用的GPU,则将使用GPU device=0,否则将使用device=cpu

from ultralytics import YOLO
​
# 加载模型
model = YOLO('yolov8n.yaml')  # 从yaml文件加载
model = YOLO('yolov8n.pt')  # 加载预训练模型 (推荐)
model = YOLO('yolov8n.yaml').load('yolov8n.pt')  # 从 YAML加载 然后再加载权重
​
# 指定训练参数开始训练
model.train(data='coco128.yaml', epochs=100, imgsz=640)

多GPU训练

多GPU训练通过在多个GPU上分布训练负载,实现对可用硬件资源的更有效利用。无论是通过Python API还是命令行界面,都可以使用此功能。 若要启用多GPU训练,请指定您希望使用的GPU设备ID。

from ultralytics import YOLO
​
# 加载模型
model = YOLO('yolov8n.pt')  # 加载预训练模型(推荐用于训练)
​
# 使用2个GPU训练模型
results = model.train(data='coco128.yaml', epochs=100, imgsz=640, device=[0, 1])

苹果M1和M2 MPS训练

通过Ultralytics YOLO模型集成对Apple M1和M2芯片的支持,现在可以在使用强大的Metal性能着色器(MPS)框架的设备上训练模型。MPS为在Apple的定制硅上执行计算和图像处理任务提供了一种高性能的方法。

要在Apple M1和M2芯片上启用训练,您应该在启动训练过程时将设备指定为'mps'。以下是Python中如何做到这点的示例:

from ultralytics import YOLO
​
# 加载模型
model = YOLO('yolov8n.pt')  # 加载预训练模型(推荐用于训练)
​
# 使用2个GPU训练模型
results = model.train(data='coco128.yaml', epochs=100, imgsz=640, device='mps')

利用M1/M2芯片的计算能力,这使得训练任务的处理更加高效。有关更详细的指南和高级配置选项,请参阅PyTorch MPS文档

恢复中断的训练

在处理深度学习模型时,从之前保存的状态恢复训练是一个关键特性。在各种情况下,这可能很方便,比如当训练过程意外中断,或者当您希望用新数据或更多时期继续训练模型时。

恢复训练时,Ultralytics YOLO将加载最后保存的模型的权重,并恢复优化器状态、学习率调度器和时期编号。这允许您无缝地从离开的地方继续训练过程。

在Ultralytics YOLO中,您可以通过在调用train方法时将resume参数设置为True并指定包含部分训练模型权重的.pt文件路径来轻松恢复训练。

下面是使用Python恢复中断训练的示例:

from ultralytics import YOLO
​
# 加载模型
model = YOLO('path/to/last.pt')  # 加载部分训练的模型
​
# 恢复训练
results = model.train(resume=True)

通过设置resume=Truetrain函数将从'path/to/last.pt'文件中存储的状态继续训练。如果省略resume参数或将其设置为Falsetrain函数将启动新的训练会话。

请记住,默认情况下,检查点会在每个时期结束时保存,或者使用save_period参数以固定间隔保存,因此您必须至少完成1个时期才能恢复训练运行。

训练参数

全部参数

首先罗列一下官网提供的全部参数。

描述

model

None

模型文件路径,例如 yolov8n.pt, yolov8n.yaml

data

None

数据文件路径,例如 coco128.yaml

epochs

100

训练的轮次数量

patience

50

早停训练的等待轮次

batch

16

每批图像数量(-1为自动批大小)

imgsz

640

输入图像的大小,以整数表示

save

True

保存训练检查点和预测结果

save_period

-1

每x轮次保存检查点(如果<1则禁用)

cache

False

True/ram, disk 或 False。使用缓存加载数据

device

None

运行设备,例如 cuda device=0 或 device=0,1,2,3 或 device=cpu

workers

8

数据加载的工作线程数(如果DDP则为每个RANK)

project

None

项目名称

name

None

实验名称

exist_ok

False

是否覆盖现有实验

pretrained

True

(bool 或 str) 是否使用预训练模型(bool)或从中加载权重的模型(str)

optimizer

'auto'

使用的优化器,选择范围=[SGD, Adam, Adamax, AdamW, NAdam, RAdam, RMSProp, auto]

verbose

False

是否打印详细输出

seed

0

随机种子,用于可重复性

deterministic

True

是否启用确定性模式

single_cls

False

将多类数据作为单类训练

rect

False

矩形训练,每批为最小填充整合

cos_lr

False

使用余弦学习率调度器

close_mosaic

10

(int) 最后轮次禁用马赛克增强(0为禁用)

resume

False

从最后检查点恢复训练

amp

True

自动混合精度(AMP)训练,选择范围=[True, False]

fraction

1.0

训练的数据集比例(默认为1.0,即训练集中的所有图像)

profile

False

在训练期间为记录器分析ONNX和TensorRT速度

freeze

None

(int 或 list, 可选) 在训练期间冻结前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

优化器权重衰减5e-4

warmup_epochs

3.0

热身轮次(小数ok)

warmup_momentum

0.8

热身初始动量

warmup_bias_lr

0.1

热身初始偏差lr

box

7.5

框损失增益

cls

0.5

cls损失增益(根据像素缩放)

dfl

1.5

dfl损失增益

pose

12.0

姿态损失增益(仅限姿态)

kobj

2.0

关键点obj损失增益(仅限姿态)

label_smoothing

0.0

标签平滑(小数)

nbs

64

标称批大小

overlap_mask

True

训练期间掩码应重叠(仅限分割训练)

mask_ratio

4

掩码降采样比率(仅限分割训练)

dropout

0.0

使用dropout正则化(仅限分类训练)

val

True

训练期间验证/测试

model

model: 模型文件的路径。这个参数指定了所使用的模型文件的位置,例如 yolov8n.ptyolov8n.yaml

选择.pt和.yaml的区别
  • .pt类型的文件是从预训练模型的基础上进行训练。若我们选择 yolov8n.pt这种.pt类型的文件,其实里面是包含了模型的结构和训练好的参数的,也就是说拿来就可以用,就已经具备了检测目标的能力了,yolov8n.pt能检测coco中的80个类别。假设你要检测不同种类的狗,那么yolov8n.pt原本可以检测狗的能力对你训练应该是有帮助的,你只需要在此基础上提升其对不同狗的鉴别能力即可。但如果你需要检测的类别不在其中,例如口罩检测,那么就帮助不大。

  • .yaml文件是从零开始训练。采用yolov8n.yaml这种.yaml文件的形式,在文件中指定类别,以及一些别的参数。

模型种类选择,是n,s,m,还是l,x?

YOLOv8xYOLOv8x6 这样较大模型几乎在所有情况下都会产生更好的结果,但参数量更大,需要更多的显卡内存来训练,并且运行速度更慢。

image-20240117141717550

data

data: 数据文件的路径。该参数指定了数据集文件的位置,例如 coco128.yaml。数据集文件包含了训练和验证所需的图像、标签。

官方给出的coco128.yaml如下。

# Ultralytics YOLO 🚀, AGPL-3.0 license
# COCO128 dataset https://www.kaggle.com/ultralytics/coco128 (first 128 images from COCO train2017) by Ultralytics
# Documentation: https://docs.ultralytics.com/datasets/detect/coco/
# Example usage: yolo train data=coco128.yaml
# parent
# ├── ultralytics
# └── datasets
#     └── coco128  ← downloads here (7 MB)
​
​
# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: ../datasets/coco128  # dataset root dir
train: images/train2017  # train images (relative to 'path') 128 images
val: images/train2017  # val images (relative to 'path') 128 images
test:  # test images (optional)
​
# Classes
names:
  0: person
  1: bicycle
  2: car
  3: motorcycle
  4: airplane
  5: bus
  6: train
  7: truck
  8: boat
  9: traffic light
  10: fire hydrant
  11: stop sign
  12: parking meter
  13: bench
  14: bird
  15: cat
  16: dog
  17: horse
  18: sheep
  19: cow
  20: elephant
  21: bear
  22: zebra
  23: giraffe
  24: backpack
  25: umbrella
  26: handbag
  27: tie
  28: suitcase
  29: frisbee
  30: skis
  31: snowboard
  32: sports ball
  33: kite
  34: baseball bat
  35: baseball glove
  36: skateboard
  37: surfboard
  38: tennis racket
  39: bottle
  40: wine glass
  41: cup
  42: fork
  43: knife
  44: spoon
  45: bowl
  46: banana
  47: apple
  48: sandwich
  49: orange
  50: broccoli
  51: carrot
  52: hot dog
  53: pizza
  54: donut
  55: cake
  56: chair
  57: couch
  58: potted plant
  59: bed
  60: dining table
  61: toilet
  62: tv
  63: laptop
  64: mouse
  65: remote
  66: keyboard
  67: cell phone
  68: microwave
  69: oven
  70: toaster
  71: sink
  72: refrigerator
  73: book
  74: clock
  75: vase
  76: scissors
  77: teddy bear
  78: hair drier
  79: toothbrush
​
​
# Download script/URL (optional)
download: https://ultralytics.com/assets/coco128.zip
指定训练数据集的图片的文件夹

yaml文件中指定是images的位置,YOLO会自动寻找同级目录下labels文件夹中的同名标签,我们需要在labels文件夹中准备好标签文件。

├── coco128
    └── images
        └── train2017
            └── 20180824-13-43-21-401.jpg
            └──*****
            └── 20181025-16-37-47-196.jpg
        └──train2017
    └── labels  
        └── train2017
            └── 20180824-13-43-21-401.txt
            └──*****
            └── 20181025-16-37-47-196.txt
        └──train2017

epochs

epochs: 训练的轮数。这个参数确定了模型将会被训练多少次,每一轮都遍历整个训练数据集。训练的轮数越多,模型对数据的学习就越充分,但也增加了训练时间。

选取策略

默认是100轮数。但一般对于新数据集,我们还不知道这个数据集学习的难易程度,可以加大轮数,例如300,来找到更佳性能。

patience

patience: 早停的等待轮数。在训练过程中,如果在一定的轮数内没有观察到模型性能的明显提升,就会停止训练。这个参数确定了等待的轮数,如果超过该轮数仍没有改进,则停止训练。

早停

早停能减少过拟合。过拟合(overfitting)指的是只能拟合训练数据, 但不能很好地拟合不包含在训练数据中的其他数据的状态。

batch

batch: 每个批次中的图像数量。在训练过程中,数据被分成多个批次进行处理,每个批次包含一定数量的图像。这个参数确定了每个批次中包含的图像数量。特殊的是,如果设置为-1,则会自动调整批次大小,至你的显卡能容纳的最多图像数量。

选取策略

一般认为batch越大越好。因为我们的batch越大我们选择的这个batch中的图片更有可能代表整个数据集的分布,从而帮助模型学习。但batch越大占用的显卡显存空间越多,所以还是有上限的。

imgsz

  • imgsz: 输入图像的尺寸。这个参数确定了输入图像的大小。可以指定一个整数值表示图像的边长,也可以指定宽度和高度的组合。例如640表示图像的宽度和高度均为640像素。

选取策略

如果数据集中存在大量小对象,增大输入图像的尺寸imgsz可以使得这些小对象从高分辨率中受益,更好的被检测出。从官网放出的性能表也可以看出。

image-20240117150307333

save、save_period

  • save: 是否保存训练的检查点和预测结果。当训练过程中保存检查点时,模型的权重和训练状态会被保存下来,以便在需要时进行恢复或继续训练。预测结果也可以被保存下来以供后续分析和评估。

  • save_period: 保存检查点的间隔。这个参数确定了保存检查点的频率,例如设置为10表示每隔10个训练轮数保存一次检查点。如果设置为负数(如-1),则禁用保存检查点功能。

和resume配合

和resume配合可以在训练不稳定中断后再进行接着训练。例如大家白嫖Colab这个平台训练网络时,一般是有时间限制,会出现时间到了我们还没训练完的情况。通过save然后再resume重新启动可以进行接着训练。

cache

  • cache: 数据加载时是否使用缓存。这个参数控制是否将数据加载到缓存中,以加快训练过程中的数据读取速度。可以选择在 RAM 内存中缓存数据(True/ram)、在磁盘上缓存数据(disk)或不使用缓存(False)。

device

device: 训练运行的设备。该参数指定了模型训练所使用的设备,例如使用 GPU 运行可以指定为 cuda device=0,或者使用多个 GPU 运行可以指定为 device=0,1,2,3,如果没有可用的 GPU,可以指定为 device=cpu 使用 CPU 进行训练。

注意别选择错了。

workers

  • workers: 数据加载时的工作线程数。在数据加载过程中,可以使用多个线程并行地加载数据,以提高数据读取速度。这个参数确定了加载数据时使用的线程数,具体的最佳值取决于硬件和数据集的大小。

windows系统注意设置为0

windows系统下需设置为0,否则会报错 RuntimeError: An attempt has been made to start a new process before the current process has finished its bootstrapping phase。这是因为在linux系统中可以使用多个子进程加载数据,而在windows系统中不能。

project

  • project: 项目名称。这个参数用于标识当前训练任务所属的项目,方便管理和组织多个训练任务。

name

  • name: 实验名称。该参数为当前训练任务指定一个名称,以便于标识和区分不同的实验。

exist_ok

  • exist_ok: 是否覆盖现有的实验。如果设置为 True,当实验名称已经存在时,将会覆盖现有实验。默认为 False。

pretrained

  • pretrained: 是否使用预训练模型。如果设置为 True,将加载预训练的模型权重进行训练,这有助于加快训练过程和提高模型性能。

optimizer

  • optimizer: 选择要使用的优化器。优化器是深度学习中用于调整模型参数以最小化损失函数的算法。可以选择不同的优化器,如 SGDAdamAdamWRMSProp,根据任务需求选择适合的优化器。

verbose

  • verbose: 是否打印详细输出。如果设置为 True,训练过程中会输出更详细的信息和日志。如果设置为 False,只会输出关键信息和结果。

seed

  • seed: 随机种子,用于实现可重复性。通过设置相同的随机种子,可以使得每次运行时的随机过程保持一致,以便于结果的复现。

deterministic

  • deterministic: 是否启用确定性模式。启用确定性模式后,保证在相同的输入下,每次运行的结果是确定的,不会受到随机性的影响。

single_cls

  • single_cls: 将多类数据训练为单类。如果设置为 True,将会将多类数据视为单一类别进行训练。

rect

  • rect: 使用矩形训练,每个批次进行最小填充。设置为 True 后,训练过程中使用矩形形状的图像批次,并进行最小化填充。

cos_lr

  • cos_lr: 使用余弦学习率调度器。如果设置为 True,将使用余弦函数调整学习率的变化情况。

close_mosaic

  • close_mosaic: 禁用mosaic增强的最后第几个轮次。可以指定一个整数值,表示在训练的最后第几个轮次中禁用mosaic增强。

mosaic是什么

Mosaic数据增强方法是YOLOV4论文中提出来的,主要思想是将四张图片进行随机裁剪,再拼接到一张图上作为训练数据。这样做的好处是丰富了图片的背景,并且四张图片拼接在一起变相地提高了batch_size,在进行batch normalization的时候也会计算四张图片,所以对本身batch_size不是很依赖,单块GPU就可以训练YOLOV4。

YOLOV4论文YOLOv4: Optimal Speed and Accuracy of Object Detection

resume

  • resume: 从最后一个检查点恢复训练。如果设置为 True,将从最后一个检查点的状态继续训练。

用于训练任务中断后,重新启动上次的训练。

amp

  • amp: 是否使用自动混合精度(Automatic Mixed Precision,AMP)训练。AMP 是一种深度学习训练技术,利用半精度浮点数加速训练过程,可以减少显存占用。

lr0

  • lr0: 初始学习率。学习率是控制模型参数更新步幅的超参数,初始学习率确定了训练开始时的参数更新速度。

lrf

  • lrf: 最终学习率。最终学习率是通过初始学习率乘以一个比例系数得到的,用于控制训练过程中学习率的衰减。

注意lrf其实是系数,最终学习率相较于初始学习率的系数。

momentum

  • momentum: SGD 优化器的动量Adam 优化器的 beta1。动量是一种加速梯度下降过程的技术,用于增加参数更新的稳定性。

weight_decay

  • weight_decay: 优化器的权重衰减(weight decay)。权重衰减是一种正则化技术,用于减小模型复杂度,防止过拟合。

warmup_epochs

  • warmup_epochs: 热身阶段的轮数。热身阶段是训练过程中初始阶段的一部分,在此阶段内,学习率和动量等参数逐渐增加,以帮助模型更好地适应训练数据。

warmup_momentum

  • warmup_momentum: 热身阶段的初始动量。在热身阶段开始时,动量的初始值。

warmup_bias_lr

  • warmup_bias_lr: 热身阶段的初始偏置学习率。在热身阶段开始时,偏置学习率的初始值。

box、cls

  • box: 边界框损失权重。用于调整边界框损失的权重,以控制其在总损失中的贡献程度。

  • cls: 类别损失权重。用于调整类别损失的权重,以控制其在总损失中的贡献程度(按像素进行缩放)。

调整策略

如果你想更强调一些分类也就是更精准的类别判断你可以增加cls的值;如果你想更强调一些边界框的定位你可以增加box的值。

这个两个权重我认为也可以根据你目前训练输出的边界框损失数值和分类损失数值来判断。

dfl

  • dfl: DFL(Distribution Focal Loss)损失权重。用于调整 DFL 损失的权重,以控制其在总损失中的贡献程度。

pose

  • pose: 姿态损失权重(仅姿态)。用于调整姿态损失的权重,以控制其在总损失中的贡献程度(仅应用于姿态相关任务)。

kobj

  • kobj: 关键点目标损失权重(仅姿态)。用于调整关键点目标损失的权重,以控制其在总损失中的贡献程度(仅应用于姿态相关任务)。

label_smoothing

  • label_smoothing: 标签平滑(label smoothing)。标签平滑是一种正则化技术,用于减少模型对训练数据的过拟合程度。

标签平滑

label smoothing就是把原来的one-hot表示的标签,在每一维上都添加了一个随机噪音。 具体可以参考这篇文章标签平滑Label Smoothing

image-20240117152239503

nbs

  • nbs: 标准批次大小(nominal batch size)。指定训练过程中每个批次的大小。

overlap_mask

  • overlap_mask: 训练时是否要求蒙版重叠(仅用于分割训练)。如果设置为 True,要求训练过程中的蒙版(mask)重叠。

mask_ratio

  • mask_ratio: 蒙版下采样比例(仅用于分割训练)。用于控制蒙版下采样的比例。

dropout

  • dropout: 是否使用丢弃正则化(dropout regularization)(仅用于分类训练)。如果设置为非零值,则在训练过程中使用丢弃正则化来减少模型的过拟合。

val

  • val: 是否在训练过程中进行验证/测试。如果设置为 True,将在训练过程中进行验证或测试,以评估模型的性能。