Влево, вправо, поворот: аффинные преобразования в Python и Tensorflow

В предыдущей статье мы затрагивали тему Data Augmentation, важную для компьютерного зрения (Computer vision). В основе Data Augmentation лежат аффинные преобразования, о применении которых мы расскажем сегодня. Читайте в этой статье: аффинные преобразования в Python с использованием фреймворка TensorFlow, разновидности — масштабирование, перемещение, сдвиг и поворот .

Что такое аффинные преобразования

Аффинные преобразования изменяют геометрическую структуру изображения, при этом сохраняя параллельность линий, коллинеарность и соотношение расстояний. Это один из методов, который используется в машинном обучении и компьютерном зрении (Computer vision) для обработки и расширении изображений (Data Augmentation).

Аффинные преобразования также используются для исправления геометрических искажений и деформаций, возникающих при неидеальных ракурсах камеры, например, в спутниковых изображениях.

В основе метода лежит изменение матрицы с учетом масштабирования, перемещения, свдига или поворота.  Мы рассмотрим аффинные преобразования с использованием Python-фреймворка TensorFlow. В этом фреймворке есть функция apply_affine_transformation, которая произведёт необходимые операции:

from tensorflow.keras.preprocessing.image import apply_affine_transform

apply_affine_transform(
    x,
    theta=0,
    tx=0,
    ty=0,
    shear=0,
    zx=1,
    zy=1,
    row_axis=0,
    col_axis=1,
    channel_axis=2,
    fill_mode='nearest',
    cval=0.0,
    order=1
)

Меняя тот или иной параметр этой функции, получится разный результат преобразований. Параметры расшифровываются как:

x: двумерный массив numpy, изображение.
theta: угол поворота в градусах.
tx: сдвиг по оси Х (ширина).
ty: сдвиг по оси Y (высота).
shear: угол сдвига в градусах.
zx: масштабирование по оси Х.
zy: масштабирование по оси Y.
row_axis: индекс оси для строк во входном изображении.
col_axis: индекс оси для столбцов входного изображения.
channel_axis: индекс оси для каналов входного изображения.
fill_mode: точки за пределами входа
    заполняются согласно заданному режиму:
    `{'constant', 'nearest', 'reflect', 'wrap'}`.
cval: значение, используемое для точек вне границ входа,
    если `mode = 'constant' '.
order: int, порядок интерполяции

Для чтение изображений используем Python-библиотеку Matplotlib:

import matplotlib.pyplot as plt
img = plt.imread('example.png')

1. Перемещение (Translation)

Перемещение (Translation) — это аффинное преобразование, необходимое для перемещение каждой точки изображения на заданное расстояние в направлении оси X и/или Y. В функции TensorFlow указываются значения параметров tx и ty. Данный вид аффинных преобразований в Python выглядит следующим образом:

transformation = apply_affine_transform(
    img,
    tx=30,
    ty=30
)
plt.imshow(transformation)
Аффинные преобразования, перемещение в Python
Пример перемещения на 30 пикселей по X и Y

2. Поворот (Rotation)

Вращение (Rotation) — это круговое преобразование вокруг точки или оси. В функции для создания вращения указывается значение аргумента theta. Например, чтобы повернуть изображение на 270 градусов, в Python прописывается:

transformation = apply_affine_transform(
    img,
    theta=270
)
plt.imshow(transformation)
Поворот при применении apply_affine_transformation фреймворка TensorFlow
Пример поворота на 270 градусов

3. Масштабирование (Scale)

Масштабирование (Scale) — это линейное преобразование, которое увеличивает или уменьшает изображение с заданным коэффициентом. В функции TensorFlow необходимо задать значения параметров zx и zy для увеличения или уменьшения изображений по оси X и Y соответсвенно. Значения больше 1 удаляют изображение, меньше 1 — приближают. Следующий код на Python приблизит картинку:

transformation = apply_affine_transform(
    img,
    zx=0.5,
    zy= 0.5
)
plt.imshow(transformation)
Аффинные преобразования, масштабирование в Python
Пример масштабирования изображения

4. Сдвиг (Shear)

Под сдвигом (Shear) подразумевается перемещение каждой точки на заданное расстояние в базисном направлении (x или y). Можете представить, что растягивается прямоугольник так, что он становится параллелограммом (т.е. углы уже не равны 90 градусам). В функции apply_affine_transformation для этого есть специальный аргумент shear. Эти аффинные преобразования в Python выглядят так:

transformation = image.apply_affine_transform(
    img,
    shear=50
)
plt.imshow(transformation)
Результат применения функции apply_affine_transformation для сдвига
Пример сдвига на 50 градусов

В Computer Vision, конечно же, можно применять те или иные аффинные преобразования вместе. Так, например, на рисунке ниже показан результат применения всех вышеуказанных значений аргументов.

Аффинные преобразования Python
Применение всех 4 аффинных преобразований

 

 

В следующей статье познакомимся с применением аффинных преобразований для расширения данных (Data augmentation) в TensorFlow. А о том, как использовать аффинные преобразования для реальных задач Data Science и Computer Vision, вы узнаете на нашем специализированном курсе «VISI: Computer Vision» в лицензированном учебном центре обучения и повышения квалификации IT-специалистов в Москве.

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

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

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