Вступление

Глубокое обучение - одна из самых интересных областей 21 века. мы повсюду видим приложения глубокого обучения, такие как распознавание лиц, беспилотные автомобили, обнаружение рака, анализ последовательности ДНК и многое другое. В этом сообщении блога мы рассмотрим одно из самых увлекательных приложений глубокого обучения - Классификация изображений для классификации пород собак.

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

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

Дорога впереди

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

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

Наборы данных содержат 8351 изображение собак. Я разделил их на данные для обучения, проверки и тестирования. Мы собираемся классифицировать собак по 133 различным породам, обучив модель с использованием 6680 изображений, проверив и настроив параметры с помощью 835 изображений, а затем протестировав точность модели на 836 тестовых изображениях, которые модель не видела раньше.

Детектор людей

Я использовал каскадный объектный классификатор Хаара для обнаружения человеческих лиц, присутствующих в OpenCV. Изначально алгоритму требуется много положительных изображений (изображений лиц) и негативных изображений (изображений без лиц) для обучения классификатора. Затем нам нужно извлечь из него функции. Функции Haar похожи на наше сверточное ядро. Каждая функция представляет собой отдельное значение, полученное путем вычитания суммы пикселей под белым прямоугольником из суммы пикселей под черным прямоугольником.

В приведенном выше коде faces - это массив обнаруженных лиц NumPy, где каждая строка соответствует обнаруженному лицу. Каждое обнаруженное лицо представляет собой одномерный массив с четырьмя записями, который определяет ограничивающую рамку обнаруженного лица. Первые две записи в массиве (извлеченные в приведенном выше коде как x и y) определяют горизонтальное и вертикальное положение верхнего левого угла ограничивающей рамки. Последние две записи в массиве (извлеченные здесь как w и h) определяют ширину и высоту поля.

Детектор собак

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

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

CNN с нуля

Теперь давайте создадим нашу собственную модель CNN без какого-либо трансферного обучения в Керасе.

Изображения сначала передаются в последовательность слоев сверточного, выпадающего и максимального объединения. Затем я использовал слой GlobalAveragePooling. Он выводит двумерный тензор с формой (batch_size, channels). Наконец, я отправил его на слой Dense с помощью функции активации softmax.

После создания модели я скомпилировал, обучил и сохранил лучшую модель с помощью ModelCheckpoint.

Классификация с использованием трансферного обучения

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

Получите возможности для узких мест

Модель Архитектура

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

Layer (type)                 Output Shape              Param #   
=================================================================
global_average_pooling2d_1 ( (None, 512)               0         
_________________________________________________________________
dense_4 (Dense)              (None, 133)               68229     
=================================================================
Total params: 68,229
Trainable params: 68,229
Non-trainable params: 0
_________________________________________________________________

Скомпилируйте модель

Обучите модель

Протестируйте модель

Результаты, полученные при внедрении трансферного обучения с использованием нескольких предварительно обученных моделей Keras: Resnet50, Vgg19 и Inception.

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

Результаты, полученные на реальных изображениях

Ссылка на Github всего проекта.



Следуй за мной на

LinkedIn



Твиттер