作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/122360226
目录
第1章 什么是dataloader数据集加载器
第2章 Pytorch的dataloader
2.1 依赖的库
2.2 自定义自己的数据集
2.3 自定义dataloader加载器
2.4 使用dataloader迭代器读取数据
第3章 YOLO V5 - ultralytics dataloader的代码实现
3.1 create_dataloader
3.2 支持的其他功能
数据加载器dataloader处于硬盘的输入图片与YOLO神经网络之间。
其存在的意义和目的:是降低对硬盘的访问频次。
基本的方法是:批处理
和缓存
批处理:从硬盘中一次读取多个批次的多张图片文件到内存中,而不是一张一张图片的读取,批处理,避免了频繁的读取硬盘,缓解了高速的GPU网络处理与低速的硬盘文件读取之间速度上的不平衡。
缓存:硬盘中的图片和标签是分开的,cache的作用是把各个独立的硬盘图片以及标签,整合在一个cache文件,这样dataloader就不需要查找和打开一个个单独的文件。因为打开、读取和关闭文件的开销还是很大。
多线程:多线程的目的还是增加对硬盘数据读取的效率,特别是在多GPU训练的场合,多线程读取数据,就显得尤为重要
因此数据加载器的职责就是读取带有标签的数据。
from torch.utils.data import DataLoader, Dataset
这里有两个主要的对象
(1)dataset:包括pytorch预支持的数据集以及用户可以自定义自己的数据集
数据集的职责:定义数据集在硬盘中的位置、机构化数据的数据、标签等信息。
(2)dataloader:通过dataset读取硬盘中的数据集,并把图片和标签存放在内存中 。以供神经网络随时使用。
数据集dataset对象:负责读取、管理和组织自身的数据。
基于Dataset模板定义自己的数据集class,里面至少包含3个函数:
①__init__:传入数据,或者像下面一样直接在函数里加载数据
②__len__:返回这个数据集一共有多少个item
③__getitem__:返回一条训练数据,并将其转换成tensor
import torch
from torch.utils.data import Dataset
class MyData(Dataset):
def __init__(self):
a = np.load("D:/Python/nlp/NRE/a.npy",allow_pickle=True)
b = np.load("D:/Python/nlp/NRE/b.npy",allow_pickle=True)
d = np.load("D:/Python/nlp/NRE/d.npy",allow_pickle=True)
c = np.load("D:/Python/nlp/NRE/c.npy")
self.x = list(zip(a,b,d,c))
def __getitem__(self, idx):
assert idx < len(self.x)
return self.x[idx]
def __len__(self):
return len(self.x)
# 创建Y一个数据集dataset实例
xxx_dataset = MyData()
数据集加载器对象dataloader:负责通过dataset对象,读取数据集数据,并存放在在自己的内存中。
instance_dataloader = DataLoader(dataset, batch_size = 2, shuffle=True,collate_fn = preprocess)
创建一个dataloader实例:instance_dataloader = DataLoader(.......)
备注:dataloader会启动内部的线程,通过dataset对象,从硬盘中读取数据。
for i, data in enumerate(xxx_data_loader):
xxx
xxx
dataloader本质上也是一个可迭代的对象,通过迭代的方式读取数据集数据,并泛化给data。
pytorch dataloader是一个通用的dataloader,他建立了一个通用的数据集加载的机制和框架。
然后,不同的训练网络,所需要的数据集不同,dataloader要处理的内容也不相同,这就需要在pytorch的dataloader的基础之上,进一步的封装,以便提供YOLO所需要的数据加载器。
源代码:yolov5\utils\datasets
(1)函数原型
def create_dataloader(
(2)主要功能
(1)load_image: 加载普通的image
class LoadImages和标签: 本地图片 (适合本地检查和本地训练)
class LoadWebcam: 本地视频 (只适合检测)
class LoadStreams: 支持网络视频或图像(只适合检测)
(2)load_mosaic/load_mosaic9: 加载image时,马赛克数据增强加载
Mosaic数据增强方法是YOLOV4论文中提出来的,主要思想是将四张图片进行随机裁剪,再拼接到一张图上作为训练数据。这样做的好处是丰富了图片的背景,并且四张图片拼接在一起变相地提高了batch_size,在进行batch normalization的时候也会计算四张图片,所以对本身batch_size不是很依赖,单块GPU就可以训练YOLOV4。
马赛克数据增强的设置是超参数有设置,而不是用户命令行设置。
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/122360226