как увеличить количество изображений с помощью увеличения данных - PullRequest
0 голосов
/ 21 мая 2019

Я пытаюсь применить увеличение данных с помощью 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 голосов
/ 21 мая 2019

Вы неправильно понимаете 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 раза больше эпох, чем вы бы , в среднем получая по одному образцу каждого.

...