В предыдущей статье мы затрагивали тему 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)

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

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)

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

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

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



