Увеличение данных – это метод, обычно используемый в машинном обучении для создания дополнительных данных путем преобразования существующих данных. Этот метод может быть особенно полезен в случаях, когда для обучения модели доступны ограниченные данные. В этом руководстве мы обсудим несколько методов увеличения данных и способы их реализации в 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. Увеличение данных — это мощный метод увеличения размера и разнообразия обучающих данных, который может повысить производительность моделей машинного обучения. Применяя методы увеличения данных к изображениям, мы можем генерировать новые обучающие данные, которые аналогичны исходным данным, но с изменениями, которые делают модель более надежной и точной.