Определение группы пород кошки по WCF.

Нейросеть по фотографии
определяет группу породы кошек по
классификации WCF (Всемирная
федерация кошек/World Cat Federation.

Description

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

Набор данных
Для нашей цели мы собираемся использовать Оксфордский набор данных классификации пород кошек и собак , доступный на Kaggle (и доступный для загрузки в коммерческих/исследовательских целях по международной лицензии Creative Commons Attribution-ShareAlike 4.0). Этот набор данных содержит в общей сложности 7384 изображения домашних животных, которых можно разделить на 37 пород (или, в данном контексте, классов ).

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

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

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

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

Теперь, когда у нас есть вся информация в упомянутых словарях, мы можем приступить к построению гистограммы.

Гистограмма с распределением изображений по породам

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

Как правило, при решении подобных проблем рекомендуется начинать с изучения предыдущих подобных работ. При исследовании этой проблемы мы обнаружили, что некоторые работы особенно интересны и полезны: «Идентификация породы собак с использованием глубокого обучения» (З. Радули, К. Сулёк, З. Вадаси и А. Зольде) , «Знание породы вашей собаки: Определение породы собак с помощью глубокого обучения» (П. Борварнгинн, В. Кусакунниран, С. Карнянапричакорн и
К. Тонгканчорн) и «Классификация собак на 120 пород» (Х. Чжан, Х. Сонг, Л. Чжу и С. Дэн) .

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

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

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

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

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

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

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

В конец нашей базовой модели мы добавим 5 слоев:

Слой пула : это слой, который будет напрямую взаимодействовать с выходными данными слоев InceptionV3. Слои пула используются для понижения дискретизации входных данных путем применения фильтра, который формирует группы пикселей и применяет к ним операцию. В нашем случае использовался средний пул , который вычисляет среднее значение этих групп пикселей.
Плотный слой : один связанный слой с указанным количеством нейронов — в нашем случае 256. Выбранной функцией активации была ReLU , которая просто отображает любой отрицательный ввод в 0 и любой положительный ввод в себя. Он широко используется, потому что это линейная функция для положительного входа и нет риска насыщения.
Слой выпадения : цель которого состоит в том, чтобы случайным образом игнорировать определенный процент выходных данных из предыдущего слоя в зависимости от параметра регуляризации. Цель этого уровня — предотвратить чрезмерную подгонку данных.
Слой пакетной нормализации : предназначен для масштабирования вывода по порядку, чтобы он имел среднее значение 0 и стандартное отклонение 1.
Плотный слой : это выходной слой, полностью связанный, с 37 нейронами, каждый из которых соответствует одному из наших классов классификации. Здесь используется функция активации SoftMax . Это лучшая функция активации для проблемы множественной классификации по сравнению с логистической функцией, такой как сигмоид . Это связано с тем, что SoftMax выводит вектор вероятности с каждым классом, соответствующим значению, что позволяет нам легко понять, какие классы имеют более высокие значения и больше вероятности быть правильными.

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

Оптимизатор, выбранный как Adam , и реализация стохастического градиентного спуска со скоростью обучения по умолчанию, равной 0,001, которую мы изменим позже. Точность — это метрика, которую мы собираемся использовать для оценки производительности модели во время обучения.

Используя библиотеку Keras , легко собрать модель с использованием этой архитектуры.

Подготовка изображений
Чтобы изображения были готовы к использованию в моделях, мы должны провести их через фазу предварительной обработки. Это включает в себя преобразование их в тензоры (299, 299, 3), поскольку это рекомендуемая форма для входных данных модели InceptionV3.

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

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

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

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

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

K-кратная перекрестная проверка
K-Fold Cross-Validation — это хорошо известный метод оптимизации гиперпараметров. Это метод, при котором обучающие данные делятся на K частей (или складок ). Затем модель будет обучена на частях K-1 и проверена на оставшейся части. Это делается K раз, так как у каждого фолда будет возможность сыграть роль проверки. Затем по результатам проводится усреднение. Это пытается решить проблему, заключающуюся в том, что используемые данные проверки могут дать плохое представление о производительности модели. Поскольку все данные используются для проверки косвенно, такой ситуации не произойдет.

Несмотря на то, что наиболее распространенное количество сгибов — 5 или 10, мы решили использовать только 3 из-за того, что этот процесс занимает много времени. Мы использовали размер партии 32 и 15 эпох из-за нехватки времени. Я призываю вас попробовать с другими значениями!

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

У него очень важная цель — преобразовать десятичное представление идентификатора породы, которое мы используем в y_trainмассиве, в другое представление — используя только единицы и нули. Каждое значение будет преобразовано в массив из 37 элементов — количество классов в нашем наборе данных — заполненных 0, за исключением позиции, равной преобразованному значению. Например, число 0 будет преобразовано в , [1,0,0,0,0,0,…]а число 3 в [0,0,0,1,0,0,…].

Помните, как наш плотный слой имеет 37 нейронов, каждый из которых выводит значение вероятности? Мы можем думать о каждом из них как об элементе массива. Если мы установим максимальное значение в 1, а все остальные в 0, мы получим число один — hot encoded . Это число является прогнозом модели для этого ввода!

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

Эволюция метрик с разной скоростью обучения

Ясно видно, как более низкая скорость обучения приносит пользу модели. Точность как обучения, так и проверки показывает аналогичные кривые и значения, и даже потери при поездке аналогичны, хотя они несколько ниже при более низкой скорости обучения. Самая большая разница заключается в потере проверки. При большей скорости обучения эта кривая не сходилась к значению, вероятно, потому, что она «прыгала» через локальный минимум из-за большего шага. На этом опыте мы пришли к выводу, что 0,001 — лучшее обучение из всех сравниваемых.

Значение исключения

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

Код в следующем описании выполняет этот процесс для различных значений скорости обучения и сохраняет упомянутые показатели в словаре с именем lr.

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

Эволюция метрик, варьирующих значение отсеваВ этом случае различия кажутся еще менее заметными. Точность обучения с отсевом 0,25 лучше только на 0,007 в последнюю эпоху, а также имеет меньшие потери при обучении примерно на 0,037. При обращении к данным проверки точность ниже на 0,003, чем при отсеве 0,35, и имеет большую потерю проверки на 0,025. Здесь нет явного «победителя», но мы предположим, что 0,35 является лучшим значением из-за немного лучших результатов в данных проверки.

Оценка модели
Как мы разделили, составляет 30% от общего набора данных, что соответствует 2216 изображениям. Наконец-то мы можем использовать его для проверки точности нашей модели, теперь, когда мы обнаружили лучшие гиперпараметры.

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

Матрица путаницы

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

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

Имея модель, уже обученную на наших данных, теперь мы можем разморозить некоторые слои базовой модели. В данном случае мы решили разморозить последнюю треть слоев базовой модели. Затем модель обучается еще 10 эпох, используя очень низкую скорость обучения 0,0001.

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

Матрица путаницы
Понятно, что на этот раз у модели было меньше проблем с отличением бенгальских кошек от египетских мау. И нам даже удалось улучшить точность, полноту, f1-счет и точность до 92%.
Если у Вас появилась заинтересованность в данной нейронной сети, и она может помочь Вам в реализации Ваших бизнес и других технических задачах, пожалуйста отправьте заявку на email info@ai2b.ru , или позвоните по телефону 8(495)661-61-09

 

Reviews

There are no reviews yet.

Be the first to review “Определение группы пород кошки по WCF.”

Ваш адрес email не будет опубликован. Обязательные поля помечены *