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