如何通过数据增强来增加图像数量
how to increase number of images with data augmentation
我正在尝试使用 pytorch 应用数据增强。特别是,我有一个包含 150 张图像的数据集,我想对每张图像应用 5 次转换(水平翻转、3 次随机旋转和垂直翻转)以拥有 750 张图像,但使用我的代码我总是有 150 张图像。
'train': transforms.Compose([
transforms.Resize(224),
transforms.RandomHorizontalFlip(),
transforms.RandomRotation(degrees = (90,90)),
transforms.RandomRotation(degrees = (180,180)),
transforms.RandomRotation(degrees = (270,270)),
transforms.RandomVerticalFlip(p=1),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])
您误解了 API。当您向数据集添加一些转换时,它本质上是一个函数,该函数被应用于该数据集中的每个样本,然后返回。 transforms.Compose
按顺序应用 sub-transforms,而不是返回多个结果(每个翻译都被应用或不被应用)。所以
transforms.Compose([
transforms.RandomRotation(degrees = (90, -90)),
transforms.RandomRotation(degrees = (180, -180)),
])
只会以 90 到 90 度之间的随机角度(换句话说,恰好旋转 90 度)将图像旋转一次,然后再旋转 180 度。这相当于单个 RandomRotation(degrees=(270, 270))
(它是实际上更糟,因为它会导致过程中更多的数据损坏。
因此,大多数 transforms
都如上 - "linear" - 一种输入,一种输出。有一些 "forking" 转换产生的输出多于输入。一个例子是 FiveCrop
。请注意其关于如何处理的说明。即使使用 "forking" 转换,您仍然会在数据集中获得相同数量的项目,只是您的批次会更大。
如果您特别想要一个包含每个项目的 4 个不同旋转副本并随机生成它们的数据集(即可能每个旋转变体来自不同的批次),您将必须编写一些自定义数据加载逻辑.为此,您可能希望将您的工作基于 DatasetFolder
.
的来源
为什么 API 会变成这样?在实践中,大多数人对目前的变换都很好——在你的位置,他们只需编写一个随机翻转 0、90、180 或 270 度的变换,然后训练他们的网络比你多 4 倍的纪元, 平均每样得到一个样本。
我正在尝试使用 pytorch 应用数据增强。特别是,我有一个包含 150 张图像的数据集,我想对每张图像应用 5 次转换(水平翻转、3 次随机旋转和垂直翻转)以拥有 750 张图像,但使用我的代码我总是有 150 张图像。
'train': transforms.Compose([
transforms.Resize(224),
transforms.RandomHorizontalFlip(),
transforms.RandomRotation(degrees = (90,90)),
transforms.RandomRotation(degrees = (180,180)),
transforms.RandomRotation(degrees = (270,270)),
transforms.RandomVerticalFlip(p=1),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])
您误解了 API。当您向数据集添加一些转换时,它本质上是一个函数,该函数被应用于该数据集中的每个样本,然后返回。 transforms.Compose
按顺序应用 sub-transforms,而不是返回多个结果(每个翻译都被应用或不被应用)。所以
transforms.Compose([
transforms.RandomRotation(degrees = (90, -90)),
transforms.RandomRotation(degrees = (180, -180)),
])
只会以 90 到 90 度之间的随机角度(换句话说,恰好旋转 90 度)将图像旋转一次,然后再旋转 180 度。这相当于单个 RandomRotation(degrees=(270, 270))
(它是实际上更糟,因为它会导致过程中更多的数据损坏。
因此,大多数 transforms
都如上 - "linear" - 一种输入,一种输出。有一些 "forking" 转换产生的输出多于输入。一个例子是 FiveCrop
。请注意其关于如何处理的说明。即使使用 "forking" 转换,您仍然会在数据集中获得相同数量的项目,只是您的批次会更大。
如果您特别想要一个包含每个项目的 4 个不同旋转副本并随机生成它们的数据集(即可能每个旋转变体来自不同的批次),您将必须编写一些自定义数据加载逻辑.为此,您可能希望将您的工作基于 DatasetFolder
.
为什么 API 会变成这样?在实践中,大多数人对目前的变换都很好——在你的位置,他们只需编写一个随机翻转 0、90、180 或 270 度的变换,然后训练他们的网络比你多 4 倍的纪元, 平均每样得到一个样本。