Реализация полностью сверточной сети (FCN) для классификации изображений

Предпосылка

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

Примечание. Цель этого руководства - помочь новичкам в FCN создать базовый рабочий FCN в TensorFlow.

Таблица содержания

  1. Вступление
  2. Полностью сверточные сети (FCN)
  3. IDE и настройка среды
  4. Моделирование - (а) подготовка данных, (б) генерация данных, (в) архитектура модели, (г) обучение модели, (д) ​​прогнозирование модели
  5. Заключение
  6. Следующий ход
  7. использованная литература

Вступление

Учебники, связанные с CNN, есть повсюду в Интернете. В большинстве этих руководств для обучения модели используются наборы данных MNIST или CIFAR-10. Тем не менее, особенно в реальной ситуации, у вас будет высокая вероятность получить набор данных с другим размером изображения. Наиболее распространенное решение, которое вы можете найти в Интернете, - это изменить размер изображения до входного размера модели CNN. Однако во многих случаях изменение размера изображений искажает важные функции, что приводит к снижению производительности во время вывода модели.

Полностью сверточная сеть (FCN)

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

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

IDE и настройка среды

Это руководство работает на Python. Если вы уже установили свой редактор кода и среду, вы можете пропустить эту часть. Чтобы скачать Python, перейдите по этой ссылке. (Обратите внимание, что мы используем Python 3.7.0 вместо Python 3.9). Внизу страницы выберите программу установки, соответствующую вашей операционной системе.

После загрузки вы можете запустить установку. На первой странице установки отметьте добавление Python 3.7 в PATH и выберите «Установить сейчас». Теперь мы закончили установку Python.

Мы запустим код на PyCharm Community Edition. Вы можете скачать редактор PyCharm здесь. Выберите свою операционную систему и версию сообщества. После загрузки вы можете запустить установку как обычно. Когда вы перейдете на эту страницу, установите все флажки и нажмите Далее, а затем Установить.

Теперь все готово! Готовы перейти к коду!

Моделирование

Исходный код

Все коды, используемые в этом руководстве, можно найти в этом репозитории GitHub. Чтобы загрузить его, зайдите в репозиторий GitHub, нажмите Код и выберите Загрузить ZIP. После загрузки разархивируйте файлы. Вы можете использовать git clone, если знакомы с Git.

Откройте редактор PyCharm, перейдите в «Файл → Открыть проект» и выберите проект «Python-Fully-Convolutional-Network-Classification».



Часть 1. Подготовка данных

В этом руководстве мы будем использовать набор данных отредактированная цифра MNIST, который можно получить здесь или в этом репозитории GitHub с именем файла dataset.zip. Почему мы используем этот набор данных?

  1. В наборе данных всего 10 классов, что менее сложно.
  2. Набор данных изменяется, поэтому изображения содержат 28X28 пикселей (по умолчанию) и 29X29 пикселей.
  3. Набор данных имеет небольшой размер, поэтому вы можете следовать руководству, даже если у вас нет графического процессора.

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

В файле main.py набор данных будет извлечен, если вы запустите код в первый раз. Фрагмент кода показан ниже:

Данные будут загружены и разделены на набор данных для обучения и тестирования в папке с именем dataset. Информация о наборе данных приведена ниже:

Training Dataset Statistics:
Height Range: 28 --> 29 Average: 28.17
Width Range: 28 --> 29 Average: 28.17
Validation Dataset Statistics:
Height Range: 28 --> 29 Average: 28.20
Width Range: 28 --> 29 Average: 28.20

Часть 2: Генерация данных

В файле generator.py есть класс с именем Generator. Генератор данных разбивает набор данных на пакеты и подает их один за другим во время обучения модели. Но подождите ... зачем вообще использовать генератор?

При обучении CNN мы обычно изменяем размер изображений до одного и того же размера и сохраняем их в массивах или тензорах. Однако при работе с изображениями разных размеров вы не сможете этого сделать (это приведет к ошибке). Мы всегда могли передавать изображения модели одно за другим, но обучение было бы определенно медленным!

Итак, что мы собираемся сделать здесь, так это разделить набор данных на партии и масштабировать изображения до одинакового размера в пакете (т.е. изображение будет дополнено черным фоном. того же размера). Другими словами, размер изображения в пакете одинаков, но размер изображения между пакетами может отличаться! Концепцию можно проиллюстрировать следующим образом:

В этом руководстве, поскольку наше изображение имеет небольшой размер, мы будем использовать размер пакета 128. Мы ожидаем, что наши пакеты будут иметь размер 28X28 или 29X29 пикселей.

Часть 3: Архитектура модели

Мы подготовили данные. А теперь давайте построим модель! Архитектура модели показана ниже:

Это очень простая модель всего с 4 сверточными слоями. Обратите внимание, что в модели нет плотного слоя. Плотный слой заменяется сверточным слоем 1X1 с количеством фильтров, установленным на количество классов (в нашем случае 10 классов).

Часть 4: Обучение модели

Мы закончили с генератором данных, моделью и приступим к обучению нашей модели. Модель, которую я обучил, использовала стохастический градиентный спуск (SGD) в качестве оптимизатора. Обучался за 5 эпох.

Epoch 1/5
469/469 [==============================] - 441s 939ms/step - loss: 1.1455 - accuracy: 0.6353 - val_loss: 0.5554 - val_accuracy: 0.9511
Epoch 2/5
469/469 [==============================] - 382s 815ms/step - loss: 0.5168 - accuracy: 0.8267 - val_loss: 0.1215 - val_accuracy: 0.9771
Epoch 3/5
469/469 [==============================] - 365s 779ms/step - loss: 0.4131 - accuracy: 0.8509 - val_loss: 0.0905 - val_accuracy: 0.9796
Epoch 4/5
469/469 [==============================] - 370s 789ms/step - loss: 0.3665 - accuracy: 0.8613 - val_loss: 0.0720 - val_accuracy: 0.9818
Epoch 5/5
469/469 [==============================] - 371s 791ms/step - loss: 0.3372 - accuracy: 0.8684 - val_loss: 0.0655 - val_accuracy: 0.9834

Всего за 5 эпох мы видим, что модель может получить точность проверки до 98,34%! Это означает, что модель может обучаться на изображениях разных размеров, а также делать прогнозы, используя изображения разных размеров.

Часть 5: Прогнозирование модели

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

Модель хорошо выглядит по прогнозам! По первым 25 изображениям видно, что модель может предсказывать правильные цифры!

Заключение

В заключение: цель построить модель FCN, которая может принимать входные изображения различных размеров, достигнута. Это делает модель более практичной для использования в реальных сценариях. Тем не менее, когда набор данных более сложен (т.е. содержит больше цветовых каналов или больше по размеру), может потребоваться добавить в модель больше слоев, чтобы обеспечить лучшую производительность с точки зрения точности прогноза.

Следующий ход

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

использованная литература

[1] Равлани, Х. (2020) Понимание и реализация полностью сверточной сети (FCN). На пути к науке о данных.

[2] LeCun, Y. (нет данных) База данных рукописных цифр MNIST. MNIST.

[3] 智能 算法. (2020) 全 卷积 神经 网络 (FCN) 详解. 知 乎