Привет, Хабр! Наконец-то дождались очередную часть серии материалов от выпускницы наших программ.
«Специалист по большим данным» И «Глубокое обучение» , Кирилл Данилюк, об использовании популярных сейчас нейросетей Mask R-CNN в составе системы классификации изображений, а именно оценки качества приготовленного блюда на основе набора данных с датчиков.
Рассмотрев в предыдущая статья игрушечный датасет, состоящий из изображений дорожных знаков, теперь можно перейти к решению проблемы, с которой я столкнулся в реальной жизни: «Можно ли реализовать алгоритм глубокого обучения, который мог бы отличать качественные блюда от плохих на основе одной фотографииЭ» .
Короче говоря, это то, чего хотел бизнес:
Что представляют себе компании, когда думают о машинном обучении:
Это пример неправильно поставленной задачи: в этом случае невозможно определить, существует ли решение, единственно ли и устойчиво ли оно.
Кроме того, весьма расплывчата сама постановка задачи, не говоря уже о реализации ее решения.
Конечно, эта статья не об эффективных коммуникациях или управлении проектами, но важно отметить: Никогда не беритесь за проекты, в которых конечный результат не определен и не зафиксирован в техническом задании.
Один из наиболее надежных способов справиться с такой неопределенностью — сначала создать прототип, а затем использовать новые знания для структурирования остальной части задачи.
Именно это мы и сделали.
Постановка задачи
В своем прототипе я сосредоточился на одном пункте меню — омлете — и построил масштабируемый конвейер, который выводит «качество» омлета.Более подробно это можно описать следующим образом:
- Тип задачи: многоклассовая классификация с 6 дискретными классами качества: хороший (хороший), сломанный_желток (с разведенным желтком) пережаренный (перебор), два яйца (из двух яиц) четыре_яйца (из четырех яиц), неуместные_части (кусочки разбросаны по тарелке).
- Набор данных: 351 тщательно подобранная фотография различных омлетов.
Наборы для обучения/проверки/тестирования: 139/32/180 смешанных фотографий.
- Теги класса: На каждой фотографии имеется метка класса, соответствующая субъективной оценке качества омлета.
- Метрики: категориальная кросс-энтропия.
- Минимальные знания предметной области: «Качественный» омлет должен выглядеть так: он состоит из трёх яиц, небольшого количества бекона, листа петрушки в центре, не имеет жидких желтков и пережаренных кусочков.
Также общая композиция должна «выглядеть хорошо», то есть кусочки не должны быть разбросаны по всей тарелке.
- Критерии завершения: лучшее значение кросс-энтропии на тестовом образце среди всех возможных после двух недель разработки прототипа.
- Окончательный метод визуализации: t-SNE в пространстве данных меньшей размерности.
Ввод изображений Основная цель конвейера — научиться объединять несколько типов сигналов (например, изображения под разными углами, тепловую карту и т. д.), получать предварительно сжатое представление каждого из них и затем передавать эти признаки через классификатор нейронной сети для окончательного прогноза.
Таким образом, мы сможем воплотить наш прототип в жизнь и сделать его практически применимым в дальнейшей работе.
Ниже приведены несколько сигналов, использованных в прототипе:
- Маски ключевых ингредиентов (Mask R-CNN): Сигнал №1 .
- Количество ключевых ингредиентов в кадре.
, Сигнал №2 .
- RGB-обрезки тарелок омлета без фона.
Для простоты я решил пока не добавлять их в модель, хотя они являются наиболее очевидным сигналом: в будущем вы сможете обучить сверточную нейронную сеть классификации, используя какую-нибудь адекватную функцию потерь вроде тройная потеря , подсчитывать встраивания изображений и выполнять обрезку Расстояние L2 от текущего изображения к идеальному.
К сожалению, у меня не было возможности проверить эту гипотезу, так как тестовая выборка состояла всего из 139 объектов.
Общий вид трубопровода
Обратите внимание, что мне придется пропустить несколько важных шагов, таких как исследовательский анализ данных, построение базового классификатора и активная маркировка (термин, который я придумал для полуавтоматического аннотирования объектов, вдохновленный Демонстрационное видео Polygon-RNN ) конвейер для Mask R-CNN (подробнее об этом в будущих постах).
Давайте посмотрим на весь пайплайн в целом:
В этой статье нас интересуют этапы Mask R-CNN и классификация внутри конвейера.
Далее мы рассмотрим три этапа: 1) использование Mask R-CNN для построения масок из ингредиентов омлета; 2) Классификатор ConvNet на основе Keras; 3) визуализация результатов с помощью t-SNE.
Шаг 1: Маска R-CNN и построение масок
Маска R-CNN (MRCNN) в последнее время находится на пике популярности.Начиная с оригинала статьи в Фейсбуке и окончание Кубок по науке о данных 2018 На Kaggle Mask R-CNN зарекомендовала себя как мощная архитектура для сегментации экземпляров (т. е.
не только попиксельная сегментация изображений, но и разделение нескольких объектов, принадлежащих одному и тому же классу).
Кроме того, с нами приятно работать внедрение MRCNN от Matterport в Керасе.
Код хорошо структурирован, хорошо документирован и работает прямо из коробки, хотя и медленнее, чем ожидалось.
На практике, особенно при разработке прототипа, крайне важно иметь предварительно обученную сверточную нейронную сеть.
В большинстве случаев набор размеченных данных у специалиста по обработке данных очень ограничен или вообще отсутствует, в то время как ConvNet требует большого количества размеченных данных для достижения сходимости (например, набор данных ImageNet содержит 1,2 миллиона размеченных изображений).
Вот тут-то и придет на помощь трансферное обучение : мы можем зафиксировать веса сверточных слоев и только обучать классификатор.
Исправление сверточных слоев важно для небольших наборов данных, поскольку этот метод предотвращает переобучение.
Вот что я получил после первой эпохи предварительной подготовки:
Результат сегментации объекта: идентифицированы все ключевые ингредиенты
На следующем этапе конвейера ( Обработка выведенных данных для классификатора ) вам нужно вырезать часть изображения, содержащую тарелку, и извлечь двухмерную бинарную маску для каждого ингредиента на этой тарелке:
Обрезка изображений с ключевыми ингредиентами в виде бинарных масок
Эти бинарные маски затем объединяются в 8-канальное изображение (поскольку для MRCNN я определил 8 классов масок) и получаем Сигнал №1 :
Сигнал №1 : 8-канальное изображение, состоящее из бинарных масок.
В цвете для лучшей визуализации Чтобы получить Сигнал №2 , я посчитал, сколько раз каждый ингредиент появляется на кадре тарелки, и получил набор векторов признаков, каждый из которых соответствует своему кадру.
ЭШаг 2: классификатор ConvNet в Keras
Классификатор CNN был реализован с нуля с использованием Keras. Я хотел объединить несколько сигналов( Сигнал №1 И Сигнал №2 , а также возможное добавление данных в будущем) и позволяют нейросети делать прогнозы о качестве блюда.
Представленная ниже архитектура является ориентировочной и далекой от идеала:
Несколько слов об архитектуре классификатора:
- Многомасштабный модуль свертки : Изначально я выбрал фильтр 5x5 для сверточных слоев, но это привело только к удовлетворительным результатам.
Улучшения были достигнуты за счет использования Среднее объединение2D на несколько слоев с разными фильтрами: 3х3, 5х5, 7х7, 11х11. Перед каждым из слоев также был добавлен дополнительный сверточный слой 1x1 для уменьшения размерности.
Этот компонент немного похож Начальный модуль , хотя я не планировал строить очень глубокую сеть.
- Фильтры большего размера : Я использовал фильтры большего размера, потому что они упрощают извлечение крупномасштабных объектов из входного изображения (которое, по сути, представляет собой слой активации с 8 фильтрами — каждую маску ингредиента можно рассматривать как отдельный фильтр).
- Комбинация сигналов : моя наивная реализация использовала только один слой, который соединял два набора функций: обработанные бинарные маски ( Сигнал №1 ) и подсчитанные ингредиенты ( Сигнал №2 ).
Однако, несмотря на простоту, добавление Сигнал №2 позволило уменьшить метрику перекрестной энтропии с 0.8 до [0.7, 0.72] .
- Логиты : В терминах TensorFlow logit — это слой, на котором tf.nn.softmax_cross_entropy_with_logits вычислять потеря партии .
ЭШаг 3: визуализация результатов с помощью t-SNE
Для визуализации результатов работы классификатора на тестовых данных я использовал t-SNE — алгоритм, позволяющий перенести исходные данные в низкомерное пространство (чтобы понять принцип работы алгоритма, рекомендую прочитать исходная статья , очень информативно и хорошо написано).Перед визуализацией я взял тестовые изображения, извлек логит-слой классификатора и применил алгоритм t-SNE к этому набору данных.
Хоть я и не пробовал разные значения параметра perplexity, результат всё равно выглядит довольно неплохо:
Результат t-SNE на тестовых данных с предсказаниями классификатора
Конечно, этот подход не идеален, но он работает. В этом случае возможных улучшений может быть довольно много:
- Больше данных.
Сверточные сети требуют большого количества данных, а мне нужно было обучить всего 139 изображений.
Такие методы, как увеличение данных, работают отлично (я использовал D4 или двугранно-симметричное увеличение , в результате чего получается более 2 тысяч изображений), но иметь больше реальных данных по-прежнему крайне важно.
- Более подходящая функция потерь.
Для простоты я использовал категориальную кросс-энтропию, и это удобно, поскольку работает прямо «из коробки».
Лучшим вариантом будет использование функции потерь, учитывающей вариацию внутри классов, например, тройной функции потерь (см.
- Улучшение архитектуры классификатора.
Текущий классификатор по сути является прототипом, единственная цель которого — создание бинарных масок и объединение нескольких наборов функций в единый конвейер.
- Улучшен макет изображения.
Я был довольно неосторожен, размечая изображения вручную: классификатор справился лучше меня с дюжиной тестовых изображений.
Наконец, надо признать, что у бизнеса нет ни данных, ни объяснений, а тем более четко поставленной задачи, которую необходимо решить.
И это хорошо (иначе зачем вы им нужны?), ведь ваша работа как раз и состоит в том, чтобы использовать различные инструменты, многоядерные процессоры, предварительно обученные модели и смесь технического и бизнес-знания для создания дополнительной ценности в компании.
.
Начните с малого: рабочий прототип можно создать из нескольких игрушечных блоков кода, и это значительно повысит продуктивность последующих разговоров с руководством компании.
Это работа специалиста по данным — предлагать бизнесу новые подходы и идеи.
Начало 20 сентября 2018 г.
«Специалист по большим данным 9.0» , где помимо прочего вы научитесь визуализировать данные и понимать бизнес-логику той или иной задачи, что поможет вам более эффективно презентовать результаты своей работы коллегам и руководству.
Теги: #глубокое обучение #сверточные нейронные сети #Keras #Обработка изображений #python #Обработка изображений #Большие данные #Машинное обучение
-
Ит-2021: Где Деньги?
19 Oct, 24 -
Несчастье Коммивояжера И Желтый Октябрь
19 Oct, 24 -
Запах Дизайна: Конструктор По Умолчанию
19 Oct, 24