Прогнозирование породы собак с помощью CNN

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

Для ввода в модель нам предоставили более 8000 изображений собак, каждое из которых сопровождалось соответствующей породой — всего 133 породы по всему набору данных.

Общие сведения о CNN

Чтобы выполнить эту задачу, было важно понять теорию, лежащую в основе CNN, и то, как они работают, с особым приложением к тому, как они работают для классификации изображений. Первое соображение заключается в том, как изображения могут быть представлены для ввода в CNN. Как правило, изображения в оттенках серого отображаются в виде матрицы — каждая запись матрицы соответствует пикселю, а число (0–255) указывает, насколько белым является пиксель, где 255 — белый, а 0 — черный. Перед вводом в модель они обычно нормализуются в диапазоне от 0 до 1 путем деления на 255. Вместо этого для цветных изображений у нас есть трехмерная матрица с глубиной три для разделения красных, зеленых и синих пикселей. К счастью, CNN, в отличие от некоторых других моделей, таких как MLPS, которые принимают только векторы, принимают матрицы в качестве входных данных, поэтому они идеально подходят для таких задач, как классификация изображений. В частности, это позволяет им понять, что пиксели рядом друг с другом будут более тесно связаны, чем те, которые находятся дальше друг от друга на изображении.

Ключом к CNN является сверточный слой. Это включает в себя определение сверточного окна путем выбора подходящей ширины и высоты с точки зрения количества пикселей и скольжения окна по всей матрице исходного изображения. В каждой позиции окно определяет небольшой подмножество пикселей изображения, к которому подключен один скрытый узел — это сверточный слой. Чтобы получить значение для этого слоя, веса слоя умножаются на входные узлы, а затем суммируются. К этому суммированию обычно применяется функция ReLU, которая преобразует любые отрицательные числа в 0 и оставляет положительные числа как есть. Это дает значение для узла в сверточном слое, а сетка весов называется фильтром. При использовании CNN фильтры часто визуализируются, что показывает, для обнаружения какого шаблона предназначен фильтр. Карта признаков — это результат обработки изображения через фильтр — значения освещенности на карте признаков означают, что шаблон был обнаружен на изображении. Фильтры изначально генерируются случайным образом, и сеть узнает, какие фильтры она должна создавать.

Следующим ключевым элементом CNN являются слои объединения. Они используют сверточные слои (т. е. стопки карт объектов) в качестве входных данных, и их цель — уменьшить размерность этих слоев. Существует два основных типа: слой максимального пула и слой глобального среднего пула. Первый имеет размер окна (как и в сверточном слое), но на этот раз — поскольку окно скользит по всей матрице — мы берем максимум пикселей, содержащихся в окне. Глобальный средний пул, с другой стороны, является более экстремальным. Он берет стек карт объектов и вычисляет среднее значение узлов для каждой карты в стеке, поэтому каждая карта объектов сводится к одному значению. Как правило, для классификации изображений максимальное количество слоев пула следует за каждым 1 или 2 сверточными слоями с целью уменьшения пространственной информации и вместо этого увеличения информации о содержании изображения.

Наконец, массив выравнивается до вектора и передается в один или несколько полносвязных слоев, чтобы определить, какой объект содержится в изображении. Последний уровень обычно имеет функцию активации «softmax» для возврата вероятностей различных объектов (в нашем случае пород) в качестве выходных данных.

Построение модели

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

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

После тестирования детектора на образце набора данных следующим шагом было создание CNN с нуля, чтобы оценить его производительность. Целью была точность 1 %, что звучит низко, но стоит отметить, что случайное угадывание на этом этапе даст точность всего 0,75 %, так что это улучшение,
хотя и далеко от идеальная модель. Основная причина того, что это так мало, заключается просто в том, что вычислительная мощность, необходимая для создания точной модели с нуля, будет значительной — и мы получим более точную модель позже, как будет более подробно описано ниже.

Архитектура, выбранная для этой модели, основывалась на том, чтобы начать с 4 слоев свертки с типичной системой, начиная с 16 фильтров и удваивая их количество на каждой последующей итерации. Между ними мы добавили максимальное количество объединяемых слоев — размером 8, 4, 2 и 2. Причина этого заключалась в том, чтобы просто более резко сократить размеры высоты и ширины ранее, чтобы получить как можно больше информации из модели, прежде чем делать это. последний плотный слой. Наконец, мы завершили глобальный средний объединяющий слой, прежде чем закончить плотным слоем со 133 выходными данными, по одному для каждой породы собак. Первоначальный закрывающий слой, который мы пробовали, был максимальным объединяющим слоем, а затем плоским слоем перед плотным слоем, но, проверив вывод, мы обнаружили, что эта архитектура имеет более 3 миллионов параметров. Мы решили решить эту проблему в источнике большинства параметров и, следовательно, выбрали более экстремальный глобальный средний уровень объединения, который сократил параметры примерно до 60 000. Мы также добавили отсев после второго максимального слоя объединения, чтобы предотвратить слишком большую переобучение в наборе обучающих данных, чтобы повысить точность тестового набора. Результатом стала модель, которая обучается примерно за 20 минут на ЦП (в течение 5 эпох) с точностью теста 5,98%.

Затем, чтобы повысить точность, мы пытаемся использовать предварительно обученную нейронную сеть, но удалить последние слои, характерные для набора данных, на котором она была обучена, а затем добавить один или два последних слоя, чтобы сделать их специфичными для нашей сети. набор данных. Это называется трансферным обучением. В этом случае мы использовали
узкие места Xception, и, поскольку наш набор данных очень похож на изображения в ImageNet, мы смогли использовать многие функции этой CNN. Отсюда было просто добавить глобальное среднее объединение и плотный слой, и в результате появилась модель с точностью теста 85% при прогнозировании породы собак. Запустив несколько тестов, мы увидели, что производительность была довольно хорошей — вывод, было ли обнаружено лицо человека или собаки (или ни одно из них) вместе с ближайшей породой. Например, если добавить поп-икону Тейлор Свифт, мы обнаружим, что ее порода похожа на афганскую борзую.

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

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

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