Этот пост посвящен моему проекту Udacity Data Science Nanodegree. Одним из вариантов проекта стал классификатор пород собак. В этом проекте используются сверточные нейронные сети (CNN)! В этом проекте мы узнаем, как построить конвейер для обработки реальных изображений, предоставленных пользователями.

Определение проекта:

Цель проекта — создать веб-приложение, способное определять породу собаки, если на вход подается фотография или изображение. Учитывая изображение собаки, алгоритм определит оценку породы собаки. Если предоставлено изображение человека, код идентифицирует похожую породу собаки.

Набор данных для этого проекта предоставлен Udacity. мы используем python 3.6 с TensorFlow в качестве серверной части Keras. Кроме того, мы будем использовать трансферное обучение, чтобы продемонстрировать, как трансферное обучение может быть эффективным методом обучения модели машинного обучения с меньшим количеством данных и небольшими вычислительными ресурсами.

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

Набор файлов — Стартовый код — используется и доступен здесь — стартовый код.

Для проекта требуется Python 3.6+, а файлы можно загрузить из репозитория GitHub

Показатели:

Проект требует, чтобы окончательная модель CNN имела точность более 60 процентов, т. е. мы должны быть в состоянии правильно классифицировать по крайней мере 60 изображений из 100 изображений. Мы будем использовать разные подходы

  1. Простой CNN с нуля
  2. Используйте CNN с трансферным обучением
  3. Создайте CNN с трансферным обучением (здесь мы настроим последний слой, чтобы повысить точность)

Мы будем проверять точность валидации и обеспечим, чтобы она была больше 60 %.

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

Наборы данных и входные данные

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

There are 133 total dog categories.
There are 8351 total dog images.

Мы будем делить данные следующим образом

Training:  6680 training dog images.
Validation: 835 validation dog images.
Test: 836 test dog images

Методология

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

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

Реализация:

Для реализации мы будем использовать ноутбук Jupyter и рабочее пространство графического процессора, предоставленное udacity. Вы можете использовать любое рабочее пространство на базе графического процессора (aws, gcp, floydhub), поддерживающее Keras и python.

Теперь мы шаг за шагом пройдемся по блокноту Jupyter, процесс реализации был разбит на следующие отдельные шаги.

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

Шаг 0: импорт наборов данных

На этом этапе мы будем импортировать набор данных о собаках, а также настроим библиотеки, необходимые для приложения.

Мы широко использовали keras для создания CNN, мы также использовали sklearn для загрузки набора данных, OpenCV и PIL для работы с изображениями, matplotlib для просмотра изображений и numpy для обработки тензоров.

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

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

There are 133 total dog categories.
There are 8351 total dog images.

There are 6680 training dog images.
There are 835 validation dog images.
There are 836 test dog images.

Шаг 1. Обнаружение людей

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

Этот код ниже — всего лишь тест производительности нашего детектора лиц.

Результаты не идеальны, но приемлемы.

  • Обнаруженные человеческие лица: 100%
  • Обнаруженные лица у собак: 11%

Шаг 2. Обнаружение собак

Для детектора собак мы использовали предварительно обученную сеть Resnet50. Используемые веса были стандартными для сети изображений набора данных.

Для keras изображения должны быть четырехмерными. В функции path_to_tensor мы обрабатываем одно изображение, поэтому на выходе получается (1 224 224,3), где 1 изображение, 224 пикселя в ширину, 224 пикселя в высоту и 3 красных цвета. зеленый и синий.

Изображение загружается с помощью библиотеки PIL и преобразуется в размер 224x224. метод img_to_array разделяет цвета на (224x224x3), и, наконец, мы добавляем размер спереди, используя функцию numpy expand_dims, чтобы получить наш (1,224,224,3).

Затем функция paths_to_tensor складывает изображения, возвращенные из path_to_tensor, в 4D-тензор с количеством изображений из обучающих, проверочных или тестовых наборов данных в зависимости от того, какой img_path вызывается.

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

Вы заметите, что категории, соответствующие собакам, появляются в непрерывной последовательности и соответствуют ключам словаря 151–268, и это объясняет возврат функции dog_detector ниже. Если прогноз находится в этом диапазоне (от 151 до 268), верните True.

  • Изображения в human_files_short, на которых обнаружена собака: 0%
  • Изображения в dog_files_short с обнаруженной собакой: 100%

Шаг 3. Создайте CNN для классификации пород собак (с нуля)

Здесь мы создадим модель CNN с нуля,

Сеть, которую я выбрал, состояла из 3 слоев свертки с 3 слоями максимального объединения для уменьшения размерности и увеличения глубины. Использовались фильтры 16, 32, 64 соответственно.

В конце был добавлен полносвязный слой со 133 узлами для соответствия нашим классам пород собак и функцией активации soft-max для получения вероятностей для каждого из классов. Выпадения не были добавлены, чтобы сделать сеть очень примитивной. Настройки по умолчанию с Адамом использовались в качестве оптимизатора функции потерь.

Цель состояла в том, чтобы получить модель CNN с точностью >1%. Описанная выше сеть достигла 3,466% без какой-либо аугментации данных.

Шаг 4. Используйте CNN для классификации пород собак (с помощью трансферного обучения)

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

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

Узким местом являются последние карты активации в VGG16 (полностью связанные слои для классификации были обрезаны), что делает его теперь эффективным средством извлечения признаков.

Проверить код

Шаг 5. Создайте CNN для классификации пород собак (с помощью трансферного обучения)

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

Я решил использовать модель VGG16, так как она мне очень удобна.

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

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

Здесь мы определили архитектуру предварительно обученных моделей.

Точность теста VGG16: 75,52%

Шаг 6. Напишите свой алгоритм

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

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

Шаг 7. Проверьте свой алгоритм

Давайте теперь протестируем алгоритм на нескольких изображениях собак, приложение работает нормально.

Вот результаты

Вот и все, наше приложение Dog готово, и оно тоже работает :D

Уточнения

Мы начали с модели CNN, которая была сделана с нуля, мы получили точность 3 процента, затем мы попробовали CNN с трансферным обучением (без изменений в последнем слое), мы достигли точности 40%, и последняя модель, которую мы попробовали, была VGG16 Transfer Learning. модель, где финальные слои были настроены с помощью отсева и классификатора soft-max для класса 133. Результаты составили 75%.

Результаты

Сводка результатов ниже

Обоснование:

Последний подход Customized CNN с трансферным обучением (VGG16) работает лучше, чем все модели, которые мы создали до сих пор, и также преодолевает порог проекта в 60 %. Хотя модель может быть дополнительно настроена для повышения точности, но это выходит за рамки данного проекта.

Вывод:

Отражение:

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

Улучшение:

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

Ссылки: