В настоящее время я работаю над исследованием, посвященным изучению глубины и эффективности увеличения данных изображения. Цель этого исследования - узнать, как увеличить размер набора данных для обучения надежных моделей сверточной сети с ограниченными или небольшими объемами данных.
Это исследование требует перечисления всех увеличений изображений, которые мы можем придумать, и перечисления всех этих комбинаций, чтобы попытаться улучшить производительность модели классификации изображений. Некоторые из самых простых дополнений, которые приходят на ум, - это переворачивание, перевод, вращение, масштабирование, выделение отдельных цветовых каналов 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. Однако я очень рад этому исследованию и с нетерпением жду его продолжения!
Спасибо, что прочитали эту статью, надеюсь, теперь вы знаете, как реализовать базовые дополнения данных для улучшения ваших моделей классификации!