Введение

В данной статье демонстрируется подход к решению ключевого проекта Udacity Data Science Nanodegree — «Классификация пород собак». Основными методами, включенными в построение алгоритма, являются: обнаружение лиц, CNN (сверточная нейронная сеть) и трансферное обучение. Оценка модели проводилась с использованием метрики точность.

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

Построение модели следует следующим шагам, предложенным Udacity:

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

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

Во-первых, были загружены необходимые библиотеки и создана функция загрузки данных. Это исследование основано на данных, предоставленных udacity. Всего 8351 изображение собак 133 различных пород. Код для загрузки данных и результатов представлен ниже:

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. 

Example of dog breeds:  ['Affenpinscher', 'Afghan_hound', 'Airedale_terrier', 'Akita', 'Alaskan_malamute']

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

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

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

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

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

В этой части используется предварительно обученная модель ResNet-50 для обнаружения собак на изображениях. Веса модели обучаются на ImageNet. Код:

Изображения должны быть преобразованы в 4D-тензор, как того требует Keras CNN. Код для предварительной обработки:

Функция path_to_tensor принимает путь к изображению в качестве входных данных, реорганизует его и возвращает четырехмерный тензор формы (1, 224, 224, 3). Где 1 — количество изображений, 224 и 224 соответствуют размеру (224x224 пикселя), 3 — количество каналов (изображения цветные, поэтому каждое изображение имеет 3 канала).

Функция paths_to_tensor принимает в качестве входных данных пустой массив строковых путей к изображениям и возвращает четырехмерный тензор формы: (nb_samples,224,224,3), где nb_samples — количество изображений в предоставленном массиве изображений. пути.

Предварительно обученная модель ResNet-50 возвращает прогноз для объекта, содержащегося на изображении. Эта модель может вывести 1000 различных категорий, среди них категории 151–268 относятся к породам собак (словарь всех категорий). Код для предсказания:

ResNet50_predict_labels принимает в качестве входных данных путь к изображению и возвращает прогнозируемую категорию.
Основной функцией для обнаружения собак с использованием этой модели является dog_detector, которая принимает на вход путь изображения и возвращает True, если изображение содержит собаку и False если нет.

точность этой модели можно считать высокой:

dogs detected in the dogs' images:  100.0 %
dogs detected in the humans' images:  0.0 %

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

Следующий шаг включает в себя создание сверточной нейронной сети с нуля. Эта модель не включена в основной подход к классификации пород собак, однако ее можно считать полезной для лучшего понимания CNN. Цель состоит в том, чтобы создать модель, которая выдает точность теста минимум 1%, чтобы сэкономить время и вычислительную мощность. Модель, предложенная udacity:

Total params: 9,415
Trainable params: 9,415
Non-trainable params: 0

При инициализации 10 эпох описанная выше модель дала точность 6,5789 %.

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

Размер предоставленного набора данных (8351 изображение) нельзя считать достаточным для обучения собственной CNN. Итак, на этом этапе используется предварительно обученная модель VGG-16, предоставленная Udacity. Последний результат свертки VGG-16 подается в качестве входных данных для нашей модели. Алгоритм:

...
Epoch 20/20
6580/6680 [============================>.] - ETA: 0s - loss: 7.0369 - acc: 0.5570Epoch 00020: val_loss improved from 7.99800 to 7.95934, saving model to saved_models/weights.best.VGG16.hdf5
6680/6680 [==============================] - 2s 277us/step - loss: 7.0173 - acc: 0.5582 - val_loss: 7.9593 - val_acc: 0.4323

На тестовых данных предварительно обученная модель VGG-16 показала точность 46,0526%, что все еще мало. Поэтому необходимо создать более точный подход.

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

Udacity предоставляет 4 различных предварительно обученных модели: Resnet-50, VGG-19, Inception и Xception. В этом разделе используются узкие места (верхний слой классификатора предварительно обученной модели) модели ResNet50.
Архитектура:

Total params: 272,517
Trainable params: 272,517
Non-trainable params: 0
________________________

Коэффициент отсева был добавлен в построение модели, чтобы предотвратить переоснащение. В структуру модели также был добавлен глобальный средний пулирующий слой, сопровождаемый полносвязным слоем с функцией активации Softmax с количеством узлов, равным количеству пород собак (133).

Выполнение:

....
Epoch 20/20
6660/6680 [============================>.] - ETA: 0s - loss: 0.0577 - acc: 0.9832Epoch 00020: val_loss did not improve
6680/6680 [==============================] - 2s 236us/step - loss: 0.0576 - acc: 0.9832 - val_loss: 0.7950 - val_acc: 0.8192

Точность предварительно обученной модели ResNet50 на тестовых данных составляет —81,5789%. Нельзя утверждать, что такой точности достаточно для производственной системы, но, учитывая небольшое количество обучающих изображений, ее все же можно рассматривать как высокое значение и использовать для дальнейшего применения.

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

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

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

Построенный алгоритм:

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

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

Вывод

Эту статью можно рассматривать как один из многих подходов к решению ключевого проекта Udacity по науке о данных. Итоговая модель имеет точность тестирования 81,58%, что нельзя назвать достаточным результатом. Однако построенный алгоритм и знания о структуре CNN, полученные в процессе решения этого проекта, могут стать краеугольными камнями для дальнейших исследований и анализа.

Возможные улучшения:

  1. Лучшая модель для распознавания лиц, например VGG Face.
  2. Увеличение обучающих данных.
  3. Проведение поиска по сетке в различных архитектурах нейронных сетей.

Блокнот с подробными этапами построения модели можно найти в этом репозитории GitHub.