Обсуждение необходимости увеличения изображений для CNN для повышения точности нашей модели с использованием различных методов увеличения, присутствующих в KERAS.

В этом блоге мы обсудим следующее:

  • Необходимость увеличения данных
  • Что такое увеличение данных
  • Подробное объяснение методов увеличения данных с помощью Keras.
  • Заполните ссылку на код Github в конце

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

Необходимость увеличения данных

ДАННЫЕ обучения являются основой всего проекта глубокого обучения, больше данных, больше функций, которые можно извлечь, и, таким образом, повысить точность модели. Модели глубокого обучения напрямую зависят от количества данных, но не всегда у нас достаточно данных для обучения наших изображений. Эта проблема лучше всего решается путем увеличения данных.
Увеличение данных является неотъемлемым процессом глубокого обучения, так как при глубоком обучении нам нужны большие объемы данных, а в некоторых случаях невозможно собрать тысячи или миллионы изображений. так что увеличение данных приходит на помощь.

Что такое увеличение данных?

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

  1. Увеличьте количество данных.
  2. Помогите представить наш классификатор более широкому спектру освещения, цвета и различных ситуаций ориентации, чтобы сделать наш классификатор более надежным.
  3. Data Augmentation также помогает уменьшить проблему переобучения. Причина в том, что по мере того, как мы добавляем больше данных, модель не может переобучить все выборки и вынуждена обобщать.

Шаги для выполнения увеличения данных

ImageDataGenerator

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

Начальные шаги для выполнения увеличения данных

Импортировать все необходимые библиотеки

from numpy import expand_dims
from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array
from keras.preprocessing.image import ImageDataGenerator
import matplotlib.pyplot as plt

Загрузка изображений с помощью Python

# load the image
img = load_img('sample_image.jpg')
#View the image
img.show()
# convert to numpy array
data = img_to_array(img)
# expand dimension to one sample
samples = expand_dims(data, 0)

Функция отображения изображения после увеличения

# Common function to view image
def showimage(datagen):
    # prepare iterator
    it = datagen.flow(samples, batch_size=1)
    # generate samples and plot
    for i in range(4):
        # define subplot
        plt.subplot(2, 2, i+1)
        # generate batch of images
        batch = it.next()
        # convert to unsigned integers for viewing
        image = batch[0].astype('uint8')
        # plot raw pixel data
        plt.imshow(image)
    # show the figure
    plt.show()

1. Вертикальный сдвиг

width_shift_range = [-225, 225]

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

Мы можем выполнить сдвиг по ширине, передав значения от 0 до 1, то есть в процентах, или указав пиксели сдвига. Здесь я передал значения кортежа [min, max] пикселей, чтобы определить сдвиг.

По умолчанию для новых пикселей выбирается ближайшее значение пикселя, т. е. тип по умолчанию — fill_mode = «ближайший». Но этот fill_mode можно изменить.

  • fill_mode = ‘reflect’ — зеркальное отражение изображения используется для заполнения новых значений пикселей.

  • fill_mode = ‘wrap’ — происходит повторение или копирование исходных значений пикселей.

  • fill_mode = ‘constant’ — новым пикселям присваиваются постоянные значения, указанные пользователем.

2. Вертикальный сдвиг

height_shift_range = 0.3

Это похоже на сдвиг по горизонтали, с той лишь разницей, что этот сдвиг происходит по высоте изображения. Аналогичные аргументы, такие как пиксели или проценты, также могут быть переданы здесь. Здесь я сдвинул изображение на 30%.

3. Переворот изображения

horizontal_flip = True, vertical_flip = True

Переворот изображения означает перестановку строк или столбцов пикселей в случае вертикального или горизонтального переворота соответственно. Увеличение отражения задается логическим аргументом horizontal_flip или vertical_flip в конструкторе класса ImageDataGenerator.

4. Случайное вращение

rotation_range = 90

Увеличение вращения случайным образом поворачивает изображение по часовой стрелке на заданное число градусов от 0 до 360. Поворот, скорее всего, повернет пиксели из кадра изображения и оставит области кадра без данных о пикселях, которые должны быть заполнены. Здесь у меня есть повернул изображение от 0 до 90.

5. Случайная яркость

brightness_range = [0.5, 1.0]

Яркость изображения может быть увеличена либо за счет случайного затемнения изображений, либо за счет увеличения яркости изображений, либо за счет того и другого. Здесь мы передаем значения в кортеже [min, max]; значение ‹ 1 представляет более темное изображение, а значение›1 создает более яркое изображение.

5. Случайный МАСШТАБ

zoom_range = [0.5, 1.0]

Увеличение масштаба случайным образом увеличивает изображение и либо добавляет новые значения пикселей вокруг изображения, либо соответственно интерполирует значения пикселей. Значения масштаба менее 1,0 будут увеличивать изображение, например. [0,5,0,5] делает объект на изображении на 50% больше или ближе, а значения больше 1,0 уменьшают изображение на 50%, например. [1.5, 1.5] делает объект на изображении меньше или дальше. Масштаб [1.0,1.0] не действует.

6. Сдвиг канала:

channel_shift_range = 150

Сдвиг канала случайным образом сдвигает значения канала на случайное значение, выбранное из диапазона, заданного параметром channel_shift_range.

Окончательный код

# Combining all techniques
# create image data augmentation generator
datagen = ImageDataGenerator(width_shift_range=[-225,225], height_shift_range = 0.3, horizontal_flip=True, vertical_flip=True, rotation_range=90, zoom_range=[0.5,1.0], brightness_range=[0.5,1.0], channel_shift_range = 150)
# prepare iterator
it = datagen.flow(samples, batch_size=1)
# generate samples and plot
for i in range(9):
    # define subplot
    plt.subplot(3, 3, i+1)
    # generate batch of images
    batch = it.next()
    # convert to unsigned integers for viewing
    image = batch[0].astype('uint8')
    # plot raw pixel data
    plt.imshow(image)
# show the figure
plt.show()

Ссылка на GitHub: Увеличение данных

Спасибо, что читаете блог. Надеюсь, вам понравилось, хорошего дня!