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

时间:2019-05-21 09:21:46

标签: python-3.x pytorch 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])
])

1 个答案:

答案 0 :(得分:0)

您误解了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倍,平均每个样本取一个样本。