关于 YOLO 模型“训练”的基本疑问

数据挖掘 机器学习 美国有线电视新闻网 图像分类 图像识别 约洛
2022-01-27 18:10:14

所以我最近才开始探索机器学习,并且在一个项目中我需要训练 YOLO v5 模型。我首先在 coco128 数据集上进行了尝试:https://www.kaggle.com/ultralytics/coco128。.

yolo v5 的存储库: https ://github.com/ultralytics/yolov5

我按照本教程逐步操作: https ://github.com/ultralytics/yolov5/wiki/Train-Custom-Data 并成功地训练了模型,它正在按照我的意图检测对象。

我想对我们“训练”模型时的基本情况有一个非常基本的概述。

用于训练的命令是:

python train.py --img 640 --batch 16 --epochs 5 --data coco128.yaml --weights yolov5s.pt

据我了解,这告诉命令行使用以下参数运行文件“train.py”(它使用 argeparse 库):640(图像大小)、16(批量梯度下降的批量大小)、5(没有。 epochs)、coco128.yaml(配置文件)和 yolov5s.pt(权重文件)。

怀疑

  • 本教程提到权重是预训练的。这让我很困惑,因为我认为“训练”模型的整个目标是为参数找到正确的权重。如果已经提供了权重,那么训练到底要达到什么目的?它已经被提供了一堆图像以及这些图像的边界框的标签。它对这些图像和标签有什么作用才能预测对象?
  • coco128.yaml 提到了“验证”文件夹的路径。“验证”文件夹到底是做什么用的?
1个回答

关于预训练模型:这是一种非常常见的做法(尤其是在图像识别中),这就是我们如何使用它。

假设您想识别不同类型的食物(牛肉、猪肉、蔬菜……)。你知道一些网络已经存在,可以识别所有类型的物体(船、汽车、食物、沙发……)。迁移学习的目标是使用这些模型并使其适应您的任务,因此您选择一个已经训练过的模型,然后再次训练它,但仅使用您的数据(在我们的示例食物类型中)。能够识别和区分不同的对象对你的任务来说并不是没有用的,所以即使你的网络没有做与初始模型相同的事情,初始模型所学到的东西也会被用作学习任务的基础。

我们称之为微调模型,它基本上是使用一个复杂的网络,由于数据集不够大而无法训练,并且只是调整它以执行我们的专门任务。

在您的教程中,数据集 Coco128 由 128 张图像组成,这不足以训练像 YOLOv5 这样大的模型。因此,您使用预训练的权重并使用您的数据集对其进行微调。据我了解,本教程的目的是了解模型如何过度拟合这 128 张图像。


关于验证,我们通常将数据集分为 3 个部分:

  1. 训练集:用于训练模型。(~80% 数据集)
  2. 测试集:用于测试训练好的模型,这部分是用来估计模型准确性的部分。(~15% 数据集)
  3. 验证集:在最后使用,以验证我们的模型是否正常工作。(~5% 数据集)

在许多情况下,测试和验证数据集是相同的(因为验证数据集通常不是必需的)。

在你的教程中,他们所说的验证集就是我通常所说的测试数据集,它和训练集是一样的,所以基本上你所有的集都是一样的。(这样做非常非常不常见,但由于本教程的目标是了解我们如何过拟合这个集合,所以在这里很有意义)。