模型培训Ultralytics YOLO
导言
训练深度学习模型包括向其输入数据并调整其参数,使其能够做出准确的预测。Ultralytics YOLOv8 中的 "训练 "模式充分利用现代硬件能力,专为高效训练物体检测模型而设计。本指南旨在介绍使用YOLOv8 的强大功能集开始训练自己的模型所需的所有细节。
观看: 如何在 Google Colab 的自定义数据集上训练YOLOv8 模型。
为什么选择Ultralytics YOLO 进行培训?
以下是选择YOLOv8"火车模式 "的一些令人信服的理由:
- 效率:充分利用硬件,无论是单 GPU 设置还是跨多个 GPU 扩展。
- 多功能性:除 COCO、VOC 和 ImageNet 等现成数据集外,还可在自定义数据集上进行训练。
- 用户友好型:简单而强大的CLI 和Python 界面,提供直接的培训体验。
- 超参数灵活性:可定制的超参数范围广泛,可对模型性能进行微调。
列车模式的主要功能
以下是YOLOv8"火车 "模式的一些显著特点:
- 自动下载数据集:首次使用时会自动下载 COCO、VOC 和 ImageNet 等标准数据集。
- 多 GPU 支持:在多个 GPU 上无缝扩展培训工作,加快进程。
- 超参数配置:通过 YAML 配置文件或CLI 参数修改超参数的选项。
- 可视化和监控:实时跟踪培训指标和可视化学习过程,以获得更好的洞察力。
提示
- YOLOv8 数据集,如 COCO、VOC、ImageNet 和许多其他数据集,会在首次使用时自动下载,即
yolo train data=coco.yaml
使用示例
在图像大小为 640 的 COCO8 数据集上对YOLOv8n 进行 100 次训练。可以使用 device
参数。如果没有传递参数,GPU device=0
将被使用,否则 device='cpu'
将被使用。有关训练参数的完整列表,请参阅下面的 "参数 "部分。
单 GPU 和 CPU 培训示例
设备自动确定。如果 GPU 可用,则使用 GPU,否则将使用 CPU 开始训练。
from ultralytics import YOLO
# Load a model
model = YOLO('yolov8n.yaml') # build a new model from YAML
model = YOLO('yolov8n.pt') # load a pretrained model (recommended for training)
model = YOLO('yolov8n.yaml').load('yolov8n.pt') # build from YAML and transfer weights
# Train the model
results = model.train(data='coco8.yaml', epochs=100, imgsz=640)
# Build a new model from YAML and start training from scratch
yolo detect train data=coco8.yaml model=yolov8n.yaml epochs=100 imgsz=640
# Start training from a pretrained *.pt model
yolo detect train data=coco8.yaml model=yolov8n.pt epochs=100 imgsz=640
# Build a new model from YAML, transfer pretrained weights to it and start training
yolo detect train data=coco8.yaml model=yolov8n.yaml pretrained=yolov8n.pt epochs=100 imgsz=640
多 GPU 培训
多 GPU 训练通过在多个 GPU 上分配训练负载,可以更有效地利用可用的硬件资源。该功能可通过Python API 和命令行界面使用。要启用多 GPU 训练,请指定要使用的 GPU 设备 ID。
多 GPU 培训示例
要使用 2 个 GPU(CUDA 设备 0 和 1)进行训练,请使用以下命令。根据需要扩展到其他 GPU。
苹果 M1 和 M2 MPS 培训
Ultralytics YOLO 机型中集成了对 Apple M1 和 M2 芯片的支持,现在可以在使用强大的金属高性能着色器 (MPS) 框架的设备上训练模型。MPS 提供了一种在苹果定制芯片上执行计算和图像处理任务的高性能方法。
要在 Apple M1 和 M2 芯片上启用训练,应在启动训练程序时指定 "mps "为设备。下面是一个示例,说明如何在Python 和通过命令行执行此操作:
MPS 培训示例
在充分利用 M1/M2 芯片计算能力的同时,还能更高效地处理训练任务。有关更详细的指导和高级配置选项,请参阅PyTorch MPS 文档。
恢复中断的培训
在使用深度学习模型时,从先前保存的状态恢复训练是一项至关重要的功能。这在各种情况下都能派上用场,比如当训练过程意外中断时,或者当你希望用新数据或更多的历时继续训练模型时。
恢复训练时,Ultralytics YOLO 会加载上次保存模型的权重,并恢复优化器状态、学习率调度器和历时编号。这样,您就可以从上次中断的地方无缝地继续训练过程。
Ultralytics YOLO 您可以通过设置 resume
参数 True
在调用 train
方法的路径,并指定 .pt
文件,其中包含经过部分训练的模型权重。
下面举例说明如何使用Python 和通过命令行恢复中断的训练:
简历培训范例
通过设置 resume=True
,"...... train
函数将使用存储在 "path/to/last.pt "文件中的状态,从中断处继续训练。如果 resume
参数被省略或设置为 False
,"...... train
功能将开始新的培训课程。
请记住,默认情况下,检查点会在每个纪元结束时保存,或者使用 save_period
参数,因此您必须至少完成一个纪元才能恢复训练运行。
列车设置
YOLO 模型的训练设置包括训练过程中使用的各种超参数和配置。这些设置会影响模型的性能、速度和准确性。关键的训练设置包括批量大小、学习率、动量和权重衰减。此外,优化器、损失函数和训练数据集组成的选择也会影响训练过程。对这些设置进行仔细的调整和实验对于优化性能至关重要。
论据 | 默认值 | 说明 |
---|---|---|
model |
None |
指定用于训练的模型文件。接受指向 .pt 预训练模型或 .yaml 配置文件。对于定义模型结构或初始化权重至关重要。 |
data |
None |
数据集配置文件的路径(例如 coco8.yaml ).该文件包含特定于数据集的参数,包括训练数据和验证数据的路径、类名和类数。 |
epochs |
100 |
训练历元总数。每个历元代表对整个数据集进行一次完整的训练。调整该值会影响训练时间和模型性能。 |
time |
None |
最长训练时间(小时)。如果设置了该值,则会覆盖 epochs 参数,允许训练在指定的持续时间后自动停止。对于时间有限的训练场景非常有用。 |
patience |
100 |
在验证指标没有改善的情况下,提前停止训练所需的历元数。当性能趋于平稳时停止训练,有助于防止过度拟合。 |
batch |
16 |
训练的批量大小,表示在更新模型内部参数之前要处理多少张图像。自动批处理 (batch=-1 )会根据 GPU 内存可用性动态调整批处理大小。 |
imgsz |
640 |
用于训练的目标图像尺寸。所有图像在输入模型前都会被调整到这一尺寸。影响模型精度和计算复杂度。 |
save |
True |
可保存训练检查点和最终模型权重。这对恢复训练或模型部署非常有用。 |
save_period |
-1 |
保存模型检查点的频率,以 epochs 为单位。值为-1 时将禁用此功能。该功能适用于在长时间训练过程中保存临时模型。 |
cache |
False |
在内存中缓存数据集图像 (True /ram )、磁盘 (disk ),或禁用它 (False ).通过减少磁盘 I/O 提高训练速度,但代价是增加内存使用量。 |
device |
None |
指定用于训练的计算设备:单个 GPU (device=0 )、多个 GPU (device=0,1 )、CPU (device=cpu ),或苹果芯片的 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 等,或 auto 用于根据模型配置进行自动选择。影响收敛速度和稳定性 |
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 |
损失函数中边框损失部分的权重,影响对准确预测边框坐标的重视程度。 |
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 |
分类任务中正则化的丢弃率,通过在训练过程中随机省略单元来防止过拟合。 |
val |
True |
可在训练过程中进行验证,以便在单独的数据集上对模型性能进行定期评估。 |
plots |
False |
生成并保存训练和验证指标图以及预测示例图,以便直观地了解模型性能和学习进度。 |
增强设置和超参数
增强技术通过在训练数据中引入可变性,帮助模型更好地泛化到未见数据中,对提高YOLO 模型的稳健性和性能至关重要。下表概述了每种增强参数的目的和效果:
论据 | 类型 | 默认值 | 范围 | 说明 |
---|---|---|---|---|
hsv_h |
float |
0.015 |
0.0 - 1.0 |
通过色轮的一部分来调整图像的色调,从而引入色彩的可变性。帮助模型在不同的光照条件下通用。 |
hsv_s |
float |
0.7 |
0.0 - 1.0 |
改变图像饱和度的一部分,影响色彩的强度。可用于模拟不同的环境条件。 |
hsv_v |
float |
0.4 |
0.0 - 1.0 |
将图像的数值(亮度)修改一部分,帮助模型在不同的光照条件下表现良好。 |
degrees |
float |
0.0 |
-180 - +180 |
在指定的度数范围内随机旋转图像,提高模型识别不同方向物体的能力。 |
translate |
float |
0.1 |
0.0 - 1.0 |
以图像大小的一小部分水平和垂直平移图像,帮助学习检测部分可见的物体。 |
scale |
float |
0.5 |
>=0.0 |
通过增益因子缩放图像,模拟物体与摄像机的不同距离。 |
shear |
float |
0.0 |
-180 - +180 |
按指定角度剪切图像,模拟从不同角度观察物体的效果。 |
perspective |
float |
0.0 |
0.0 - 0.001 |
对图像进行随机透视变换,增强模型理解三维空间中物体的能力。 |
flipud |
float |
0.0 |
0.0 - 1.0 |
以指定的概率将图像翻转过来,在不影响物体特征的情况下增加数据的可变性。 |
fliplr |
float |
0.5 |
0.0 - 1.0 |
以指定的概率将图像从左到右翻转,这对学习对称物体和增加数据集多样性非常有用。 |
bgr |
float |
0.0 |
0.0 - 1.0 |
以指定的概率将图像通道从 RGB 翻转到 BGR,用于提高对错误通道排序的稳健性。 |
mosaic |
float |
1.0 |
0.0 - 1.0 |
将四幅训练图像合成一幅,模拟不同的场景构成和物体互动。对复杂场景的理解非常有效。 |
mixup |
float |
0.0 |
0.0 - 1.0 |
混合两幅图像及其标签,创建合成图像。通过引入标签噪声和视觉变化,增强模型的泛化能力。 |
copy_paste |
float |
0.0 |
0.0 - 1.0 |
从一幅图像中复制物体并粘贴到另一幅图像上,用于增加物体实例和学习物体遮挡。 |
auto_augment |
str |
randaugment |
- | 自动应用预定义的增强策略 (randaugment , autoaugment , augmix ),通过丰富视觉特征来优化分类任务。 |
erasing |
float |
0.4 |
0.0 - 0.9 |
在分类训练过程中随机擦除部分图像,鼓励模型将识别重点放在不明显的特征上。 |
crop_fraction |
float |
1.0 |
0.1 - 1.0 |
将分类图像裁剪为其大小的一小部分,以突出中心特征并适应对象比例,减少背景干扰。 |
这些设置可根据数据集和手头任务的具体要求进行调整。试验不同的值有助于找到最佳的增强策略,从而获得最佳的模型性能。
信息
有关增强训练行动的更多信息,请参阅参考资料部分。
记录
在训练YOLOv8 模型的过程中,您可能会发现跟踪模型在一段时间内的表现很有价值。这就是日志发挥作用的地方。Ultralytics'YOLO 支持三种类型的日志记录器:Comet 、ClearML 和 TensorBoard。
要使用记录仪,请从上面代码片段的下拉菜单中选择并运行。所选记录仪将被安装和初始化。
Comet
Comet是一个允许数据科学家和开发人员跟踪、比较、解释和优化实验与模型的平台。它提供实时度量、代码差异和超参数跟踪等功能。
要使用Comet :
请记住在Comet 网站上登录您的账户并获取 API 密钥。您需要将此添加到环境变量或脚本中,以便记录实验日志。
ClearML
ClearML是一个开源平台,可自动跟踪实验并帮助高效共享资源。它旨在帮助团队更高效地管理、执行和复制他们的 ML 工作。
要使用ClearML :
运行该脚本后,您需要在浏览器上登录ClearML 账户并验证您的会话。
张量板
TensorBoard是TensorFlow 的可视化工具包。通过它,您可以将TensorFlow 图形可视化,绘制有关图形执行情况的量化指标,并显示通过图形的图像等附加数据。
在Google Colab 中使用 TensorBoard:
要在本地使用 TensorBoard,请运行以下命令并在 http://localhost:6006/ 上查看结果。
这将加载 TensorBoard 并将其导向保存训练日志的目录。
设置好记录仪后,您就可以开始模型训练了。所有训练指标都将自动记录在您选择的平台上,您可以访问这些日志来监控模型在一段时间内的表现,比较不同的模型,并找出需要改进的地方。
创建于 2023-11-12,更新于 2024-04-23
作者:dependabot[bot](1),glenn-jocher(10),fcakyon(1),Laughing-q(2),Burhan-Q(1)