Существует множество наборов данных и руководств по созданию бинарных (2 категории) классификаторов изображений CNN. Однако я не вижу так много ресурсов для создания CNN, классифицирующих изображения, с 3 или более категориями. И есть некоторые важные отличия при разработке CNN небинарной классификации изображений, в отличие от бинарной CNN. В этом руководстве вы узнаете, как создать CNN для набора данных с 3 или более категориями.

Прежде всего, давайте возьмем наш набор данных. Было на удивление сложно найти набор необработанных изображений (значительного размера выборки) с более чем двумя категориями. Тем не менее, я все же нашел на Kaggle солидный набор данных по распознаванию цветов Александра Мамаева. В этом наборе данных есть изображения цветов, принадлежащих к 5 различным категориям: одуванчик, ромашка, тюльпан, роза и подсолнух. В каждой категории от 700 до 1100 изображений.

Хотя изображения этого набора данных уже были разделены на папки по категориям, они не были разделены на наборы для тестирования / обучения. Для этого я использовал быстрый скрипт Python. Вы можете просмотреть этот сценарий здесь.

Теперь о развитии нашей CNN. Очертание моей модели выглядит так

1. Input Convolution Layer, take in 32x32 size images, generate 32 3x3 feature maps
2. Dropout Layer (to prevent Overfitting)
3. Max Pooling Layer (Picks strongest features in feature map)
4. Full Connection/ANN Layers (one with 1,024 units, another with 512 units, both with relu activation function)
5. Output Layer (softmax function)

Вот это наглядное представление. Мы получаем нашу матрицу данных изображения, генерируем несколько карт функций и пул из этих карт функций. Затем мы «сглаживаем» эти данные в вектор для подачи в нашу ИНС / полностью связанные слои. Затем у нас есть выходной слой, который содержит вероятность того, что изображение принадлежит каждой из наших 5 категорий.

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

Теперь перейдем к нашему слою с выпадением. Я установил это значение на 10%, чтобы предотвратить чрезмерную подгонку нашей модели.

И, наконец, мы объединяем с помощью Max Pooling и сглаживаем, чтобы подготовить наши данные для передачи на уровни ANN.

Теперь мы создаем наше «Полное соединение». Я использовал два слоя для нашей ИНС - один занимает 1024 единицы, второй - 512 единиц. Затем идет наш выходной слой, функция softmax, в которой количество узлов эквивалентно количеству категорий (в нашем случае 5).

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

А теперь обучаем нашу модель. Я остановился на 10 эпохах, по 50 шагов на эпоху. Вы можете поиграть с этими числами и посмотреть, как это повлияет на вашу точность.

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

А затем мы можем запустить модель на одном изображении и увидеть результат!

И вот оно! Разве это не было так плохо? Теперь вы можете расширить этот метод, чтобы иметь столько категорий, сколько захотите! И если у вас достаточно данных по качеству и количеству, они будут даже точными: D

Любые вопросы? Комментарии? Слова восхищения? Дайте мне знать в комментариях ниже ❤