Этот пост в блоге расскажет вам все, что вам нужно знать, чтобы сделать это самостоятельно!

Код, используемый для этого проекта, можно найти в этом репозитории Github.

Скелетный код был предоставлен Udacity в рамках программы Data Science Nano Degree.

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

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

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

(Количество правильных прогнозов)/(Общее количество прогнозов)

Анализ данных

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

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

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

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

  • Загрузите изображение из пути к файлу и измените его размер до 224 x 224 пикселей.
  • Преобразуйте это в трехмерный тензор с формой (224, 224, 3), где 3 значения представляют значения RGB пикселя.
  • Преобразуйте это в тензор 4D с формой (1, 224, 224, 3), чтобы его можно было правильно интерпретировать моделью глубокого обучения.

Выполнение

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

CNN с нуля

Сначала мы инициализируем нашу модель, запустив следующий код:

Как только это будет сделано, мы можем использовать «model.add(…)», чтобы добавить слои в нашу модель глубокого обучения. Мы следуем примеру модели в блокноте Udacity с кодом ниже:

Это оставляет нас с приведенным ниже кратким описанием модели:

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

  • conv2d — это стандартный слой свертки, который принимает квадратный набор значений и умножает каждое значение на значение ядра, чтобы получить на выходе одно число для использования следующим слоем. Это основной метод извлечения признаков из изображения, поскольку с его помощью можно обнаружить края и формы.
  • max_pooling_2d удаляет маленькие значения, беря максимальное значение из квадратного набора пикселей.
  • global_average_pooling2d берет 27 x 27 x 64 и берет средние значения по срезам 27 x 27, чтобы получить тензор с формой (1, 1, 64), который преобразуется в одномерный вектор размера 64. Это используется для значительного уменьшения числа параметров, необходимых для обучения модели без потери слишком большого количества информации
  • Наконец, мы применяем плотный слой, который дает нам наши окончательные прогнозы. Мы используем активацию «softmax» с выходным размером 133. Это даст нам 133 значения, которые в сумме дают 1, что представляет собой прогнозируемую вероятность того, что каждая из 133 пород будет породой, показанной на фотографии.

Создав нашу модель, мы тренируем ее в течение 5 эпох. Эпоха — это полный запуск набора данных, поэтому модель будет проходить все обучающие данные 5 раз и сохранять лучшие веса в файле hdf5.

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

Учитывая, что существует 133 различных породы, наша базовая модель простого угадывания даст нам точность 0,75%. Мы получаем точность 1,9%, что, безусловно, является улучшением, но не очень хорошим.

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

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

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

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

Мы обучаем эту модель трансферного обучения аналогично нашей предыдущей модели для 20 эпох.

Это дает нам невероятное улучшение точности до 79,6%!

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

Вывод

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

Пара моментов для улучшения, над которыми я бы поработал, если бы у меня было больше времени:

  • Увеличьте время обучения, эта модель была обучена примерно за 2 минуты на графическом процессоре Udacity. Потратив больше времени на обучение, увеличив количество эпох, можно повысить его точность.
  • Увеличьте сложность модели, добавив больше слоев или более сложные слои, такие как Dropout. Это может позволить модели создать лучшие ассоциации.
  • Дополнение данных даст нам более разнообразный набор обучающих данных, который должен позволить модели лучше обобщать.