Руководство для начинающих по классификации изображений

Этот пост в блоге является частью программы Udacity Data Scientist Nano Degree.

Введение

Классификация изображений в машинном обучении прошла долгий путь от классификации простых объектов на изображении до их реализации в беспилотном автомобиле. В течение нескольких десятилетий анализ/классификация изображений оставались труднодостижимыми из-за вычислительных ограничений. Прорыв произошел, когда к проблеме классификации изображений подошли с использованием глубокого обучения для обучения модели. Технологические достижения в графических процессорах (графических процессорах) значительно помогли в параллельной обработке и вычислении необходимых параметров моделей глубокого обучения. Глубокое обучение используется почти во всех сложных постановках задач машинного обучения — зрении, речи, переводе и т. д. При классификации изображений мы используем сверточную нейронную сеть (CNN), алгоритм, который использует слой свертки в нейронной сети. Получить краткое представление об алгоритме можно здесь. В этом посте я расскажу об использовании CNN для классификации изображений собак по их породам. Цель проекта — разработать функцию, которая принимает изображение в качестве входных данных и классифицирует изображение как человека или собаку, а затем классифицирует породу собаки.

Подход

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

Наборы данных

Для этого проекта Udacity предоставил наборы данных изображений людей и собак. Всего имеется 8351 изображение собак, принадлежащих к 133 различным породам, и 13 233 изображения людей. Мы будем использовать 6680 изображений собак для обучения модели, 835 изображений для проверки модели и 836 изображений для тестирования модели.

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

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

После реализации мы можем проверить производительность алгоритма.

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

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

Теперь, когда мы можем обнаруживать людей на изображении, мы разработаем метод обнаружения собак. Для этого мы будем использовать предварительно обученную модель ResNET-50. ResNET-50 — это CNN с 50 слоями. Он был обучен на 1000 категориях различных изображений с использованием около миллиона изображений из базы данных ImageNet. Для этой предварительно обученной модели требуется ввод изображения размером 224*224 пикселя. Итак, сначала мы выполняем предварительную обработку входных изображений, чтобы использовать модель для обнаружения собак.

Классы прогнозирования ResNET-50 151–268 принадлежат разным породам собак, поэтому, когда мы пытаемся обнаружить собак в наших данных, мы должны проверить, принадлежит ли прогнозируемый класс к какой-либо из этих категорий. Как только мы реализуем эту логику, мы проверяем производительность модели, запуская ее на изображениях людей, а также на изображениях собак. Как мы видим, он работает хорошо и определяет каждое изображение как изображение собаки в данных о собаках.

Разработать CNN с нуля

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

Мы также обрабатываем тензоры изображений путем масштабирования.

После обработки входных данных мы строим нейронную сеть CNN. Разработал модель CNN, используя 5 слоев свертки и 2 полносвязных слоя. Выходные данные каждого слоя свертки объединяются с использованием слоя максимального пула для извлечения функции, а нормальная функция партии используется для более быстрой сходимости. Я добавил экспоненциальное увеличение фильтров в каждом слое, чтобы идентифицировать различные функции на изображении. Начал с 16 фильтров и дошел до 256 на пятом слое. Выпрямительный линейный блок (Relu) использовался в качестве функции активации во всех слоях, кроме выходного. Эта архитектура была разработана после многочисленных проб и ошибок.

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

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

Точность модели составила 18,8% на тестовых данных. Это лучше, чем порог случайного предположения, который составляет 1/133, но это не лучшая модель, так как показатель точности очень низок. Мы могли бы увеличить количество эпох и посмотреть, улучшится ли точность модели. При обучении с использованием 100 эпох точность проверки не улучшилась.

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

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

Перенесите обучение в машинное обучение, как следует из названия, перенесите существующие знания о наборе данных на новую проблему и избегайте изучения аналогичных данных с нуля. Он очень популярен в глубоком обучении и помогает нам разрабатывать более качественные и точные модели за относительно короткое время. В классификации изображений существуют различные предварительно обученные модели, разработанные с использованием миллионов изображений, которые классифицируют обычные объекты, такие как автомобили, деревья, животные и т. д. Я выбрал Inception V3, предварительно обученную модель, которая была разработана на базе данных imagenet и идеально подходила для современное состояние комплексной классификации изображений пород собак. Я заморозил все веса предварительно загруженной модели, кроме выходного слоя. Я изменил последний линейный слой, чтобы вывести 133 класса вместо 1000 классов базы данных imagenet. Для обучения передаче этот последний слой должен был быть обучен на основе нашего набора данных.

Я обучил модель, используя данные о породах собак, чтобы получить параметры финального слоя, используя 20 эпох, и проверил точность тестовых данных. Модель работала намного лучше, чем модель, разработанная с нуля.

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

Финальная программа

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

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

Представление

Давайте посмотрим, как работает программа, когда мы вводим совершенно новые изображения.

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

Вывод

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

  • Добавьте больше слоев в модель трансферного обучения, чтобы повысить сложность
  • Увеличение данных, чтобы избежать переобучения
  • Увеличьте количество точек данных, используемых для разработки модели
  • Увеличьте количество эпох, используемых для разработки модели

Анализ и блокнот вы можете найти здесь.

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

Поскольку этот проект является частью программы Udacity Data Scientist Nanodegree, часть кода в записной книжке была предоставлена ​​Udacity.