Расширяем датасет с помощью Data Augmentation в Tensorflow

В предыдущей статье мы говорили о аффинных преобразованиях, применяемых для 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)
Результат width shift (смещение по ширине)
Пример смещения по ширине

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)
Результат height shift (смещение по высоте) в рамках Data Augmentation
Пример смещения по высоте

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)
яркое и темное изображения в рамках Data Augmentation в TensorFlow
Результат изменения яркости и канала изображения

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)
Изображение после сдвига в Python
Результат сдвига

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-специалистов в Москве.

Источники
  1. https://www.tensorflow.org/api_docs/python/tf/keras/preprocessing/image/ImageDataGenerator

Добавить комментарий

Поиск по сайту