Сверточная нейронная сеть

CNN (Сверточная нейронная сеть) — это распространенный тип искусственной нейронной сети, используемой для классификации изображений и предназначенной для обработки данных пикселей. Архитектура CNN состоит из нескольких слоев искусственных нейронов, которые будут принимать большой набор данных помеченных изображений, обрабатывать данные через скрытые слои и выводить класс изображения. В этой статье будет рассмотрен пример приложения CNN для определения породы собак по входным изображениям.

Введение

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

Насколько хорошо вы определяете породу собак?

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

Набор данных

Для выполнения задачи набор данных, предоставленный Udacity, содержит 8351 образец, представляющий 133 породы собак. Набор для обучения, проверки и тестирования распределяется следующим образом:

Обзор

Стратегия решения этой проблемы, представленная в записной книжке, предоставленной Udacity, выглядит следующим образом:

  • Шаг 0: Импорт наборов данных
  • Шаг 1: Обнаружение людей
  • Шаг 2: Обнаружение собак
  • Шаг 3: Создайте CNN для классификации пород собак (с нуля)
  • Шаг 4: Используйте CNN для классификации пород собак (с использованием трансферного обучения)
  • Шаг 5: Создайте CNN для классификации пород собак (с использованием трансферного обучения)
  • Шаг 6: Напишите свой алгоритм
  • Шаг 7: Проверьте свой алгоритм

В этом проекте использовалась реализация OpenCV каскадных классификаторов на основе признаков Хаара для обнаружения человеческих лиц на изображениях (шаг 1). OpenCV предоставляет множество предварительно обученных детекторов лиц, хранящихся в виде XML-файлов на github. Мы скачали один из этих детекторов и сохранили его в каталоге haarcascades.

На шаге 2 для обнаружения собак проект использовал модель ResNet-50 для обнаружения собак из набора данных изображений. Модель ResNet-50 обучается на наборе данных ImageNet.

Предварительная обработка данных

Keras по умолчанию использует TensorFlow в качестве серверной части; это означает, что CNN требует в качестве входных данных четырехмерный массив с именем tensor; 4 измерения представляют (nb_sample, rows, columns,channels). Предварительным шагом к обработке изображения является преобразование его в тензор.

Функция path_to_tensor берет файлы изображений, доступные в пути к файлу, и изменяет их размер до 224 224. Тензор 4 (1, 224, 224, 3) представляет измененный размер изображения 1 образца, 224x224 пикселя, 3 канала (RGB).

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

Архитектура CNN

Алгоритм CNN построен с использованием библиотеки Keras, его довольно просто использовать. CNN в проекте выбрала пять сверточных слоев с нейронами (16, 32, 64, 96, 128). Параметры, используемые в функции Conv2D, представляют собой входную форму размером 224X224X3 на входном слое. Номер класса на выходе равен 133, что представляет собой количество возможных пород собак для классификации.

Добавлены отсева, чтобы уменьшить переобучение. Разработанная архитектура достигла точности 12,6% для 30 эпох и batch_size = 20.

Трансферное обучение

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

Я использовал узкие места сети Resnet-50 для изучения передачи. Udacity предоставил функции, доступные в Keras.

Особенности узкого места — это концепция использования предварительно обученной модели в нашем случае Resnet-50 и отсечения верхнего классифицирующего слоя, а затем ввода этого «отрезанного» Resnet-50 в качестве первого слоя в нашу модель.

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

Архитектура, рассчитанная с использованием узких мест в сети Resnet-50, достигла точности тестирования 79,6% за 20 эпох и batch_size = 20.

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

Внедрение детектора человека/собаки

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

Потом,

  • если на изображении обнаружена собака, вернуть предсказанную породу.
  • если на изображении обнаружен человек, вернуть похожую породу собаки.
  • если ни один не обнаружен на изображении, предоставьте вывод, указывающий на ошибку.

Для проверки алгоритма мы использовали 7 образцов изображений, где 2 — люди, 4 — собаки, а 1 — ни то, ни другое. Некоторые из них приведены ниже:

Отражение

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

i) Улучшить алгоритм face_detector. Я бы построил новую нейронную сеть, используя трансферное обучение.

2.) Точная настройка гиперпараметров.

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

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