YOLO 知识补充
YOLO模型所需要的训练格式
为了训练YOLO模型,我们需要准备一个符合特定格式要求的数据集。YOLO模型训练数据集通常需要遵循以下格式:图像文件,标注文件,配置文件
标注文件与图像文件一一对应,用于指示图像中目标物体的位置和类别,其格式在task01笔记中已介绍
数据集
在机器学习项目中,通常会把数据集划分为三个主要的部分:训练集(Training Set)、验证集(Validation Set)和测试集(Test Set)。这些数据集的不同划分有助于确保模型能够很好地泛化到未见过的新数据上。
- 训练集(Training Set):
用于训练模型。模型通过学习训练集中的数据来调整其参数,以最小化预测误差。
训练集通常是数据集中最大的部分,因为它需要足够的数据来训练模型。
训练集的目的是让模型学会如何根据输入数据(特征)预测输出结果(标签)。 - 验证集(Validation Set):
用于调整模型的超参数。超参数是模型中的参数,它们的值在训练过程中不直接从数据中学习,而是由用户或算法选择。
验证集可以帮助你选择最佳的超参数,如学习率、正则化强度等。
验证集还可以用于监控模型的训练过程,以避免过拟合。 - 测试集(Test Set):
用于评估模型的最终性能。它是数据集中完全未见过的数据,用于测试模型在实际应用中的表现。
测试集的结果可以用来评估模型的泛化能力,即模型在新数据上的表现。
测试集的结果通常是最具代表性的,因为它最接近真实世界的情况。
划分比例
以下是一些常见的数据集划分比例:
- 80/10/10:
这是最常用的划分比例之一,其中80%的数据用于训练,10%用于验证,10%用于测试。
训练集用于训练模型,验证集用于调整模型参数,测试集用于评估模型的最终性能。 - 70/15/15:
在某些情况下,训练集的比例可能会更大,例如70%,而验证集和测试集的比例可能会较小,例如15%
这种划分比例可能会导致验证集和测试集相对较小,但可以确保模型有足够的数据用于训练。 - 90/5/5:
另一种常见的划分比例是90%用于训练,5%用于验证,5%用于测试。
这种划分比例可能会导致验证集和测试集相对较小,但在某些情况下,如果数据集非常大,这种划分比例仍然可以提供足够的样本进行模型评估。 - K-fold交叉验证:
在K-fold交叉验证中,数据集被分为K个子集,每次选择一个子集作为验证集,其余K-1个子集作为训练集。
这个过程重复K次,每次使用不同的子集作为验证集。
K-fold交叉验证可以提供比单一的训练集、验证集和测试集更可靠的性能估计。
划分方法
以下是一些常见的数据集划分方法:
- 随机划分:
这是最简单也是最常见的方法。数据集被随机分成三个子集,每个子集的大小可以根据需要来决定。
例如,如果数据集包含1000个样本,可以将其分为训练集800个样本,验证集100个样本,测试集100个样本。 - 交叉验证:
交叉验证是一种更高级的数据集划分方法,它将数据集分为多个子集,并轮流将一个子集作为验证集,其余子集作为训练集,然后计算模型的性能。
常见的交叉验证方法有K-fold交叉验证,其中数据集被分为K个子集,每次选择一个子集作为验证集,其余K-1个子集作为训练集。这个过程重复K次,每次使用不同的子集作为验证集。 - 分层划分:
当数据集中的样本分布不均匀时,可以采用分层划分的方法。这种方法确保每个子集(训练、验证、测试)都包含数据集的所有类别或层次结构。
例如,如果数据集包含三个类别,每个类别有100个样本,可以先从每个类别中随机选择80个样本作为训练集,剩下的20个样本作为验证集。 - 保留法:
在数据收集过程中,从原始数据集中保留一部分作为测试集,其余部分作为训练集和验证集。
这种方法在数据收集和处理阶段就可以完成,不需要在训练前进行额外的数据划分。
YOLO 训练日志
在使用YOLO进行训练时,生成的exp/detect/train类型的文件夹是训练过程中的一个关键组成部分。
- 模型权重 (.pt 或 .pth 文件): 训练过程中保存的模型权重,可以用于后续的测试或继续训练。
- 日志文件 (.log 文件): 包含训练过程中的所有输出信息,如损失值、精度、速度等。
- 配置文件 (.yaml 或 .cfg 文件): 训练时使用的配置文件副本,记录了数据路径、类别名、模型架构等设置。
- 图表和可视化: 有时YOLO会生成训练过程中的性能图表,如损失曲线、精度曲线等。
- 测试结果: 如果训练过程中包括了测试阶段,可能会有测试结果的保存,如检测结果的图片或统计数据。
在训练过程中和训练完成后,都可以查看训练日志。可以优先查看results.png,图像的内容类似如下。从验证集上的损失 (val/box_loss, val/cls_loss, val/dfl_loss) 和性能指标可以评估模型在未见数据上的泛化能力。
Baseline 进阶
- 增加训练的数据集
修改训练数据集:
for anno_path, video_path in zip(train_annos[:10], train_videos[:10]):
修改验证数据集:
for anno_path, video_path in zip(train_annos[-6:], train_videos[-6:])
通过此方法成绩有了一定提高,从最初的0.0047834701569362到0.1929365514269085
2. 切换不同的模型预训练权重