В предыдущей статье мы говорили о аффинных преобразованиях, применяемых для Computer Vision (компьютерного зрения). Аффинные преобразования изображений лежат в основе Data Augmentation. Сегодня расскажем, как применять Data Augmentation с помощью Python-фреймворка TensorFlow. Читайте в этой статье, как изменяя параметры ImageDataGenerator, можно получать разные результаты преобразований: масштабирование, поворот, сдвиг, смещение, изменение яркости и изменение каналов изображений.
Для чего используется Data Augmentation
Data Augmentation — это метод расширения исходного набора набора данных. Порой приходится сталкиваться с тем, что данных попросту не хватает, а вам требуется обучить модель Machine Learning. Одним из решением этой проблемы является Data Augmentation. Мы рассмотрим применение этого метода на изображениях, к которым часто применяются аффинные преобразования в рамках Computer Vision. Таким образом, вы сможете подготовить датасет для распознавания образов в Python, немного зная TensorFlow.
Data Augmentation применительно к изображениям в TensorFlow
Для работы нам понадобится Python-фреймворк TensorFlow. В нём есть класс ImageDataGenerator, изменение значений аргументов которого приведёт к разным преобразованиям изображений.
Ниже функция, которая отображает несколько преобразованных изображений. В неё нужно только предать путь до изображения и объект ImageDataGenerator. В итоге, изучим влияние тех или иных аргументов ImageDataGenerator на исходное изображение. Заметим, что мы всегда используем параметр rescale
, чтобы привести диапазон пикселей с [0, 255] к диапазону [0, 1], поскольку алгоритмы машинного обучения работают с небольшими числами.
from tensorflow.keras.preprocessing import image import matplotlib.pyplot as plt from tensorflow.keras.preprocessing.image import ImageDataGenerator def get_image_augm(img_path, datagen): img = image.load_img(img_path, target_size=(150,140)) x = image.img_to_array(img) x = x.reshape((1,) + x.shape) # изменение формы на (1,150,150,3) fig, axes = plt.subplots(1, 2, figsize=(10,5)) for i, batch in enumerate(datagen.flow(x, batch_size=1)): axes[i].imshow(image.array_to_img(batch[0])) axes[i].axis('off') if i == 1: break
1. Поворот
Наиболее простое преобразование — поворот изображения. Для этого указывается значение параметра rotation_range
, который может принимать и отрицательные значения градусов. Вот так выглядит Data Augmentation в Python:
img_path = '1.jpg' datagen = ImageDataGenerator( rescale=1./255, rotation_range=155, ) get_image_augm(img_path, datagen)
2. Смещение по ширине
Изменяя значение аргумента width_shift_range
, изображение смещается по направлению оси X. При значении меньше 1, изображение сместится согласно долям. При значении больше 1, изображение сместится до указанного количества пикселей. Смещение происходит случайным образом влево или вправо. Ниже пример смещения на ½ доли.
img_path = '1.jpg' datagen = ImageDataGenerator( rescale=1./255, width_shift_range=0.5, ) get_image_augm(img_path, datagen)
3. Смещение по высоте
Изображение можно смещать и по направлению оси Y. За это отвечает специальный параметр height_shift_range
. Диапазоны изменений такие же, как и у смещения по ширине. Вот так выглядит пример этого Data Augmentation в Python:
img_path = '1.jpg' datagen = ImageDataGenerator( rescale=1./255, height_shift_range=.25, ) get_image_augm(img_path, datagen)
4. Изменение яркости и канала изображения
Ещё одним примером Data Augmentation в компьютерном зрении является изменение яркости. Параметр brightness_range
принимает пару чисел, которая устанавливает диапазон яркости. Так, 0 — отсутствие яркости, а 1 — максимальная яркость. Кроме того, схожим эффектом обладает изменение канала изображения channel_shift_range
— параметр,который принимает значения от 0 до 255.
img_path = '1.jpg' datagen = ImageDataGenerator( rescale=1./255, brightness_range=(.1, .5), channel_shift_range=220 ) get_image_augm(img_path, datagen)
5. Сдвиг изображений
Мы также можем растягивать изображения, изменяя интенсивность сдвига. Таким образом, происходит искажение исходной картинки. Для этого устанавливается значение угла shear_range
в градусах. В Python сдвиг выглядит следующим образом:
img_path = '1.jpg' datagen = ImageDataGenerator( rescale=1./255, brightness_range=(.1, .5), channel_shift_range=220 ) get_image_augm(img_path, datagen)
6. Масштабирование изображения
Ещё одним методом преобразования изображений, который применяется в Computer Vision, является его масштабирование (zoom). С помощью параметра zoom_range
настраивается насколько изображение должно быть приближено/отдалено. Чем ближе значение к 1, тем дальше будет находиться изображения от наблюдателя, а значение 0 вернёт к исходному масштабу. Вот так выглядит код на Python:
img_path = 'main.jpg' datagen = ImageDataGenerator( rescale=1./255, zoom_range=0.5 ) get_image_augm(img_path, datagen)
Помимо всего прочего, можно отзеркаливать изображение (параметры horizontal_flip=True
и vertical_flip=True
). Применение всего вышеперечисленного для решения задачи классификации изображений можно посмотреть здесь.
А о том, как использовать Data Augmentation для решения реальных задач Deep Learning и Computer Vision, вы узнаете на нашем специализированном курсе «VISI: Computer Vision» в лицензированном учебном центре обучения и повышения квалификации IT-специалистов в Москве.