Увеличение данных — это один из методов, используемых для повышения производительности в системах компьютерного зрения. Большинство задач компьютерного зрения могли бы использовать больше данных. Используя увеличение данных, мы можем увеличить размер нашего набора данных.

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

Рассмотрим каждый из вышеперечисленных способов.

Горизонтальное смещение

Горизонтальное смещение означает перемещение всех пикселей изображения влево и вправо. Затем некоторые значения пикселей обрезаются с одной стороны, а некоторые значения пикселей указываются с другой стороны. Мы можем использовать width_shift_range в классе ImageDataGenerator в библиотеке Keras для выполнения этой задачи.

import cv2
from matplotlib.pyplot import figure
from keras.preprocessing.image import ImageDataGenerator
import matplotlib.pyplot as plt
# load original image
load_img = cv2.imread('deepblade.png')
img = expand_dims(load_img, 0)
# create image data augmentation with horizontal shifting
datagen = ImageDataGenerator(width_shift_range=[-100,100])
it = datagen.flow(img, batch_size=1)
figure(figsize=(20, 16), dpi=60)
plt.subplot(331)
plt.imshow(load_img)
plt.title('Original')
plt.subplot(332)
batch = it.next()
plt.imshow(batch[0].astype('uint8'))
plt.subplot(333)
batch = it.next()
plt.imshow(batch[0].astype('uint8'))
plt.show()

Вертикальное смещение

Сдвиг по вертикали означает перемещение всех пикселей изображения вверх и вниз. Затем некоторые значения пикселей обрезаются с одной стороны, а некоторые значения пикселей указываются с другой стороны. Мы можем использовать height_shift_range в классе ImageDataGenerator в библиотеке Keras для выполнения этой задачи.

import cv2
from matplotlib.pyplot import figure
from keras.preprocessing.image import ImageDataGenerator
import matplotlib.pyplot as plt
# load original image
load_img = cv2.imread('deepblade.png')
img = expand_dims(load_img, 0)
# create image data augmentation with vertical shifting
datagen = ImageDataGenerator(height_shift_range=0.5)
it = datagen.flow(img, batch_size=1)
figure(figsize=(20, 16), dpi=60)
plt.subplot(331)
plt.imshow(load_img)
plt.title('Original')
plt.subplot(332)
batch = it.next()
plt.imshow(batch[0].astype('uint8'))
plt.subplot(333)
batch = it.next()
plt.imshow(batch[0].astype('uint8'))
plt.show()

Вращение

Мы можем случайным образом поворачивать изображения на градус от 0 до 360. Каждое повернутое изображение будет уникальным. Для выполнения этой задачи мы также можем использовать класс ImageDataGenerator в библиотеке Keras. Здесь полезен аргумент rotation_range.

import cv2
from matplotlib.pyplot import figure
from keras.preprocessing.image import ImageDataGenerator
import matplotlib.pyplot as plt
# load original image
load_img = cv2.imread('deepblade.png')
img = expand_dims(load_img, 0)
# create image data augmentation with rotation range 0-90 degrees
datagen = ImageDataGenerator(rotation_range=90)
it = datagen.flow(img, batch_size=1)
figure(figsize=(20, 16), dpi=60)
plt.subplot(331)
plt.imshow(load_img)
plt.title('Original')
plt.subplot(332)
batch = it.next()
plt.imshow(batch[0].astype('uint8'))
plt.subplot(333)
batch = it.next()
plt.imshow(batch[0].astype('uint8'))
plt.show()

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

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

import cv2
from matplotlib.pyplot import figure
from keras.preprocessing.image import ImageDataGenerator
import matplotlib.pyplot as plt
# load original image
load_img = cv2.imread('deepblade.png')
img = expand_dims(load_img, 0)
# create image data augmentation with zooming
datagen = ImageDataGenerator(zoom_range=[0.5,1])
it = datagen.flow(img, batch_size=1)
figure(figsize=(20, 16), dpi=60)
plt.subplot(331)
plt.imshow(load_img)
plt.title('Original')
plt.subplot(332)
batch = it.next()
plt.imshow(batch[0].astype('uint8'))
plt.subplot(333)
batch = it.next()
plt.imshow(batch[0].astype('uint8'))
plt.show()

Яркость

Изменение яркости изображений — еще один способ увеличения данных. Затем мы можем генерировать более темные или светлые изображения по сравнению с исходным изображением. Для этого мы можем использовать аргумент brightness_range в классе ImageDataGenerator.

import cv2
from matplotlib.pyplot import figure
from keras.preprocessing.image import ImageDataGenerator
import matplotlib.pyplot as plt
# load original image
load_img = cv2.imread('deepblade.png')
img = expand_dims(load_img, 0)
# create image data augmentation with brightness changing
datagen = ImageDataGenerator(brightness_range=[0.1,0.8])
it = datagen.flow(img, batch_size=1)
figure(figsize=(20, 16), dpi=60)
plt.subplot(331)
plt.imshow(load_img)
plt.title('Original')
plt.subplot(332)
batch = it.next()
plt.imshow(batch[0].astype('uint8'))
plt.subplot(333)
batch = it.next()
plt.imshow(batch[0].astype('uint8'))
plt.show()

Добавлять шум

Добавление шума — очень эффективная часть увеличения данных. Полезно использовать изображения с шумом для размытых изображений.

import cv2
import matplotlib.pyplot as plt
from skimage.util import random_noise
from matplotlib.pyplot import figure
# read original image
I = cv2.imread('deepblade.png',1)
# add gaussian noise to original image
gauss = random_noise(I, mode='gaussian', seed=None, clip=True)
figure(figsize=(20, 16), dpi=60)
plt.subplot(241)
plt.imshow(I)
plt.title('Original')
plt.subplot(242)
plt.imshow(gauss)
plt.title('With Noise')
plt.show()

Обрезка

Обрезка означает выделение части изображения. Затем увеличьте это обрезанное изображение и измените его размер до исходного размера изображения.

from PIL import Image
from random import randrange
import matplotlib.pyplot as plt
# read original image
img = Image.open('deepblade.png') 
x, y = img.size
matrix = 400
sample = 10
sample_list = []
x1 = randrange(0, x - matrix)
y1 = randrange(0, y - matrix)
# randomly crop original image
sample_list.append(img.crop((x1, y1, x1 + matrix, y1 + matrix)))
x1 = randrange(0, x - matrix)
y1 = randrange(0, y - matrix)
# randomly crop original image
sample_list.append(img.crop((x1, y1, x1 + matrix, y1 + matrix)))
figure(figsize=(20, 16), dpi=60)
plt.subplot(331)
plt.imshow(img)
plt.title('Original')
plt.subplot(332)
plt.imshow(sample_list[0])
plt.subplot(333)
plt.imshow(sample_list[1])

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

Мы можем изменить размер изображения внутрь и наружу, чтобы изменить масштаб исходного изображения. Затем полученное изображение может быть меньше или больше исходного изображения путем масштабирования.

from PIL import Image
import matplotlib.pyplot as plt
# load original image
image = Image.open('deepblade.png')
figure(figsize=(20, 16), dpi=60)
plt.subplot(331)
plt.imshow(img)
plt.title('Original')
plt.subplot(332)
# resize image
resized_image = image.resize((400,300))
plt.imshow(resized_image)
plt.title('Resized image')

Насыщенность

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

import PIL
import matplotlib.pyplot as plt
# load original image
img = Image.open('deepblade.png')
converter = PIL.ImageEnhance.Color(img)
figure(figsize=(20, 16), dpi=60)
plt.subplot(331)
plt.imshow(img)
plt.title('Original')
plt.subplot(332)
# when half of the colors in original image
img2 = converter.enhance(0.5)
plt.imshow(img2)
plt.subplot(333)
# when doubled the colors in original image
img3 = converter.enhance(2)
plt.imshow(img3)

Преимущества увеличения данных

  • Увеличьте размер тренировочного набора
  • Избегайте проблем с переоснащением
  • Обобщить модель
  • Сокращение затрат при сборе размеченных данных

Выучить больше:

Книги:

Практическое машинное обучение с помощью Scikit-Learn, Keras и TensorFlow

Искусственный интеллект и машинное обучение для программистов

Учебники:

"Машинное обучение"

Глубокое обучение

"Обработка естественного языка"