cv 方向的 task 3 结束了,对其进行了一些简单的梳理并进行相应的一些扩展
教程:Datawhale
Task 3
1 . 数据集增强
1. 数据增强的目的
对现有数据集进行扩充和变换,从现有数据集中生成新的训练样本,增加数据的多样性和丰富性,从而提高模型的泛化能力和鲁棒性。
在实际应用中,模型往往会面临各种各样的情况,如果仅使用有限的原始数据进行训练,模型可能会过度拟合这些数据,导致在面对新的数据时表现不佳。通过数据增强,可以让模型学习到更多的变化和模式,使其能够更好地适应不同的场景和情况。
2. 数据增强的技术
常见的增强技术包括翻转、旋转、缩放和颜色调整等。
扩展:
传统几何变换方法:
随机裁剪:从原始图像中随机裁剪出一部分区域,作为新的训练样本。
亮度调整:对图像的亮度进行随机调整,增加数据的光照多样性。
对比度调整:改变图像的对比度,使模型对不同对比度的图像具有更好的适应性。
添加噪声:向图像中添加随机噪声,如高斯噪声、椒盐噪声等,以模拟真实世界中的噪声情况。
图像扭曲:对图像进行扭曲、变形等操作,增加数据的多样性。
镜像变换:对图像进行镜像操作,如左右镜像或上下镜像,使模型学习到物体的镜像特征。
混合图像:将两个或多个图像进行混合,生成新的图像,同时相应地混合标签,以增加数据的多样性和模型的泛化能力。
随机擦除:随机选择图像中的一部分区域并将其擦除,使模型学习到物体的部分缺失情况。
基于模型的数据增强方法:(利用机器学习模型来生成新的数据样本的技术)
生成对抗网络(Generative Adversarial Network,GAN): 由生成器和判别器组成。生成器试图生成逼真的假数据样本,而判别器则试图区分真实数据和生成器生成的数据。通过不断训练这两个网络,生成器可以学习到数据的分布,从而生成新的、与原始数据相似的数据样本。
变分自编码器(Variational Autoencoder,VAE):一种生成模型,它可以学习数据的潜在表示。通过对潜在表示进行采样,可以生成新的数据样本。VAE 可以用于图像、文本等数据的增强。
自训练和半监督学习:利用少量有标记数据进行模型的初步训练,然后使用训练好的模型对大量无标记数据进行预测,将预测结果作为伪标记数据。这些伪标记数据可以与原始数据一起用于进一步训练模型,从而实现数据增强的效果。
模型融合:结合多个不同的模型或模型的预测结果,生成新的数据样本。例如,可以使用多个模型对同一数据进行预测,然后将这些预测结果进行组合或融合,得到新的样本。
迁移学习:将在一个数据集上训练好的模型应用于另一个相关的数据集,并根据新数据集的特点进行微调。这种方法可以利用已有的模型知识,减少对大量数据的需求。
主动学习增强方法:
主动学习是一种通过选择最有价值的数据进行标注,从而减少数据标注工作量并提高模型性能的方法。通过主动学习增强方法,可以更加有效地利用有限的标注资源,提高数据的质量和模型的性能。同时,这种方法也可以减少对大量数据的需求,降低数据收集和标注的成本。主动学习增强方法的效果取决于数据的分布、模型的选择以及标注策略的合理性等因素。
推荐:
常用数据增强方法(基于pytorch)_pytorch,数据增强-CSDN博客
数据增强(Data Augmentation)常用方法汇总-CSDN博客
【深度学习】数据增强基本介绍和常用的数据增强方法-CSDN博客
总结 62 种在深度学习中的数据增强方式_stylemix: separating content and style for enhance-CSDN博客
3. 相关库
Albumentations、Imgaug 和 TensorFlow 的 ImageDataGenerator 等库可以实现这些增强。
Albumentations:一个功能强大的图像增强库,提供了丰富的图像变换操作,包括几何变换、颜色变换、添加噪声等。它支持多种数据格式,如 NumPy 数组、PIL 图像和 OpenCV 图像。
链接:albumentations — albumentations 1.1.0 documentation
Imgaug:一个广泛使用的图像增强库,它提供了各种各样的图像增强操作,并且可以很容易地与其他深度学习框架集成。
链接:GitHub - aleju/imgaug: Image augmentation for machine learning experiments.
TensorFlow 的 ImageDataGenerator: TensorFlow 提供的一个用于图像数据增强的工具,它可以自动进行数据增强操作,如翻转、旋转、缩放等,并且可以直接在训练过程中使用。
数据增强方法 | 描述 |
Mosaic Augmentation | 将四张训练图像组合成一张,增加物体尺度和位置的多样性。 |
Copy-Paste Augmentation | 复制一个图像的随机区域并粘贴到另一个图像上,生成新的训练样本。 |
Random Affine Transformations | 包括图像的随机旋转、缩放、平移和剪切,增加对几何变换的鲁棒性。 |
MixUp Augmentation | 通过线性组合两张图像及其标签创造合成图像,增加特征空间的泛化。 |
Albumentations | 一个支持多种增强技术的图像增强库,提供灵活的增强管道定义。 |
HSV Augmentation | 对图像的色相、饱和度和亮度进行随机变化,改变颜色属性。 |
Random Horizontal Flip | 沿水平轴随机翻转图像,增加对镜像变化的不变性。 |
2 . 设置 YOLO 模型训练参数
链接:Configuration - Ultralytics YOLO Docs
1. 训练设置的重要性
YOLO 模型的训练设置包括多种超参数和配置,这些设置会影响模型的性能、速度和准确性。
不同的训练参数组合会导致模型在训练过程中的收敛速度、最终的性能表现以及对不同数据集的适应性等方面存在差异。
2. 微调的作用
微调是指在使用预先训练的模型的基础上,根据具体的任务和数据集,对模型的参数进行进一步的调整和优化。由于预先训练的模型通常是在大规模数据上训练得到的,它已经学习到了一些通用的特征和模式。但是,对于特定的任务和数据集,这些通用的特征和模式可能并不完全适用。通过微调,可以使模型更好地适应特定的任务和数据集,提高模型的性能。
3. 常见参数
imgsz:图像尺寸的设置不仅会影响模型的准确性,还会对计算资源的需求产生影响。较大的图像尺寸可以提供更多的细节信息,有助于模型学习到更精确的特征,但同时也会增加计算量和内存消耗,导致训练时间延长。相反,较小的图像尺寸可以减少计算量和内存消耗,提高训练速度,但可能会损失一些细节信息,影响模型的准确性。
save_period:合理设置保存模型检查点的频率可以在训练过程中及时保存模型的进展,以便在训练中断或出现问题时能够从最近的检查点继续训练。同时,也可以避免频繁保存模型导致的存储资源浪费。
device:选择合适的计算设备可以充分利用硬件资源,提高训练效率。如果有多个 GPU 可用,可以考虑使用并行计算来加速训练。
optimizer:不同的优化器在训练过程中的表现不同,需要根据模型的特点和数据集的性质选择合适的优化器。例如,SGD 优化器在一些情况下可能更容易收敛,而 Adam 优化器在处理大规模数据时表现较好。
momentum:动量因子可以加速模型的收敛速度,减少震荡。较大的动量因子可以使模型在训练过程中更快地朝着最优解的方向前进,但也可能导致模型错过最优解。
weight_decay:L2 正则化项可以防止模型过拟合,通过对模型的参数进行约束,使模型更加简单和泛化能力更强。
warmup_epochs:学习率预热的周期数可以在训练开始时逐渐增加学习率,使模型更加稳定地开始训练,避免因为初始学习率过大而导致的训练不稳定。
warmup_momentum:预热阶段的初始动量可以与学习率预热相结合,进一步提高训练的稳定性。
warmup_bias_lr:预热阶段偏置参数的学习率可以单独设置,因为偏置参数的更新方式与其他参数不同,需要特殊处理。
box:边界框损失在损失函数中的权重可以调整模型对边界框预测的重视程度,从而影响模型的检测精度。
cls:分类损失在总损失函数中的权重可以控制模型对分类任务的关注程度,根据数据集的特点和任务需求进行合理设置。
dfl:分布焦点损失的权重可以影响模型对目标分布的学习,对于一些特定的任务和数据集,适当调整这个权重可以提高模型的性能。
4. 参数设置建议
在设置 YOLO 模型的训练参数时,需要综合考虑多个因素,包括数据集的大小、复杂度、计算资源的可用性等。一般来说,可以先使用默认参数进行训练,然后根据训练结果和模型的表现进行调整。例如,如果发现模型在训练过程中出现过拟合现象,可以适当增加 weight_decay 的值;如果模型的收敛速度较慢,可以调整 momentum 或 optimizer 的参数。此外,还可以通过交叉验证等方法来寻找最优的参数组合。
3 . 设置 YOLO 模型预测行为和性能
1. 预测结果的组成部分
YOLO 模型的预测结果通常包括多个组成部分,如边界框输出、分割掩码输出、姿态输出、分类输出、定向边界框输出、置信度得分等。
属性 | 描述 |
cls | 类别概率,表示当前预测结果属于类别0的概率为0。 |
conf | 置信度,模型对其预测结果的置信度,接近92%。 |
data | 包含边界框坐标和置信度以及类别概率的原始数据。 |
id | 没有分配唯一的对象ID。 |
is_track | 预测结果不是来自跟踪的对象。 |
orig_shape | 输入图像的原始尺寸,这里是500x500像素。 |
shape | 预测结果张量的形状,表示一个边界框的六个值。 |
xywh | 归一化的边界框坐标,中心坐标和宽高。 |
xywhn | 归一化的边界框坐标(无偏移)。 |
xyxy | 原始边界框坐标,左上角和右下角坐标。 |
xyxyn | 归一化的原始边界框坐标。 |
2. 数据处理能力
YOLO 模型具有强大的数据处理能力,使其在实际应用中展现出高度的灵活性。
图像集合处理:它能够同时对多个图像进行预测,显著提高了处理效率。这在需要批量处理图像的场景中非常有用,例如在大规模图像数据集上进行快速检测。
视频文件和实时视频流处理:对于视频文件,YOLO 模型可以逐帧进行预测,从而实现实时目标检测。这对于视频监控、智能驾驶等实时性要求较高的应用至关重要。在处理实时视频流时,它能够及时捕捉到视频中的目标信息,为后续的决策提供支持。
预处理功能:YOLO 模型具备对图像或视频进行预处理的能力。它可以根据需要调整图像大小,使其满足模型的输入要求。同时,还可以进行归一化等操作,以提高模型的训练和预测效果。通过这些预处理步骤,能够更好地适应不同的数据源和应用场景,确保模型的准确性和稳定性。
3. 参数调整的灵活性
YOLO 模型为用户提供了丰富的参数调整选项,使其能够根据特定应用场景的需求灵活地定制模型的行为和性能。
置信度阈值(conf 阈值)调整:通过提高 conf 阈值,可以减少误报的数量。这意味着模型会更加谨慎地做出预测,只有当它对预测结果有较高的信心时才会给出检测结果。然而,需要注意的是,提高 conf 阈值可能会导致漏报增加,因为一些原本可能被检测到的目标可能会因为阈值的提高而被忽略。因此,在实际应用中,需要根据对误报和漏报的容忍度来平衡 conf 阈值的设置。
精度和速度的权衡:使用 half 精度可以显著提高模型的执行速度,这对于计算资源有限或对实时性要求较高的场景非常有利。然而,使用 half 精度可能会导致一定程度的精度损失。在一些对精度要求较高的任务中,可能需要谨慎考虑是否使用 half 精度。此外,还可以通过调整其他参数,如模型的深度、宽度等,来在精度和速度之间进行更精细的权衡。
视频处理帧率控制:调整 vid_stride 参数可以控制视频处理的帧率。通过增加或减少 vid_stride 的值,用户可以调整模型在处理视频时跳过的帧数。例如,在对实时性要求较高而对准确性要求相对较低的场景中,可以适当增加 vid_stride,以提高处理速度;而在对准确性要求较高的场景中,则可以减小 vid_stride,以确保更准确地检测到目标。
边界框损失权重调整:通过调整 box 参数,可以改变边界框损失在总损失函数中的权重。这可以影响模型对边界框预测的重视程度,从而调整模型在定位目标时的准确性。
分类损失权重调整:cls 参数用于调整分类损失在总损失函数中的权重。根据数据集的特点和任务需求,可以适当增加或减少分类损失的权重,以优化模型在分类任务上的性能。
分布焦点损失权重调整:dfl 参数控制分布焦点损失的权重,该损失函数用于处理目标检测中的类别不平衡问题。合理调整 dfl 参数可以提高模型对稀有类别的检测能力。
学习率调整:学习率是模型训练中的一个重要参数,它决定了模型参数更新的步长。可以根据模型的训练情况调整学习率,例如在训练初期使用较大的学习率以加速收敛,在训练后期使用较小的学习率以精细调整模型参数。
优化器选择:YOLO 模型支持多种优化器,如 SGD、Adam 等。不同的优化器在训练过程中的表现不同,用户可以根据模型的特点和数据集的性质选择合适的优化器。
数据增强参数调整:除了模型本身的参数,还可以调整数据增强的相关参数,如翻转、旋转、缩放等的概率和幅度,以进一步增加数据的多样性,提高模型的泛化能力。
4 . 代码剖析
下面代码使用 ultralytics
库中的 YOLO
模型对图像进行目标检测,并处理和保存预测结果 。
from ultralytics import YOLO
从 ultralytics
库中导入 YOLO
类
# Load a model
model = YOLO("yolov8n.pt") # pretrained YOLOv8n model
创建了一个 YOLO
模型对象,并加载了预训练的模型权重文件 yolov8n.pt
# Run batched inference on a list of images
results = model(["im1.jpg", "im2.jpg"]) # return a list of Results objects
使用加载的模型对列表中的图像进行批量推理
model
: 这是之前定义的 YOLO 模型对象。
["im1.jpg", "im2.jpg"]
: 这是一个包含图像文件路径的列表。
results
: 调用 model
对象并传入图像列表,执行批量推理。这将返回一个包含多个 Results
对象的列表,每个 Results
对象对应一个输入图像的推理结果。
# Process results list
for result in results:
boxes = result.boxes # Boxes object for bounding box outputs
masks = result.masks # Masks object for segmentation masks outputs
keypoints = result.keypoints # Keypoints object for pose outputs
probs = result.probs # Probs object for classification outputs
obb = result.obb # Oriented boxes object for OBB outputs
result.show() # display to screen
result.save(filename="result.jpg") # save to disk
遍历 results
列表中的每个 Results
对象,并执行以下操作:
1)提取边界框、分割掩码、关键点、分类概率和定向边界框信息(如果有)。
2)展示每个图像及其检测结果到屏幕上。
3)将每个图像及其检测结果保存到磁盘上的文件 result.jpg
。
解析:
results
: 这是一个包含多个 Results
对象的列表,每个对象对应一个输入图像的推理结果。
result
: 当前遍历到的 Results
对象。
result.boxes
: 包含检测到的边界框信息。每个边界框包括坐标、类别、置信度等。
result.masks
: 包含分割掩码信息(如果有分割任务)。
result.keypoints
: 包含关键点信息(如果有关键点检测任务)。
result.probs
: 包含分类概率信息(如果有分类任务)。
result.obb
: 包含定向边界框信息(如果有定向边界框任务)。
result.show()
: 将当前图像及其检测结果展示到屏幕上。
result.save(filename="result.jpg")
: 将当前图像及其检测结果保存到磁盘上的文件 result.jpg
。
标签:task,训练,--,模型,YOLO,Datawhale,result,图像,数据 From: https://blog.csdn.net/2301_79387683/article/details/141753282