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

Обзор проекта

Классификация изображений стала одним из самых влиятельных нововведений в Computer Vision со времен первого цифрового сканера изображений. Разработка моделей, которые могут классифицировать изображения, добилась огромных успехов в способах взаимодействия людей (социальные сети, поисковые системы и обработка изображений), розничной торговле (как лично, так и в Интернете), маркетинге, театре и исполнительском искусстве, правительстве, слежке, правоохранительных органах. и т. д. Благодаря алгоритмам классификации изображений мы можем получать уведомления в социальных сетях, когда кто-то публикует фотографию, которая может быть похожа на нас, или распознавать объекты в беспилотных автомобилях! Идея программы, способной идентифицировать значимые объекты на изображении и судить о том, что это такое, с чем связано и где находится, основываясь только на информации, содержащейся в изображении, имеет бесконечное множество применений. Я реализовал эту классификацию с помощью сверточных нейронных сетей. Этот проект является частью моей наностепени Udacity, и я отдаю должное им за использованные источники данных, а также за часть кода в этой статье. Описание проекта доступно [здесь](https://github.com/udacity/dog-project). Наборы данных, предоставленные Udacity для этого проекта, включают:

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

Постановка задачи

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

Проект разделен на восемь этапов;

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

Метрики

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

Исследование и визуализация данных

Импорт наборов данных

Чтобы правильно выполнить нашу классификацию, нам пришлось импортировать много данных, связанных с собаками. Было 133 категории собак и 8351 изображение собак. Нам также пришлось импортировать данные о людях, потому что мы пытались сопоставить породу собак, наиболее похожую на данное человеческое лицо. В наборе данных было 13233 человеческих лица.

Обнаружение людей

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

Обнаружение собак

В этом разделе мы используем предварительно обученную модель ResNet-50 для обнаружения собак на изображениях. Наша первая строка кода загружает модель ResNet-50 вместе с весами, которые были обучены в ImageNet, очень большом и очень популярном наборе данных, используемом для классификации изображений и других задач зрения. ImageNet содержит более 10 миллионов URL-адресов, каждая из которых ведет к изображению, содержащему объект одной из 1000 категорий. При наличии изображения эта предварительно обученная модель ResNet-50 возвращает прогноз (полученный из доступных категорий в ImageNet) для объекта, содержащегося в изображении.

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

При использовании TensorFlow в качестве серверной части, CNN Keras требуют в качестве входных данных массива 4D (который мы также будем называть тензором 4D) с формой

(nb_samples, строк, столбцов, каналов), (nb_samples, строк, столбцов, каналов),

где nb_samples соответствует общему количеству изображений (или выборок), а rows, columns и channels соответствуют количеству строк, столбцов и каналов для каждого изображения соответственно.

Приведенная ниже функция path_to_tensor принимает в качестве входных данных путь к файлу со строковым значением к цветному изображению и возвращает четырехмерный тензор, подходящий для передачи в Keras CNN. Сначала функция загружает изображение и изменяет его размер до квадратного изображения размером 224×224224×224 пикселя. Затем изображение преобразуется в массив, размер которого затем изменяется до четырехмерного тензора. В данном случае, поскольку мы работаем с цветными изображениями, каждое изображение имеет три канала. Точно так же, поскольку мы обрабатываем одно изображение (или образец), возвращаемый тензор всегда будет иметь форму

(1,224,224,3).(1,224,224,3).

Функция paths_to_tensor принимает в качестве входных данных пустой массив путей изображения со строковым значением и возвращает 4D-тензор с формой

(nb_samples,224,224,3).(nb_samples,224,224,3).

Здесь nb_samples — это количество выборок или количество изображений в предоставленном массиве путей к изображениям. Лучше всего думать о nb_samples как о количестве трехмерных тензоров (где каждый трехмерный тензор соответствует другому изображению) в наборе данных.

Выполнение

Создание CNN для классификации пород собак (с нуля)

Сверточные нейронные сети (CNN) — это класс глубоких нейронных сетей, которые в основном используются для анализа изображений. В определенной степени дизайн сверточных сетей был вдохновлен тем, как мозг млекопитающего обрабатывает визуальные впечатления. Инвариантность перевода и общие веса в основном упоминаются для объяснения преимуществ CNN перед использованием других типов нейронных сетей при анализе изображений. Архитектура сверточной сети предполагает использование нескольких скрытых слоев, которые выполняют математические операции свертки на своем входе. Архитектура нашей модели имеет входной слой размером 224*224*3. Затем входные данные подаются на два сверточных слоя, за которыми следует слой максимального объединения (для понижения частоты дискретизации). Затем выходные данные передаются на уровень объединения глобальных средних значений, чтобы свести к минимуму переоснащение за счет уменьшения количества параметров. Выходной слой возвращает 133 вероятности для наших пород.

  • Слои CNN извлекают высокоуровневые семантические функции, работая с низкоуровневыми функциями.
  • Выпадающие слои случайным образом удаляют часть сети, так что каждая часть нейронной сети может иметь возможность настроиться отдельно.
  • Функция активации Relu обеспечивает нелинейные преобразования, предотвращая насыщение градиента.
  • Известно, что более глубокие модели обеспечивают лучшую производительность, поэтому я добавил два полносвязных слоя перед выходным слоем softmax.

Затем наша модель была обучена и измерена на точность. Я использовал 11 эпох и получил точность 2,87% и 3,5885% со второй попытки, что выше 1%.

Уточнение

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

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

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

Создайте CNN для классификации пород собак (используя трансферное обучение)

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

С помощью предварительно обученной модели InceptionV3 мы создаем полносвязные (FC) слои со следующими кодами. Мы также добавляем два выпадающих слоя, чтобы предотвратить переоснащение.

Оценка и проверка модели

Производительность

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

Точность тестирования архитектуры

CNN с нуля (начальный) — 2,87%

CNN с нуля (вторая попытка) — 3,5885%

С нуля CNN (улучшено) с использованием InceptionV3 — 80,980%

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

Обоснование

В этом проекте мы обсудили два подхода к разработке алгоритма идентификации пород собак и добились наилучших результатов с применением модели трансферного обучения. В наших тестах мы получили точность 80,9%, что было очень хорошим улучшением по сравнению с производительностью нашей первоначальной модели в 3,5%. Трансферное обучение имеет несколько преимуществ, но основными преимуществами являются экономия времени обучения, более высокая производительность нейронных сетей (в большинстве случаев) и отсутствие необходимости в большом количестве данных.

Вывод

Как показано в этом проекте, реализация CNN является относительно простым способом выполнения классификации изображений. Keras предоставляет простой способ реализации нескольких типов архитектур CNN и облегчает точную настройку гиперпараметров, чтобы модели можно было легко оптимизировать. Наша исходная модель имела очень низкую точность — 3,5 %, но с применением трансферного обучения мне удалось увеличить производительность до 80,9 %. Аспект алгоритма, способный сравнить человеческое лицо с изображением собаки, был чем-то, что меня заинтриговало. Несмотря на относительно неплохую оценку точности, алгоритм смог точно предсказать образцы изображений, которые ему предоставили.

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

  • Мы могли бы собрать больше обучающих данных.
  • Мы могли бы использовать увеличение данных, чтобы предотвратить переоснащение.
  • В этом проекте я пытался обучить модель на VGG-16 и InceptionV3. Следующим шагом может быть попытка обучения моделей с использованием разных архитектур, а также изменение архитектуры наших полносвязных слоев.

Код к проекту можно найти [здесь](https://github.com/UOIKENNA/Udacity_dog_app_capstone)