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