machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Классификация изображений с использованием Transfer Learning и Deep Learning Studio

Дата публикации Aug 3, 2018

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

В этой статье я хочу поделиться с вами своим опытом участия в моих первых соревнованиях по классификации изображений, а также в использовании платформы Deep Learning Studio (DLS). DLS предоставляет на высоком уровне абстракции графический интерфейс для создания и обучения глубоких нейронных сетей на основе бэкэндов, таких как keras / tenorflow / theano и других, бесплатно с настольным или облачным приложением.

Если вы никогда не слышали и не использовали DLS, проверьтеэта почтапоРаджуили попробуйте наDeepCognition.ai,

Соревнование

Задача была названаПроблема идентификации бутылки содовойи организовано непосредственно DeepCognition.ai в качестве первого конкурса с целью определения различных видов бутылок содовой на изображениях.
Аналогично другим соревнованиям, например, наKaggleвы получаете более или менее подготовленный набор данных с помеченными изображениями вместе с набором правил и информацией о том, как будут оцениваться результаты, а также процесс отправки ваших результатов.
В этом случае, поскольку требовалось использовать сервис Deep Learning Studio, набор данных и процесс отправки были адаптированы к тому, как работает DLS, что позволило довольно легко получить старт и отправить первую модель.

В следующем посте я попытаюсь описать шаги, которые я предпринял, опыт, который я приобрел, и ошибки, которые я совершил, имея итоговую точность в 93,75%, достигнув общего 10-го места в конкурсе.


Набор данных

Предоставленный набор данных состоит из 6615 изображений, более или менее равномерно разделенных на 8 классов различных бутылок содовой.

Предварительный просмотр набора данных Soda BottleDeepCognition.ai

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

Бутылки по-разному

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

Наивный первый подход

Мой самый первый подход состоял в том, чтобы просто обучить модель, сгенерированную с помощью функции DLS AutoML, которая сгенерирует всю модель для вас на основе ваших настроек ввода / вывода.

Модель AutoML для Soda Bottle Challenge

Как вы можете видеть, сгенерированная модель довольно огромна и, вероятно, является полным излишним решением проблемы классификации изображений с изображениями 6k и 8 классами, но я все же продолжил и попытался обучить ее. Довольно скоро я заметил, что изображение в исходном размере 640 * 480 пикселей мгновенно заполнило 16 ГБ ОЗУ моего ноутбука и остановило процесс обучения. Даже после уменьшения размера до 1/4 исходного изображения эта модель AutoML кажется слишком большой для моего ноутбука.

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

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

Передача обучения

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

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

Чтобы понять, как это может работать, давайте кратко рассмотрим, как работают модели классификации изображений.

Извлечение функций

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

Возможно, вы захотите прочитать более подробное объяснение о сверточных нейронных сетяхВот,

Давайте посмотрим, как осуществляется реализация предварительно обученной модели с использованием DLS, прежде чем мы обсудим различные варианты выбора, которые мы имеем.

VGG16 в качестве предварительно обученной модели

Выше вы видите очень простую реализацию предварительно обученной модели VGG16 с использованием графического редактора DLS. Есть несколько вещей, чтобы принять во внимание:

Входные размеры

Входное измерение наших изображений показано в первом узле модели (3224224), что означает, что мы изменили размеры наших изображений до 224 * 224 пикселей, то есть исходного размера изображения, на котором обучалась модель VGG16.

Это легко сделать на вкладке «Данные» DLS.

Изменение размера входных изображений

Предварительно обученные модели

Один узел в нашей модели, который называется VGG16, фактически представляет всю архитектуру модели VGG16, сжатую в одном узле. ОтПредварительно обученная модельНа вкладке DLS предлагает несколько моделей на выбор. У самого узла есть несколько вариантов загрузки предварительно обученных весов и того, какой сегмент модели должен быть обучаем.

Настройки VGG16

Как вы можете видеть с правой стороны, мы не включаем верхние слои модели VGG16, поскольку именно они были созданы нами для классификации 8 классов бутылок содовой вместо 1000 классовimagenetнабор данных, на котором была обучена оригинальная модель VGG16.

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

При такой настройке модель требовала гораздо меньше ресурсов по сравнению с моделью AutoML и даже была доступна для обучения на моем ноутбуке с процессором и 16 ГБ оперативной памяти. Тем не менее, я достиг скорости обработки всего ~ 1 образца / с, что дало бы время тренировки около 76 минут только для одной эпохи. Это казалось неприемлемым, поскольку я хотел протестировать несколько различных подходов, чтобы увидеть, какая модель работает лучше всего. Также общая продолжительность конкурса составила всего около 3 недель.

При переходе на облачную версию и использовании Telsa K80 за ~ 1 $ / ч время обучения составило ок. 74 секунды на эпоху для модели VGG16 и даже быстрее для некоторых других моделей, которые я пробовал.

VGG16 / VGG19 / ResNet50

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

VGG16

VGG16 тренировочный процесс

Модель VGG16 достигает точности ~ 14% для проверки достоверности, установленной после первых 2 эпох, и, кажется, не утверждается в течение последних 8 эпох. Точность 14% для задачи классификации с 8 классами лишь немного лучше, чем вероятность случайного предположения, которая будет около 12,5%. Этот результат не очень обнадеживает для перспективы трансферного обучения, но давайте посмотрим, как наберут другие модели.

VGG19

VGG19 тренировка

Модель VGG19, которая имеет аналогичную, но более глубокую архитектуру, чем его предшественник VGG16, уже работает немного лучше, почти достигая точности 30%. Тем не менее, тренировочная кривая не дает надежды на повышение точности за счет дальнейшего обучения.

ResNet50

ResNet50 учебный процесс

Какая разница! Это результат, на который я надеялся. Как вы можете видеть, модель почти достигла 80% точности после 3 эпох и постепенно продолжала улучшаться в течение всего тренировочного процесса. В дополнение к достижению наилучшей производительности из трех протестированных моделей, он также имел самую высокую скорость обучения.

оценка

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

Настройка набора данных DLS

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

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

Вывод из набора данных DLS

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

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

Процесс отправки

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

Процесс подачи заявок в этом конкурсе был довольно прост. DLS предлагает функцию для загрузки обученной модели в виде zip-файла, содержащего файл модели .h5 вместе с файлом конфигурации и сценарием test.py, который можно использовать для запуска вашей модели на тестовом образе. Этот zip-файл просто загружается на сайт конкурса.

Отправка моей первой модели привела к итоговой оценке ~ 40%.

Довольно обидно, когда мы ожидали, что результат составит ~ 80%. Так откуда это расхождение?

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

Увеличение данных

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

Если вам интересно узнать больше об увеличении данных, ознакомьтесь сРайан Оллред«sпосле,

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

Увеличение данных в DLS

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

Тренировка нашей модели ResNet50 с изображениями, дополненными данными, как показано выше, привела к довольно похожей кривой тренировки с пиком около 90% после 10 эпох.

ResNet50 учебный процесс с дополнением данных

Отправка этой модели на конкурс дала мне оценку 57%, что показывает, что увеличение данных помогло повысить надежность модели в целом, как мы и ожидали.

57% выглядят не очень хорошо, по сравнению с 91%, которых мы достигли во время тренировок, но не забывайте, что мы тренировали нашу модель всего 10 эпох. Я думаю, что есть место для улучшения.

гиперпараметры

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

Узнайте больше о гиперпараметрах вЭта статьяпоДаниэль Шапиро, доктор философии,

Это также гиперпараметры, которые DLS предлагает вам подгиперпараметрыВкладка.

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

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

Если вы хотите углубиться в другой оптимизатор, я предлагаю вам прочитатьЭта статьяпоРинат Максутов,

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

Чтобы увеличить свой счет, я попробовал много разных подходов. В конце концов идея, высказанная Павлом Остяковым и Алексеем Харламовым в их выступленииВот, привел меня к моему окончательному результату с точностью ~ 93%.

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

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

DLS загружает веса предыдущих запусков

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

Скорость обучения

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

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

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

Благодаря этому новому подходу я, наконец, достиг своего итогового результата в 93,75%, учтите, это был последний день периода подачи заявок

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

Вывод

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

Первые два места в конкурсе на самом деле набрали 100%, поэтому для меня определенно есть место для улучшения.


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

Я всегда рад знакомству с новыми людьми и обмену идеями, поэтому, если вам понравилась статья, рассмотрите возможность добавления меня вLinkedIn,

Оригинальная статья

Footer decor

© machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map