От создания наборов данных до проверки точности вашей программы

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

Для этого предоставленный код написан на Python (3.x), и мы в основном будем использовать библиотеку Keras.

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



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

Что такое сверточная нейронная сеть?

Этот тип нейронной сети состоит из глубокой нейронной сети, которой предшествуют некоторые операции.

В целом, имейте в виду, что изображение - это просто матрица чисел размерности 2, если изображение находится только на уровне серого, и размерности 3, если она содержит цвета (третье измерение предназначено для всех уровней RGB).

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

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

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

Например, получение больших чисел только на строке пикселей означает, что исходное изображение содержит строку там.

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

На рисунке 2 вы можете видеть, что размер изображения разделен на 4 части, каждая из которых имеет самое высокое значение. Новое сформированное изображение меньше.

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

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

Теперь, когда вы знаете основы свертки, мы можем приступить к ее созданию!

Подготовка данных

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

from keras.datasets import mnist #replace mnist with any dataset
(x_train, y_train), (x_test, y_test) = mnist.load_data()

Здесь мы просто вызываем функцию load_data, чтобы установить набор данных для фазы обучения и тестирования. Вы можете заменить «mnist» любым набором данных, который хотите использовать (измените его в обеих строках).

Если вы хотите создать свой собственный набор данных, выполните следующие действия:

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

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

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

Теперь в основной папке мы создадим программу на Python для настройки всех данных.

В строке 14 вы можете изменить список на любые нужные вам классы, но сохраните те же имена, которые вы использовали для вложенных папок ранее.

Наконец, после запуска программы данные помещаются в файлы и готовы к использованию.

Построение сверточной нейронной сети

Если вы решили использовать импортированный набор данных, замените строки 9 и 10 на то, что мы видели ранее, а строку 44 на:

model.fit(x_train, y_train, batch_size=32, epochs=40, verbose=1, validation_data=(x_test, y_test))

В строке 37 измените параметр Dense () на количество имеющихся у вас классов. Это количество возможных выходных данных нейронной сети.

Вы можете видеть, что для каждого сверточного слоя мы всегда сначала добавляем его количество нейронов и размер фильтра. Затем мы задействуем функцию активации и, наконец, используем метод Pooling. Мы также добавили Dropout в строку 30, чтобы увидеть, как это сделать.

Кроме того, перед первым «нормальным» скрытым слоем мы добавили функцию Flatten (), которая преобразует всю информацию из предыдущих сверток во входные данные для нейронов. На данный момент остальная часть просто содержит слои и нейроны из базовой нейронной сети.

Вот он, вы создали свой собственный классификатор!

Прогнозирование класса изображения

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

import cv2
import tensorflow as tf
CATEGORIES = ["bishopB", "bishopW", "empty", "kingB", "kingW",
			"knightB", "knightW", "pawnB", "pawnW",
			"queenB", "queenW", "rookB", "rookW"]
def prepare(file):
    IMG_SIZE = 50
    img_array = cv2.imread(file, cv2.IMREAD_GRAYSCALE)
    new_array = cv2.resize(img_array, (IMG_SIZE, IMG_SIZE))
    return new_array.reshape(-1, IMG_SIZE, IMG_SIZE, 1)
model = tf.keras.models.load_model("CNN.model")
image = "test.jpg" #your image path
prediction = model.predict([image])
prediction = list(prediction[0])
print(CATEGORIES[prediction.index(max(prediction))])

Функция prepare (file) позволяет нам использовать изображение любого размера, поскольку она автоматически изменяет его размер до размера изображения, который мы определили в первой программе.

Если вы изменили размер изображения в программе обработки данных, измените его и здесь.

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

  • Модель: вы можете легко добавлять или удалять некоторые слои в своей нейронной сети, изменять количество нейронов или даже функции активации. У вас есть модель для всего, что вы хотите добавить.
  • Данные: Полученная точность не соответствует вашим ожиданиям? Возможно, вы могли бы добавить больше данных и в основном убедиться, что все ваши изображения хранятся в их хорошей папке.
  • IMG_SIZE: определяется в программе для набора данных, он характеризует размер изображений, с которыми сеть будет работать. Не пытайтесь использовать слишком большое число, поскольку изображения высокого качества требуют более длительного периода обучения. Более того, даже известные базы данных, такие как MNIST, содержат очень мало изображений (28x28 для MNIST). Не забудьте также изменить IMG_SIZE функции изменения формы в последней программе.
  • Новые параметры, такие как обратные вызовы, используемые с Keras. Метод, называемый «EarlyStopping», может помочь вам увеличить продолжительность фазы тренировки и, в основном, избежать переобучения.

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

Спасибо за прочтение !

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