2 подписчика
Если вы часто слышите от фанатов фантастики и, в частности, киберпанка, такие слова, как «аугментация», «импланты» и «модульные части тела», то, возможно, эта статья поможет вам разобраться в значении этих слов. Чаще всего первые два слова можно услышать от фанатов игр серии «Deus Ex». В этой вымышленной вселенной аугментации и импланты используются в самых разнообразных сферах. В частности, в «Deus Ex: Human Revolution» и «Deus Ex: Mankind Divided» - приквелах двух первых частей, игроку даётся...
5 лет назад
44,5K подписчиков
Доступность и инклюзия - важные темы в современном мире, и технологии могут сыграть важную роль в преодолении барьеров для людей с ограниченными возможностями. С помощью аугментаций люди с ограниченными возможностями теперь могут иметь равный доступ к цифровому миру, как и все остальные. Аугментации - это программные компоненты, которые могут быть добавлены в программу или устройство для обеспечения дополнительной функциональности или доступности. Эти аугментации могут помочь пользователям настроить...
1 год назад
9,4K подписчиков
🖼 Применение Аугментации с Даталодером

Важным для качественного решения задач CV (Computer Vision) с помощью нейронных сетей, помимо наличия качественной модели (зачастую уже предобученной на других задачах), также является датасет с достаточным количеством изображений (несколько десятков тысяч). Получить необходимый объем размеченных изображений зачастую довольно затруднительно, тогда на помощь может прийти аугментация. Аугментация позволяет увеличить объем исходного количества изображений за счет их изменений: поворот, растягивание/сжатие, изменение цветов и т.д.

Для сокращения времени процесса обучения нейронных сетей используют графические ускорители (GPU), объем памяти которых не способен вместить одновременно весь датасет и обучаемую модель. Для решения этой проблемы используют DataLoader, который «скармливает» нейросети данные из датасета порционно (батчами).

И кажется, что нет проблем: взять готовые архитектуры для аугментации, применить к датасету и поместить в даталодер. Однако, на данный момент DataLoader и Dataset в Pytorch не работают «из коробки» с популярной библиотекой для аугментации albumentations.

Выходом из этого является написание собственного класса Dataset. В данном случае — это Dataset для изображений Imagefolder (структура хранения изображений, при которой каждый класс хранится в папке с соответствующим именем). Для работы понадобится импорт следующих библиотек:

import os
import albumentations as A
from torchvision import datasets, transforms
from torch.utils.data import Dataset, DataLoader

Создадим свой собственный класс ImageFolder, наследуя из класса Dataset:
class ImageFolder(Dataset):
def __init__(self, root_dir, transform=None, total_classes=None):
self.transform = transform
self.data = []

if total_classes:
self.classnames = os.listdir(root_dir)[:total_classes] # for test
else:
self.classnames = os.listdir(root_dir)

for index, label in enumerate(self.classnames):
root_image_name = os.path.join(root_dir, label)

for i in os.listdir(root_image_name):
full_path = os.path.join(root_image_name, i)
self.data.append((full_path, index))

def __len__(self):
return len(self.data)

def __getitem__(self, index):
data, target = self.data[index]
img = np.array(Image.open(data))

if self.transform:
augmentations = self.transform(image=img)
img = augmentations["image"]

target = torch.from_numpy(np.array(target))
img = np.transpose(img, (2, 0, 1))
img = torch.from_numpy(img)

return img, target
Далее создадим правило, по которому исходное изображение будет меняться:

SIZE = 244
SIZE2 = 256

train_transform_alb = A.Compose(
[
A.Resize(SIZE2, SIZE2),
A.ShiftScaleRotate(shift_limit=0.05, scale_limit=0.05, rotate_limit=15, p=0.5),
A.RandomCrop(SIZE, SIZE),
A.RGBShift(r_shift_limit=15, g_shift_limit=15, b_shift_limit=15, p=0.5),
A.RandomBrightnessContrast(p=0.5),
A.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)),
]
)
В данном случае каждое изображение с какой-то долей вероятности (p) поворачивается, сжимается, обрезается, меняет цвета и яркость. А еще все изображения приводятся к одному размеру, а также нормализуются.

Однако, если мы применим трансформацию к исходным данным, их объем не изменится относительно изначальных, поэтому нужно отдельно написать шаги трансформации для исходных данных без аугментации (остаются: приведение к исходному размеру, центрирование и нормализация).

train_transform_base = A.Compose(
[
A.Resize(SIZE2, SIZE2),
A.CenterCrop(SIZE, SIZE),
A.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225))
]
)


1 год назад