Увеличение данных – это метод, обычно используемый в машинном обучении для создания дополнительных данных путем преобразования существующих данных. Этот метод может быть особенно полезен в случаях, когда для обучения модели доступны ограниченные данные. В этом руководстве мы обсудим несколько методов увеличения данных и способы их реализации в Python.

Начиная

Чтобы начать работу с увеличением данных, нам нужно установить некоторые библиотеки. Следующие библиотеки обычно используются для увеличения данных:

  • NumPy
  • OpenCV
  • Подушка
  • imgaug

Вы можете установить эти библиотеки с помощью pip:

pip install numpy opencv-python pillow imgaug


Методы увеличения изображения

Здесь мы обсудим пять методов увеличения изображения. Эти методы обсуждаются ниже:

листать

Переворот — один из самых простых и часто используемых методов увеличения изображения. Этот метод включает переворачивание изображения по горизонтали или вертикали. Чтобы реализовать эту технику в Python, мы можем использовать функцию cv2.flip() из библиотеки OpenCV. Вот пример:

import cv2

img = cv2.imread('image.jpg')
flipped_img = cv2.flip(img, 1) # flip horizontally
cv2.imshow('Original', img)
cv2.imshow('Flipped', flipped_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

В приведенном выше примере мы читаем изображение, используя cv2.imread(). Затем мы переворачиваем изображение по горизонтали с помощью cv2.flip() и отображаем исходное и перевернутое изображения с помощью cv2.imshow(). Наконец, мы ждем нажатия клавиши и закрываем окна с помощью cv2.destroyAllWindows().



Вращение

Вращение включает в себя поворот изображения на определенный угол. Чтобы реализовать эту технику в Python, мы можем использовать функции cv2.getRotationMatrix2D() и cv2.warpAffine() из библиотеки OpenCV. Вот пример:

import cv2
import numpy as np

img = cv2.imread('image.jpg')
rows, cols = img.shape[:2]

# rotate by 45 degrees
M = cv2.getRotationMatrix2D((cols/2,rows/2), 45, 1)
rotated_img = cv2.warpAffine(img, M, (cols,rows))

cv2.imshow('Original', img)
cv2.imshow('Rotated', rotated_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

В приведенном выше примере мы читаем изображение, используя cv2.imread(). Затем мы вычисляем матрицу поворота, используя cv2.getRotationMatrix2D(), и поворачиваем изображение, используя cv2.warpAffine(). Наконец, мы отображаем исходное и повернутое изображения с помощью cv2.imshow(), ждем нажатия клавиши и закрываем окна с помощью cv2.destroyAllWindows().



Масштабирование

Масштабирование включает в себя изменение размера изображения на определенный коэффициент. Чтобы реализовать эту технику в Python, мы можем использовать функцию cv2.resize() из библиотеки OpenCV. Вот пример:

import cv2

img = cv2.imread('image.jpg')
resized_img = cv2.resize(img, (0,0), fx=0.5, fy=0.5)

cv2.imshow('Original', img)
cv2.imshow('Resized', resized_img)
cv2.waitKey(0)
cv2.destroyAllWindows() 

В приведенном выше примере мы читаем изображение, используя cv2.imread(). Затем мы изменяем размер изображения с коэффициентом 0,5, используя cv2.resize(). Наконец, мы отображаем исходные изображения и изображения с измененным размером, используя cv2.imshow(), ждем нажатия клавиши и закрываем окна, используя cv2.destroyAllWindows().



Стрижка

Стрижка включает в себя сдвиг одной части изображения при фиксированной другой части. Чтобы реализовать эту технику в Python, мы можем использовать функцию AffineTransform() из библиотеки OpenCV. Вот пример:

import cv2
import numpy as np

img = cv2.imread('image.jpg')
rows, cols = img.shape[:2]

# define the shearing matrix
shear_matrix = np.float32([[1, 0.5, 0], [0, 1, 0]])

# apply the shearing transformation
sheared_img = cv2.warpAffine(img, shear_matrix, (cols, rows))

cv2.imshow('Original', img)
cv2.imshow('Sheared', sheared_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

В приведенном выше примере мы читаем изображение, используя cv2.imread(). Затем мы определяем матрицу сдвига, используя np.float32(), и применяем преобразование сдвига, используя cv2.warpAffine(). Наконец, мы отображаем исходные и обрезанные изображения с помощью cv2.imshow(), ждем нажатия клавиши и закрываем окна с помощью cv2.destroyAllWindows().



Перевод

Перевод включает в себя смещение изображения на определенную величину по осям x и/или y. Чтобы реализовать эту технику в Python, мы можем использовать функцию cv2.warpAffine() из библиотеки OpenCV. Вот пример:

import cv2
import numpy as np

img = cv2.imread('image.jpg')
rows, cols = img.shape[:2]

# define the translation matrix
translation_matrix = np.float32([[1, 0, 50], [0, 1, 50]])

# apply the translation transformation
translated_img = cv2.warpAffine(img, translation_matrix, (cols, rows))

cv2.imshow('Original', img)
cv2.imshow('Translated', translated_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

В приведенном выше примере мы читаем изображение, используя cv2.imread(). Затем мы определяем матрицу перевода, используя np.float32(), и применяем преобразование перевода, используя cv2.warpAffine(). Наконец, мы отображаем исходное и переведенное изображения с помощью cv2.imshow(), ждем нажатия клавиши и закрываем окна с помощью cv2.destroyAllWindows().



Увеличение данных с использованием imgaug

Пакет imgaug — это мощная библиотека Python для увеличения изображений. Он предоставляет широкий спектр методов увеличения изображения и поддерживает пакетную обработку. Вот пример того, как использовать imgaug для увеличения данных:

import numpy as np
import imgaug.augmenters as iaa
from PIL import Image

# read image
img = Image.open('image.jpg')

# define augmentation pipeline
aug_pipeline = iaa.Sequential([
    iaa.Flipud(p=0.5),  # flip vertically
    iaa.Affine(scale=(0.5, 1.5)),  # scaling
    iaa.Affine(rotate=(-45, 45)),  # rotation
    iaa.ShearX((-20, 20)),  # shearing in x direction
    iaa.TranslateX(px=(-50, 50)),  # translation in x direction
])

# apply augmentation pipeline to image
aug_img = aug_pipeline(image=np.array(img))

# save augmented image
aug_img = Image.fromarray(aug_img)
aug_img.save('aug_image.jpg')

В приведенном выше примере мы сначала читаем изображение с помощью функции Image.open() из библиотеки Pillow. Затем мы определяем конвейер расширения, используя iaa.Sequential() из библиотеки imgaug. Конвейер состоит из нескольких методов увеличения, включая отражение, масштабирование, вращение, сдвиг и перевод. Затем мы применяем конвейер расширения к изображению с помощью функции aug_pipeline() и сохраняем увеличенное изображение с помощью функций Image.fromarray() и Image.save() из библиотеки Pillow.



Заключение

В этом руководстве мы обсудили различные методы увеличения данных в Python, включая отражение, вращение, масштабирование, сдвиг и перевод. Мы предоставили примеры кода с использованием как библиотеки OpenCV, так и библиотеки imgaug. Увеличение данных — это мощный метод увеличения размера и разнообразия обучающих данных, который может повысить производительность моделей машинного обучения. Применяя методы увеличения данных к изображениям, мы можем генерировать новые обучающие данные, которые аналогичны исходным данным, но с изменениями, которые делают модель более надежной и точной.