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

Это исследование требует перечисления всех увеличений изображений, которые мы можем придумать, и перечисления всех этих комбинаций, чтобы попытаться улучшить производительность модели классификации изображений. Некоторые из самых простых дополнений, которые приходят на ум, - это переворачивание, перевод, вращение, масштабирование, выделение отдельных цветовых каналов r, g, b и добавление шума. Более интересные дополнения связаны с использованием модели генерирующей состязательной сети, иногда с заменой генерирующей сети на генетический алгоритм. Также были предложены некоторые творческие методы, такие как применение фильтров освещения в стиле Instagram к изображениям, применение случайных региональных фильтров повышения резкости и добавление средних изображений на основе методов кластеризации. Эта статья покажет вам, как делать дополнения к изображениям с помощью NumPy.

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

ДОПОЛНЕНИЯ

Все дополнения выполняются с использованием Numpy без библиотеки OpenCV

# Image Loading Code used for these examples
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
img = Image.open('./NIKE.png')
img = np.array(img)
plt.imshow(img)
plt.show()

Листать

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

# Flipping images with Numpy
flipped_img = np.fliplr(img)
plt.imshow(flipped_img)
plt.show()

Переводы

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

# Shifting Left
for i in range(HEIGHT, 1, -1):
  for j in range(WIDTH):
     if (i < HEIGHT-20):
       img[j][i] = img[j][i-20]
     elif (i < HEIGHT-1):
       img[j][i] = 0
plt.imshow(img)
plt.show()

# Shifting Right
for j in range(WIDTH):
  for i in range(HEIGHT):
    if (i < HEIGHT-20):
      img[j][i] = img[j][i+20]
plt.imshow(img)
plt.show()

# Shifting Up
for j in range(WIDTH):
  for i in range(HEIGHT):
    if (j < WIDTH - 20 and j > 20):
      img[j][i] = img[j+20][i]
    else:
      img[j][i] = 0
plt.imshow(img)
plt.show()

#Shifting Down
for j in range(WIDTH, 1, -1):
  for i in range(278):
    if (j < 144 and j > 20):
      img[j][i] = img[j-20][i]
plt.imshow(img)
plt.show()

Шум

Шум - интересная техника увеличения, с которой я начинаю становиться все более знакомой. Я видел много интересных работ по обучению Adversarial, в которых вы можете добавить немного шума в изображение, и в результате модель не сможет правильно его классифицировать. Я все еще ищу способы создать лучший шум, чем на иллюстрации ниже. Добавление шума может помочь с искажениями освещения и в целом сделать модель более устойчивой.

# ADDING NOISE
noise = np.random.randint(5, size = (164, 278, 4), dtype = 'uint8')

for i in range(WIDTH):
    for j in range(HEIGHT):
        for k in range(DEPTH):
            if (img[i][j][k] != 255):
                img[i][j][k] += noise[i][j][k]
plt.imshow(img)
plt.show()

GAN:

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

Как видно из изображений выше, они действительно выглядят как «3», «7» и «9». В настоящее время у меня возникают проблемы с расширением архитектуры сети для поддержки выходных данных кроссовок размером 300x300x3 по сравнению с цифрами MNIST 28x28x1. Однако я очень рад этому исследованию и с нетерпением жду его продолжения!

Спасибо, что прочитали эту статью, надеюсь, теперь вы знаете, как реализовать базовые дополнения данных для улучшения ваших моделей классификации!