Введение проблемы

В этой статье мы рассмотрим шаги, предпринятые для создания классификатора пород собак на основе сверточных нейронных сетей (CNN).

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

Стратегия решения проблемы

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

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

Показатели производительности и цели

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

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

Изучение данных

Наборы данных, используемые в этой работе, были предоставлены в рамках курсовой работы Udacity Datascientist Nano Degree. Набор данных о собаках состоит из 8351 изображений, а метки определяют 133 общее количество пород собак, разделенных на категории.

Для той части работы, которая идентифицирует изображения людей, чтобы отличить их от изображений собак, мы используем набор данных из 13233 изображений людей.

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

Взглянув на распределение помеченных тренировочных изображений для классификатора собак, мы заметили некоторый дисбаланс в наборе данных с меткой с наибольшим количеством изображений (77) с в 3 раза больше обучающих выборок, чем одно наименьшее количество изображений (26).

Распознавание лиц

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

Следующая функция использует файл 'haarcascade_fontalface_alt.xml' для обнаружения человеческих лиц и рисования прямоугольника вокруг него.

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

Human match: 1.0
Dog match: 0.085

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

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

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

Следующее позволяет нам создать модель ResNet-50 на основе весов ImageNet и использовать модель, чтобы предсказать, классифицируется ли изображение в диапазоне категорий пород собак (с индексом от 151 до 268).

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

Human match: 0.01
Dog match: 0.99

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

Модель CNN с нуля

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

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

Поэкспериментировав с различными архитектурами, мы решили использовать следующую модель, созданную с нуля:

  • 5 2D-слоев свертки с размером фильтра 16, 32, 64, 128 и 128, с максимальным объединением слоев между ними.
  • Последний слой Global Average Pooling перед отправкой вывода на плотный слой с функцией активации softmax, состоящей из 133 узлов, по одному на каждую из наших 133 меток.
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 223, 223, 16)      208       
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 111, 111, 16)      0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 110, 110, 32)      2080      
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 55, 55, 32)        0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 54, 54, 64)        8256      
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 27, 27, 64)        0         
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 26, 26, 128)       32896     
_________________________________________________________________
max_pooling2d_5 (MaxPooling2 (None, 13, 13, 128)       0         
_________________________________________________________________
conv2d_5 (Conv2D)            (None, 12, 12, 128)       65664     
_________________________________________________________________
max_pooling2d_6 (MaxPooling2 (None, 6, 6, 128)         0         
_________________________________________________________________
global_average_pooling2d_1 ( (None, 128)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 133)               17157     
=================================================================
Total params: 126,261
Trainable params: 126,261
Non-trainable params: 0

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

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

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

Улучшенная модель CNN с трансферным обучением

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

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

Мы решили снова использовать ResNet-50, на этот раз используя предварительно обученную модель, чтобы использовать ее в качестве экстрактора функций. Для этого мы импортируем предварительно обученную модель и удаляем верхний слой (виден в строке 16 кода ниже), который относится к исходной специализированной задаче, используемой при обучении исходной модели. Мы делаем это, чтобы заменить его собственным набором слоев для текущей задачи, связанной с классификацией наших 133 пород собак.

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

Код для импорта узких мест из ResNet-50 и завершения нашей модели с окончательным глобальным средним пулом и плотными слоями можно найти ниже:

Как и ожидалось, эта модель имела лучшую производительность с начальной конечной точностью проверки 68%. Хотя это уже соответствует нашей первоначальной цели работы, мы считаем, что это можно улучшить с помощью дополнительной настройки.

Слой настройки гиперпараметров и исключения

Слой Dropout был добавлен, так как первоначальный анализ производительности указал на повышенную подгонку к обучающим данным. После оценки со значениями от 0,1 до 0,5 был сохранен слой Dropout со скоростью 0,3, что позволило улучшить обобщение модели за счет случайного отключения некоторых нейронов и предотвращения чрезмерного влияния начальных пакетов обучающих данных. функции выбираются как более актуальные для сети.

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

Полученные результаты

Эта окончательная модель имела следующие результаты в виде производительности в разные эпохи обучения:

С помощью этой окончательной модели мы смогли повысить точность тестов до 82%.

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

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

Заключение

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

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

Дальнейшие улучшения

Хотя целью этого проекта было осветить некоторые концепции методов, использующих CNN, есть возможности еще больше улучшить нашу модель, чтобы повысить уровень точности, например:

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

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

Рекомендации