数据加载器dataloader处于硬盘的输入图片与YOLO神经网络之间。
其存在的意义和目的:是降低对硬盘的访问频次。
基本的方法是:批处理 和缓存
因此数据加载器的职责就是读取带有标签的数据。
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(…)
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)主要功能 创建YOLO数据集:
dataset = LoadImagesAndLabels()
利用pytorch的loader创建加载器对象:loader = DataLoader()
(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。
马赛克数据增强的设置是超参数有设置,而不是用户命令行设置。
原文链接:https://blog.51cto.com/u_11299290/5144793
感谢原作者,转载这篇文章是为了便于学习,如有侵权,请联系删除。