菜单

数据处理

相关源文件

本页面提供了 YOLOv5 数据处理系统的全面概述,该系统涵盖数据加载、预处理、增强和缓存。理解这些组件对于高效的模型训练和推理至关重要。有关数据集格式的信息,请参阅 Datasets,有关数据增强技术的详细说明,请参阅 Data Augmentation

YOLOv5 数据处理概述

YOLOv5 的数据处理系统旨在高效地处理用于目标检测任务的图像及其相应的标签。该系统支持多种输入源,包括图像文件、视频文件、流,甚至屏幕截图,同时提供强大的预处理和增强功能以增强模型训练。

图示:YOLOv5 数据处理概述

来源:utils/dataloaders.py160-218 utils/dataloaders.py322-430 utils/dataloaders.py433-526 utils/dataloaders.py264-320

数据集配置

YOLOv5 使用 YAML 文件来配置数据集,定义图像和标签的路径、类名以及可选的下载脚本。

YAML 结构

典型的 YAML 数据集文件包含:

  • 数据集根目录的路径
  • 训练集、验证集和测试集的路径(相对于根目录)
  • 类名及其对应的索引
  • 用于检索数据集文件的可选下载脚本

来源:data/coco.yaml10-115 data/coco128.yaml10-100

数据加载流程

YOLOv5 中的数据加载管道负责加载图像及其相应的标签,将它们转换为适当的格式,并为模型准备它们。

图示:数据加载类和流程

来源:utils/dataloaders.py160-218 utils/dataloaders.py537-988 utils/dataloaders.py322-430 utils/dataloaders.py433-526 utils/dataloaders.py264-320 utils/segment/dataloaders.py21-83 utils/segment/dataloaders.py86-236

主要数据加载类

数据加载系统包含几个专用类:

  1. LoadImagesAndLabels:核心数据集类,用于训练,继承自 torch.utils.data.Dataset

    • 加载图像和边界框标签
    • 支持缓存到 RAM 或磁盘
    • 实现数据增强(Mosaic、Mixup 等)
    • 支持矩形训练批次
  2. LoadImages:加载用于推理的图像和视频

    • 支持各种输入源(文件、目录、通配符)
    • 处理视频帧提取
  3. LoadStreams:处理视频流以进行实时推理

    • 支持网络摄像头、IP 摄像头和 YouTube 流
    • 多线程设计,用于并行流处理
  4. LoadScreenshots:捕获和处理屏幕截图

    • 使用 MSS 库捕获屏幕区域
    • 可配置的屏幕区域
  5. LoadImagesAndLabelsAndMasks:用于分割任务的扩展

    • 继承自 LoadImagesAndLabels
    • 添加了掩码加载和处理功能

来源:utils/dataloaders.py537-988 utils/dataloaders.py322-430 utils/dataloaders.py433-526 utils/dataloaders.py264-320 utils/segment/dataloaders.py86-236

创建数据加载器

create_dataloader() 函数作为工厂函数,根据提供的参数创建和配置 PyTorch DataLoader 实例。

该函数创建一个 LoadImagesAndLabels 数据集实例,并将其包装在一个标准的 PyTorch DataLoader 或自定义的 InfiniteDataLoader 中,后者会重用工作进程以提高性能。

来源:utils/dataloaders.py160-218 utils/segment/dataloaders.py21-83

数据预处理和缓存

预处理步骤

YOLOv5 执行几个预处理步骤来为训练或推理准备数据。

  1. Letterboxing:通过添加填充来调整图像大小以匹配目标尺寸,同时保持宽高比。

    • 确保模型输入尺寸一致
    • 防止对象变形
  2. EXIF 方向处理:根据 EXIF 元数据校正图像方向。

    • 确保表示形式一致,无论图像如何捕获。
  3. 标签转换:在以下格式之间转换边界框:

    • xywh(中心点 x, 中心点 y, 宽度, 高度)到 xyxy(左上角 x, 左上角 y, 右下角 x, 右下角 y)
    • 像素坐标到归一化坐标(0-1)

来源:utils/augmentations.py122-152 utils/dataloaders.py83-117 utils/dataloaders.py848-871

缓存系统

YOLOv5 实现了一个复杂的缓存系统以加速数据加载。

  1. 标签缓存:

    • 标签使用 numpy 数组缓存到 .cache 文件中。
    • 缓存包括对图像尺寸和完整性的验证。
    • 缓存版本控制确保与代码更改的兼容性。
  2. 图像缓存:

    • RAM 缓存:将所有图像加载到内存中以实现最快的访问。
    • 磁盘缓存:将预处理后的图像存储为 .npy 文件,以便更快地加载。
    • 在启用 RAM 缓存之前自动检查可用 RAM。

图示:YOLOv5 缓存系统流程

来源: utils/dataloaders.py591-602 utils/dataloaders.py722-760 utils/dataloaders.py682-702 utils/dataloaders.py703-720 utils/dataloaders.py873-877

批次创建和采样

矩形训练

YOLOv5 支持矩形训练,它将具有相似纵横比的图像分组到批次中,以最小化填充并最大化 GPU 利用率

  1. 图像按纵横比排序
  2. 批次形状根据步幅对齐的尺寸计算
  3. 每个批次使用一致的形状,减少填充造成的计算浪费

来源: utils/dataloaders.py657-680

分布式训练支持

对于多 GPU 训练,YOLOv5 实现了一个自定义采样器,以确保数据均匀分布

  1. SmartDistributedSampler:PyTorch DistributedSampler 的扩展版本
    • 确保每个 GPU 获得均衡的数据子集
    • 基于 epoch 和 seed 保持确定性洗牌

来源: utils/dataloaders.py133-157

内存高效处理

YOLOv5 实现了多项内存高效数据处理的优化

  1. InfiniteDataLoader:自定义 DataLoader,它会重用工作进程以减少开销

    • 防止在 epoch 之间创建和销毁工作进程
    • 在整个训练过程中保持一致的内存使用
  2. 流式加载和惰性加载:

    • 图像可以按需加载,而不是一次性加载所有图像
    • 视频帧仅在需要时提取
  3. 内存使用估算:

    • 自动检测可用 RAM 并调整缓存策略
    • 提供有关内存使用的信息性警告

来源: utils/dataloaders.py221-262 utils/dataloaders.py703-720

数据集到模型的数据管道

从数据集配置到模型就绪数据的完整管道涉及几个阶段

图示:完整数据处理管道

来源: utils/dataloaders.py537-988 utils/dataloaders.py160-218 utils/dataloaders.py772-846 utils/augmentations.py74-88 utils/augmentations.py122-152

实际示例

训练数据配置

以下是配置训练数据的一个典型示例

来源: utils/dataloaders.py160-218

推理数据配置

对于推理,数据加载方法更简单

来源: utils/dataloaders.py322-430

结论

YOLOv5 的数据处理系统为目标检测任务提供了灵活高效的数据加载、预处理和增强管道。该系统的模块化设计,结合强大的缓存和优化功能,能够实现快速开发和高效的模型训练。

理解本文档所述的数据处理组件对于有效使用 YOLOv5 至关重要,特别是在处理自定义数据集或调整性能时。有关数据处理不同方面的更多具体信息,请参阅以下页面

  • 数据集 - 有关支持的数据集及其配置的信息
  • 数据加载 - 数据加载管道和机制的详细说明
  • 数据增强 - 数据增强技术的深入介绍