Pytorch Pytork数据扩充花费的时间太长
对于涉及回归的任务,我需要训练我的模型从RGB图像生成密度贴图。为了扩充我的数据集,我决定水平翻转所有图像。就这一点而言,我还必须翻转我的地面真相图像,我做到了Pytorch Pytork数据扩充花费的时间太长,pytorch,data-augmentation,Pytorch,Data Augmentation,对于涉及回归的任务,我需要训练我的模型从RGB图像生成密度贴图。为了扩充我的数据集,我决定水平翻转所有图像。就这一点而言,我还必须翻转我的地面真相图像,我做到了 dataset_for_augmentation.listDataset(train_list, shuffle=True, transform=transforms.Compose([
dataset_for_augmentation.listDataset(train_list,
shuffle=True,
transform=transforms.Compose([
transforms.RandomHorizontalFlip(p=1),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
]),
target_transform=transforms.Compose([
transforms.RandomHorizontalFlip(p=1),
transforms.ToTensor()
]),
train=True,
resize=4,
batch_size=args.batch_size,
num_workers=args.workers),
但问题是:出于某种原因,PyTorch transforms.RandomHorizontalFlip函数只将PIL图像(不允许使用numpy)作为输入。所以我决定将类型转换为PIL图像
img_path = self.lines[index]
img, target = load_data(img_path, self.train, resize=self.resize)
if type(target[0][0]) is np.float64:
target = np.float32(target)
img = Image.fromarray(img)
target = Image.fromarray(target)
if self.transform is not None:
img = self.transform(img)
target = self.target_transform(target)
return img, target
是的,这次行动需要大量的时间。考虑到我需要对数千张图像执行此操作,每批23秒(最多不超过半秒)是不可容忍的
2019-11-01 16:29:02,497 - INFO - Epoch: [0][0/152] Time 27.095 (27.095) Data 23.150 (23.150) Loss 93.7401 (93.7401)
如果您能给我一些建议来加快我的扩充过程,我将不胜感激。您无需更改
数据加载器来实现这一点。您可以使用:
transform=transforms.Compose([
transforms.ToPILImage(),#检查文档中的模式假设
transforms.RandomHorizontalFlip(p=1),
transforms.ToTensor(),
标准化(平均值=[0.485,0.456,0.406],标准值=[0.229,0.224,0.225]),
])
无论如何,我会避免转换成PIL。这似乎完全没有必要。如果你想翻转所有的图像,为什么不只用NumPy呢
img_path=self.lines[索引]
img,目标=加载数据(img\U路径,self.train,resize=self.resize)
如果类型(目标[0][0])为np.64:
目标=np.32(目标)
#假设宽度轴=1——请参见下面的注释
img=np.翻转(img,轴=1)
目标=np.翻转(目标,轴=1)
如果self.transform不是None:
img=自转换(img)
目标=自我。目标\转换(目标)
返回img,目标
并从组合中删除变换.RandomHorizontalFlip(p=1)
。由于传感器(…)
也能处理ndarray
,所以您可以开始了
注意:我假设宽度轴等于1,因为传感器
希望它在那里
从:
转换PIL图像或numpy.ndarray(H x W x C)
更多的是对答案的补充
水平翻转
您正在对X
和y
图像使用transforms.RandomHorizontalFlip(p=1)
。在您的情况下,使用p=1
,这些图像将被完全相同地转换,但您缺少数据扩展点,因为网络将只看到翻转的图像(而不是原始图像)。您应该选择低于1且高于0的概率(通常0.5
),以获得图像版本的高可变性
如果是这种情况(p=0.5
),您可以非常肯定会出现这样的情况,X
被翻转,而y
没有翻转
我建议使用albumentations
library,并以相同的方式翻转两幅图像
规范化
您可以使用ImageNet
找到normalization
,也可以找到已经在那里设置的方法和STD
缓存
此外,为了加快速度,您可以使用第三方库(免责声明我是作者)。在您的例子中,您可以将图像从PIL
转换为Tensor
,使用相册
,在磁盘上缓存
,或者在使用torchdata
进行转换后在RAM图像中更好地进行转换,并最终应用您的转换。这种方法将允许您在初始历元后仅对图像和目标应用HorizontalFlip
s,之前的步骤将预先计算。谢谢,预先计算增强步骤是我的初始计划,但随后我迷失在这一特定步骤中。我一定会努力实现你的建议。顺便说一句,我的假设是在RandomHorizontalFlip中将p设置为1是不正确的?我想了解为什么在这种情况下x和y的变换会有所不同。@3yanlis1bos更新了我关于翻转的答案。是的,您将得到完全相同的转换,但您并没有以这种方式扩充数据集,因为所有图像都会被翻转。扩充通常会增加数据集的大小及其可变性,在这里它将保持完全相同。是的,这是我的错误。我希望通过这些转换来扩大我的数据集结果我问的不是我的主要问题。这使您的答案更加有价值,谢谢。您好,我打算使用transform来执行数据扩充。换句话说,我同时需要翻转和未翻转的图像,因为我想将数据集的大小增加一倍。但现在我明白了,这并不是我尝试的方式。在我的情况下,ToPILImage不起作用,因为我的目标是一个2维图像,它与H x W x C结构不匹配。@3Yanlis1我不明白。在步骤t
,是否希望数据加载器同时提供翻转图像和原始图像(同时提供img
和target
)?让我知道。@3yanlis1bos您可能想要img
和target
在时间步t
。扩充通常是这样做的,网络只看到一次原始示例,第二次转换示例,这样它就不会过度匹配。您确定要同时提供两个版本,而不是像通常那样按顺序提供吗?@3yanlis1bos:),这样您就不必存储2*数据库。