如何通过数据增强增加图像数量

Posted

技术标签:

【中文标题】如何通过数据增强增加图像数量【英文标题】:how to increase number of images with data augmentation 【发布时间】:2019-10-07 15:53:21 【问题描述】:

我正在尝试使用 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])
])

【问题讨论】:

【参考方案1】:

您误解了 API。当您向数据集添加一些转换时,它本质上是一个函数,应用于该数据集中的每个样本,然后返回。 transforms.Compose 按顺序应用子转换,而不是返回多个结果(每个翻译都被应用或不应用)。所以

transforms.Compose([
    transforms.RandomRotation(degrees = (90, -90)),
    transforms.RandomRotation(degrees = (180, -180)),
])

只会将图像以 90 到 90 度之间的随机角度旋转一次(换句话说,正好旋转 90 度),然后再旋转 180 度。这相当于单个 RandomRotation(degrees=(270, 270))(实际上更糟,因为它导致过程中更多的数据损坏)。

所以,大多数transforms 都如上 - “线性” - 一个输入,一个输出。有一些“分叉”转换产生的输出多于输入。一个例子是FiveCrop。请注意其有关如何处理的说明。即使使用“分叉”转换,您仍然会在数据集中获得相同数量的项目,只是您的批次会更大。

如果您特别希望拥有一个数据集,其中包含每个项目的 4 个不同旋转副本并随机生成它们(即,可能每个旋转变体来自不同的批次),您将必须编写一些自定义数据加载逻辑。为此,您可能希望将您的工作基于DatasetFolder 的来源。

为什么 API 是这样的?在实践中,大多数人对当前的变换都很好——在你的位置,他们只需编写一个随机翻转 0、90、180 或 270 度的变换,然后训练他们的网络比你多 4 倍的时期, 平均每个得到一个样本。

【讨论】:

非常感谢,我需要更多副本,所以我将使用自定义数据加载

以上是关于如何通过数据增强增加图像数量的主要内容,如果未能解决你的问题,请参考以下文章

Deep Learning -- 数据增强

深度学习中的数据增强技术

VOC数据增强与调整大小

数据增强(尚未完成)

gan如何做图像增强

使用 Tensorflow 进行图像增强,因此所有类都具有完全相同数量的图像