示例代码
后续讲解的参数都可以像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=True
,train
函数将从'path/to/last.pt'文件中存储的状态继续训练。如果省略resume
参数或将其设置为False
,train
函数将启动新的训练会话。
请记住,默认情况下,检查点会在每个时期结束时保存,或者使用save_period
参数以固定间隔保存,因此您必须至少完成1个时期才能恢复训练运行。
训练参数
全部参数
首先罗列一下官网提供的全部参数。
键 | 值 | 描述 |
---|---|---|
|
| 模型文件路径,例如 yolov8n.pt, yolov8n.yaml |
|
| 数据文件路径,例如 coco128.yaml |
|
| 训练的轮次数量 |
|
| 早停训练的等待轮次 |
|
| 每批图像数量(-1为自动批大小) |
|
| 输入图像的大小,以整数表示 |
|
| 保存训练检查点和预测结果 |
|
| 每x轮次保存检查点(如果<1则禁用) |
|
| True/ram, disk 或 False。使用缓存加载数据 |
|
| 运行设备,例如 cuda device=0 或 device=0,1,2,3 或 device=cpu |
|
| 数据加载的工作线程数(如果DDP则为每个RANK) |
|
| 项目名称 |
|
| 实验名称 |
|
| 是否覆盖现有实验 |
|
| (bool 或 str) 是否使用预训练模型(bool)或从中加载权重的模型(str) |
|
| 使用的优化器,选择范围=[SGD, Adam, Adamax, AdamW, NAdam, RAdam, RMSProp, auto] |
|
| 是否打印详细输出 |
|
| 随机种子,用于可重复性 |
|
| 是否启用确定性模式 |
|
| 将多类数据作为单类训练 |
|
| 矩形训练,每批为最小填充整合 |
|
| 使用余弦学习率调度器 |
|
| (int) 最后轮次禁用马赛克增强(0为禁用) |
|
| 从最后检查点恢复训练 |
|
| 自动混合精度(AMP)训练,选择范围=[True, False] |
|
| 训练的数据集比例(默认为1.0,即训练集中的所有图像) |
|
| 在训练期间为记录器分析ONNX和TensorRT速度 |
|
| (int 或 list, 可选) 在训练期间冻结前n层,或冻结层索引列表 |
|
| 初始学习率(例如 SGD=1E-2, Adam=1E-3) |
|
| 最终学习率 (lr0 * lrf) |
|
| SGD动量/Adam beta1 |
|
| 优化器权重衰减5e-4 |
|
| 热身轮次(小数ok) |
|
| 热身初始动量 |
|
| 热身初始偏差lr |
|
| 框损失增益 |
|
| cls损失增益(根据像素缩放) |
|
| dfl损失增益 |
|
| 姿态损失增益(仅限姿态) |
|
| 关键点obj损失增益(仅限姿态) |
|
| 标签平滑(小数) |
|
| 标称批大小 |
|
| 训练期间掩码应重叠(仅限分割训练) |
|
| 掩码降采样比率(仅限分割训练) |
|
| 使用dropout正则化(仅限分类训练) |
|
| 训练期间验证/测试 |
model
model
: 模型文件的路径。这个参数指定了所使用的模型文件的位置,例如 yolov8n.pt
或 yolov8n.yaml
。
选择.pt和.yaml的区别
.pt
类型的文件是从预训练模型的基础上进行训练。若我们选择yolov8n.pt
这种.pt类型的文件,其实里面是包含了模型的结构和训练好的参数的,也就是说拿来就可以用,就已经具备了检测目标的能力了,yolov8n.pt
能检测coco中的80个类别。假设你要检测不同种类的狗,那么yolov8n.pt
原本可以检测狗的能力对你训练应该是有帮助的,你只需要在此基础上提升其对不同狗的鉴别能力即可。但如果你需要检测的类别不在其中,例如口罩检测,那么就帮助不大。.yaml
文件是从零开始训练。采用yolov8n.yaml
这种.yaml文件的形式,在文件中指定类别,以及一些别的参数。
模型种类选择,是n,s,m,还是l,x?
像 YOLOv8x
和 YOLOv8x6
这样较大模型几乎在所有情况下都会产生更好的结果,但参数量更大,需要更多的显卡内存来训练,并且运行速度更慢。
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可以使得这些小对象从高分辨率中受益,更好的被检测出。从官网放出的性能表也可以看出。
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
: 选择要使用的优化器。优化器是深度学习中用于调整模型参数以最小化损失函数的算法。可以选择不同的优化器,如SGD
、Adam
、AdamW
、RMSProp
,根据任务需求选择适合的优化器。
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
nbs
nbs
: 标准批次大小(nominal batch size)。指定训练过程中每个批次的大小。
overlap_mask
overlap_mask
: 训练时是否要求蒙版重叠(仅用于分割训练)。如果设置为 True,要求训练过程中的蒙版(mask)重叠。
mask_ratio
mask_ratio
: 蒙版下采样比例(仅用于分割训练)。用于控制蒙版下采样的比例。
dropout
dropout
: 是否使用丢弃正则化(dropout regularization)(仅用于分类训练)。如果设置为非零值,则在训练过程中使用丢弃正则化来减少模型的过拟合。
val
val
: 是否在训练过程中进行验证/测试。如果设置为 True,将在训练过程中进行验证或测试,以评估模型的性能。