YOLO(You Only Look Once)是一种实时目标检测算法,最早由 Joseph Redmon 等人于2016年提出。与传统的目标检测算法相比,YOLO具有速度快、精度高、可扩展性强等优点,因此在计算机视觉领域得到了广泛的应用。
YOLO的训练过程包括两个主要步骤:数据收集和模型训练。
数据收集:需要收集大量的带有标注的数据集,包括图像和对应的目标标注信息。标注信息通常使用边界框和类别标签来表示目标的位置和类型。
[YOLOv8] 缺陷检测之数据集标注(LabelImg,LabelMe,AnyLabeling,LabelStudio等)
模型训练:使用收集到的数据集对YOLO模型进行训练,通过反向传播算法不断调整模型参数,使其能够更好地拟合数据分布,从而提高检测准确率。
[YOLOv8] 详细教程 - 缺陷检测之训练自定义数据集(含图文)
YOLO的训练过程使用了卷积神经网络(CNN)的结构,将输入图像划分为多个网格单元,并在每个网格单元中预测目标的位置和类别概率分布。同时,YOLO还采用了一些技巧来加速训练和提高检测速度,例如使用梯度裁剪、走分层和融合技术等。
YOLO模型的训练设置是指用于对数据集进行模型训练的各种超参数和配置。这些设置会影响模型的性能、速度和准确性。一些常见的YOLO训练设置包括批大小、学习率、动量和权重衰减。其他可能影响训练过程的因素包括优化器的选择、损失函数的选择以及训练数据集的大小和组成。仔细调整和实验这些设置以实现给定任务的最佳性能是非常重要的。
?
from ultralytics import YOLO
if __name__ == '__main__':
# 加载一个模型
model = YOLO('D:/my_project/wepy/src/wepy/aitool/train/runs/detect/train3/weights/best.pt') # 从权重文件初始化模型
# model = YOLO('yolov8n.yaml') # 从YAML建立一个新模型
# 训练模型
results = model.train(
data='D:/YOLOv8Train/jj_dataset/data.yaml',
device='0',
epochs=200, # 训练过程中整个数据集将被迭代多少次,显卡不行你就调小点
batch=8, # 一次看完多少张图片才进行权重更新
verbose=False,
patience=0,
save=True,
save_period=10,
imgsz=640)
指定了所使用的模型文件的位置,例如 yolov8n.pt 或 yolov8n.yaml。
“.yaml”和“.pt”和的区别:
“.pt”类型的文件,是预训练好的模型,里面包含了模型的网络结构和训练好的参数,已经具备了检测目标的能力。如果是自定义训练数据集特别大,非常耗时,可以使用上次训练好的模型(“.pt”文件)来开始训练,这样可以缩短训练时间。
“.yaml”文件描述了模型的网络结构,对于训练自定义的数据集,开始我们一般采用yolov8n.yaml这种.yaml文件的形式,等训练完生成“.pt”文件之后,可以考虑切换到“.pt”,但是并不意味这使用上一次训练生成的“.pt”文件来训练,就一定比使用“.yaml”文件重新训练要好。
训练数据集文件的位置,例如 coco128.yaml,或者自定义的数据集data.yaml。数据集文件包含了训练和验证所需的图像、标签。
例如:
names:
0: normal
1: dip
2: black_hole
3: bubble
nc: 4
test: D:\YOLOv8Train\v8_train_datasets\jj_dataset\test
train: D:\YOLOv8Train\v8_train_datasets\jj_dataset\train
val: D:\YOLOv8Train\v8_train_datasets\jj_dataset\val
训练的轮数,默认值100。该参数设定了模型将会被训练多少次,每一轮都遍历整个训练数据集。训练的轮数越多,模型对数据的学习就越充分,但也增加了训练时间。
设置策略:
默认是100轮数。但一般对于自定义数据集,可以加大到300,可以观察每一轮训练的指标(mAP,Recall,Precision)来手动提前停止,或者通过“patience”参数来提前停止训练。
早停的等待轮数,默认值50。在训练过程中,如果在一定的轮数内没有观察到模型性能的明显提升,就会停止训练。这个参数确定了等待的轮数,如果超过该轮数仍没有改进,则停止训练。
为什么要早停?
早停能减少过拟合。过拟合(overfitting)是指只能拟合训练数据,但不能很好地拟合不包含在训练数据中的其他数据的状态。
每批图像数量(-1为自动批大小)。在训练过程中,数据被分成多个批次进行处理,每个批次包含一定数量的图像。这个参数确定了每个批次中包含的图像数量。如果设置为“-1”,则会自动调整批次大小,至你的显卡能容纳的最多图像数量。
设置策略:
每完成一批图像的训练,就会计算loss,进行权重参数的更新。如果你的数据集比较大,一般认为batch越大越好。因为batch越大意味batch中的图像更有可能代表整个数据集的分布,从而帮助模型更好的学习。但batch越大占的用显卡显存空间越多,你可以先设置一个偏大的值,比如32,如果报显存溢出,逐步减少调整到一个占用80%~90%之间的CPU占用率的batch值即可。
输入图像的大小,以整数表示,默认值为640。可以指定一个整数值表示图像的宽和高为相同值,也可以是宽度和高度的组合。例如640表示图像的宽度和高度均为640像素。
设置策略:
YOLOv8官网提供的训练集的imgsz基本上都是使用640。如果数据集中存在大量小对象,增大输入图像的尺寸imgsz可以使得这些小对象从高分辨率中受益,更好的被检测出。你可以根据你收集的数据集的图像特点,图像大小分布,来进行自定义,看看哪个imgsz效果最好。
是否保存训练的检查点和预测结果,默认值为True。当设置为true时,模型的权重和训练状态会被保存下来,以便在需要时进行恢复或继续训练。预测结果也可以被保存下来以供后续分析和评估。
每x轮次保存检查点(如果<1则禁用),默认值为“-1”。该参数用来设置保存检查点的频率,例如设置为10表示每隔10次训练轮数保存一次检查点。如果设置为负数,则表示禁用中间过程保存检查点功能。
使用场景:
如果训练因为不稳定中断后,可以和“resume”参数配合从中断前保存下来的检查点开始继续训练。
?从最后检查点恢复训练,默认为 False。如果设置为 True,将从最后一个检查点的状态继续训练。
数据加载时是否使用缓存,默认为 False。该参数用来控制是否将数据加载到缓存中,以加快训练过程中的数据读取速度。如果为 True,选择在 RAM 内存中缓存数据,如果为 False,则从磁盘上上读取图像数据。
训练运行的设备,默认值为None。例如使用CUDA?GPU 运行可以设定为 “device=0”,如果使用多个 GPU 运行可以设定为 “device=0,1,2,3”,如果没有可用的 GPU,可以设定为 “device=cpu” 使用 CPU 进行训练。数据集比较大时,使用cpu基本上是训练不动的,速度会非常慢。
数据加载时的工作线程数(如果DDP则为每个RANK),默认值为8(目前主流的cpu都8核心以上)。这个参数确定了加载数据时使用的线程数,在数据加载过程中,可以使用增加workers值,以提高数据读取速度,具体的最佳值取决于硬件(CPU的个数)和数据集的大小。
项目名称,默认值为None。这个参数用于标识当前训练任务所属的项目,方便管理和组织多个训练任务。
实验名称,默认值名None。该参数为当前训练任务指定一个名称,以便于标识和区分不同的实验,
是否覆盖现有的实验,默认值为False。如果设置为 True,当实验名称已经存在时,将会覆盖现有实验。如果设置为 false,当实验名称已经存在时,将会报错。
是否使用预训练模型,默认值为True。如果设置为 True,将加载预训练的模型权重进行训练,这有助于加快训练过程和提高模型性能。该参数需要和“model”参数结合使用,如果“model”参数设置的不是“.pt”文件,该参数无效。
选择要使用的优化器,默认值为auto。优化器是深度学习中用于调整模型参数以最小化损失函数的算法。可以选择不同的优化器,如 ‘SGD’、‘Adam’、‘AdamW’、‘RMSProp’,根据任务需求选择适合的优化器。
是否打印详细输出,默认值为False。如果设置为 True,训练过程中会输出更详细的信息和日志,可以更好的帮助我们了解训练的细节。如果设置为 False,只会输出关键信息和结果。
随机种子,用于实现可重复性,默认为0。通过设置相同的随机种子,可以使得每次运行时的随机过程保持一致,以便于结果的复现。
是否启用确定性模式,默认值为True。启用确定性模式后,保证在相同的输入下,每次运行的结果是确定的,不会受到随机性的影响。(该参数和“seed”参数是否存在关系?)
non-deterministic inference by Yolov8 · Issue #3497 · ultralytics/ultralytics · GitHub
将多类数据训练为单类,默认值为False。如果设置为 True,将会将多类数据视为单一类别进行训练。
使用矩形训练,每个批次进行最小填充,默认值为False。
矩形训练是什么?
yolov5中的Rectangular training和Rectangular inference
使用余弦学习率调度器,默认值为False。如果设置为 True,将使用余弦函数调整学习率的变化情况。
余弦学习率调度器是一种常见的学习率调度算法,用于在训练神经网络时调整模型参数的更新步长。它根据当前训练的进度和预设的目标,按照余弦函数的方式来调整学习率的大小,使得模型能够更好地收敛到最优解。
具体来说,余弦学习率调度器会在每个训练周期开始时计算一个初始的学习率,然后在训练过程中不断调整该学习率的大小和方向,以满足不同的训练目标。通常情况下,余弦学习率调度器会在训练初期采用较大的学习率,以便快速探索参数空间;而在训练后期则会逐渐减小学习率,以保证模型能够稳定收敛到最优解。
余弦学习率调度器的优点在于其具有自适应性、可调节性和普适性等特点,可以适用于不同的神经网络结构和训练场景。同时,由于其简单易实现且效果良好,因此被广泛应用于深度学习领域的各种应用中。
最后轮次禁用马赛克增强(0为禁用),默认值为10。可以设定一个整数值,表示在训练的最后第几个轮次中禁用mosaic增强。
mosaic是什么?
mosaic数据增强是一种在YOLOv4中首次引入的数据增强技术,它可以将4张训练图像以一定的比例合并成一张。 这样可以让模型学习如何在比正常更小的尺度上识别物体,也可以在训练中显著减少对大批量大小的需求。
Mosaic数据增强方法是YOLOV4论文中提出来的,主要思想是将四张图片进行随机裁剪,再拼接到一张图上作为训练数据。
这样做有以下几个优点:
1、增加了数据的多样性,丰富了图片的背景。
2、增加了目标个数
3、四张图片拼接在一起变相地提高了batch_size,在进行BN操作时的时候可以更好的统计均值和方差
YOLOv4: Optimal Speed and Accuracy of Object Detection
数据增强之Mosaic数据增强的优点、Mixup,Cutout,CutMix的区别_mosaic data augmentation
是否使用自动混合精度(Automatic Mixed Precision,AMP)训练,默认为True。AMP 是一种深度学习训练技术,利用半精度浮点数加速训练过程,可以减少显存占用。
训练的数据集比例,默认为1.0(即训练集中的所有图像)。
在训练期间为记录器分析ONNX和TensorRT速度。默认值为False。
在训练期间冻结前n层,或冻结层索引列表(int 或 list, 可选)。默认值为None。
初始学习率,默认值为0.01。学习率是控制模型参数更新步幅的超参数,初始学习率确定了训练开始时的参数更新速度。
最终学习率系数,最终学习率=?(lr0 * lrf),默认值为0.01。最终学习率是通过初始学习率乘以该比例系数得到的,用于控制训练过程中学习率的衰减。
SGD 优化器的动量/Adam 优化器的 beta1,默认值为0.937。动量是一种加速梯度下降过程的技术,用于增加参数更新的稳定性。
动量是什么?
动量(Momentum)是一种常用的机器学习优化算法,用于加速梯度下降过程并提高模型的收敛速度和准确性。它通过在每次迭代时沿着梯度方向更新模型参数的同时,引入一个动量项来抵消之前梯度下降过程中的惯性效应,从而更好地利用历史信息进行优化。
具体来说,动量的思想是将之前的梯度乘上一个系数(通常取值为0.9),然后将这个结果加到当前的梯度上,得到新的梯度。在更新模型参数时,不仅要考虑当前的梯度大小,还要考虑之前更新过的参数对梯度的影响。这样可以使得模型在训练初期更快地朝最优解靠近,同时也可以避免陷入局部最优解。
动量算法的优点在于其简单易实现且效果良好,可以适用于各种机器学习任务中。同时,由于其具有一定的鲁棒性和泛化能力,因此也被广泛应用于深度学习领域的各种应用中。
优化器的权重衰减(weight decay),默认值为0.0005。
权重衰减是什么?
权重衰减是一种正则化技术,用于减小模型复杂度,防止过拟合。
深度学习中权重衰减(Weight Decay)是一种常用的正则化技术,用于防止模型过拟合和梯度消失等问题。它通过在损失函数中添加一个与模型参数大小相关的正则项来实现,使得模型的参数更新更加稳定和可控。
具体来说,权重衰减的思想是在损失函数中添加一个与模型参数大小相关的正则项,例如L1正则化或L2正则化。对于L1正则化,正则项为所有模型参数的绝对值之和;对于L2正则化,正则项为所有模型参数的平方和。在每次参数更新时,除了考虑当前的梯度大小外,还需要将正则项加入到梯度中进行更新。
权重衰减的优点在于其简单易实现且效果良好,可以适用于各种深度学习任务中。同时,由于其具有一定的鲁棒性和泛化能力,因此也被广泛应用于深度学习领域的各种应用中。需要注意的是,权重衰减也有可能会导致模型收敛速度变慢或者陷入局部最优解,因此需要根据具体情况进行权衡和选择。
热身阶段的轮数,默认值3.0。热身阶段是训练过程中初始阶段的一部分,在此阶段内,学习率和动量等参数逐渐增加,以帮助模型更好地适应训练数据。
热身阶段的初始动量,默认值为0.8。在热身阶段开始时,动量的初始值。
热身阶段的初始偏置学习率,默认为0.1。在热身阶段开始时,偏置学习率的初始值。
边界框损失权重,默认值为7.5。用于调整边界框损失的权重,以控制其在总损失中的贡献程度
如果你希望更精准的边界框的定位你可以增加box的值。
类别损失权重,默认值为0.5。用于调整类别损失的权重,以控制其在总损失中的贡献程度(按像素进行缩放)。
如果你希望更精准的类别判断你可以增加cls的值。
DFL(Dynamic Freezing Loss)损失权重,默认值为1.5。用于调整 DFL 损失的权重,以控制其在总损失中的贡献程度。
DFL是什么?
Dynamic Freezing Loss是一种用于目标检测任务中的损失函数,它可以有效地解决目标检测中存在的类别不平衡问题。传统的目标检测损失函数通常采用交叉熵损失函数,但这种损失函数对于小样本数据集和少数类样本的预测效果较差。
Dynamic Freezing Loss通过引入一个动态阈值来解决这个问题。具体来说,它在计算损失时会根据当前模型对每个类别的预测置信度来动态地调整阈值,使得模型对于少数类样本的预测更加准确。当模型对某个类别的预测置信度低于阈值时,该类别的损失会被设置为一个较大的值,从而增加模型对该类别的关注度;反之,当模型对某个类别的预测置信度高于阈值时,该类别的损失会被设置为一个较小的值,从而减少模型对该类别的关注度。
Dynamic Freezing Loss的优点在于其可以有效地解决目标检测中的类别不平衡问题,提高模型对于少数类样本的预测精度。同时,由于其具有一定的可解释性,因此也可以用于解释模型的预测结果。
DFL应用于类别不平衡的情形(当某些类别出现频率过高,而另一些类别出现频率较低)。
Focal Loss for Dense Object Detection
姿态损失权重(仅姿态),默认值为12.0。用于调整姿态损失的权重,以控制其在总损失中的贡献程度(仅应用于姿态相关任务)。
关键点目标损失权重(仅姿态),默认值为2.0。用于调整关键点目标损失的权重,以控制其在总损失中的贡献程度(仅应用于姿态相关任务)。
标签平滑(label smoothing),默认值为0.0。标签平滑是一种正则化技术,用于减少模型对训练数据的过拟合程度。
标签平滑是什么?
标签平滑(Label Smoothing)是一种用于解决目标检测任务中类别不平衡问题的技术,它通过给每个类别的标签分配一个额外的概率值来实现。具体来说,对于一个有n个类别的数据集,标签平滑会为每个类别分配一个介于0和1之间的概率值,例如p = 0.1表示将某个类别的标签概率降低10%。
在目标检测任务中,通常会出现一些类别的样本数量远远少于其他类别的情况,例如人脸检测中的“人”类别就经常出现这种情况。如果直接使用交叉熵损失函数进行训练,会导致模型对于这些少数类样本的预测效果较差。而标签平滑可以通过给这些少数类样本的标签分配更高的概率值来提高模型的预测精度。
需要注意的是,标签平滑也有可能会导致模型对某些类别的预测效果变差,因此需要根据具体情况进行权衡和选择。此外,标签平滑也可以与权重衰减等技术结合使用,以进一步提高模型的鲁棒性和泛化能力。
标准批次大小(nominal batch size),默认值为64。设置训练过程中每个批次的大小。
训练时是否要求蒙版重叠(仅用于分割训练),默认值为True。如果设置为 True,则要求训练过程中的蒙版(mask)重叠。
蒙版下采样比例(仅用于分割训练),默认值为4。用于控制蒙版下采样的比例。
是否使用丢弃正则化(dropout regularization)(仅用于分类训练),默认值为0.0。如果设置为非零值,则在训练过程中使用丢弃正则化来减少模型的过拟合。
是否在训练过程中进行验证/测试,默认值为True。如果设置为 True,将在训练过程中进行验证或测试,以评估模型的性能。
?