- PVSM.RU - https://www.pvsm.ru -
Привет! Мы, наконец, дождались еще одной части серии материалов от выпускника наших программ “Специалист по большим данным” [1] и “Deep Learning” [2], Кирилла Данилюка, об использовании популярных на сегодняшний день нейронных сетей Mask R-CNN как части системы для классификации изображений, а именно оценки качества приготовленного блюда по набору данных с сенсоров.
Рассмотрев в предыдущей статье [3] игрушечный набор данных, состоящий из изображений дорожных знаков, теперь мы можем перейти к решению задачи, с которой я столкнулся в реальной жизни: «Возможно ли реализовать Deep Learning алгоритм, который мог бы отличить блюда высокого качества от плохих блюд по одной фотографии?». Вкратце, бизнес хотел вот это:

Что представляет бизнес, когда думает о машинном обучении:
Это пример некорректно поставленной задачи: в данном случае невозможно определить, существует ли решение, уникально и устойчиво ли оно. К тому же сама постановка задачи очень расплывчата, не говоря уже о реализации ее решения. Конечно, данная статья не посвящена эффективности коммуникаций или управлению проектами, однако важно отметить: никогда не беритесь за проекты, в которых конечный результат не определен и зафиксирован в ТЗ. Один из наиболее надежных способов справиться с такой неопределенностью — это сначала построить прототип, а затем, использовав новые знания, структурировать всю остальную задачу. Именно так мы и поступили.
В своем прототипе я сосредоточился на одном блюде из меню — омлете — и построил масштабируемый пайплайн, который на выходе определяет «качество» омлета. Подробнее это можно описать следующим образом:

Входные изображения
Главная цель пайплайна — научиться комбинировать несколько типов сигналов (например, изображения с разных ракурсов, теплокарту и т.д.), получив предварительно сжатое представление каждого из них и пропустив в дальнейшем эти фичи через нейросеть-классификатор для итогового предсказания. Так, мы сможем воплотить в жизнь наш прототип и сделать его практически применимым в дальнейшей работе. Ниже представлены несколько использованных в прототипе сигналов:
Отмечу, что мне придется пропустить несколько важных этапов, таких как разведочный анализ данных, построение базового классификатора и active labeling (мною предложенный термин, который обозначает полуавтоматическое аннотирование объектов, вдохновленный Polygon-RNN демо-видео [4]) пайплайн для Mask R-CNN (подробнее об этом в следующих постах).
Взглянем на весь пайплайн в целом:

В данной статье нас интересуют этапы Mask R-CNN и классификации в рамках пайплайна
Далее мы рассмотрим три этапа: 1) использование Mask R-CNN для построения масок ингредиентов омлета; 2) ConvNet классификатор на основе Keras; 3) визуализация результатов, используя t-SNE.
Mask R-CNN (MRCNN) в последнее время находятся на пике популярности. Начиная от исходной статьи Facebook-а [5] и заканчивая Data Science Bowl 2018 [6] на Kaggle, Mask R-CNN зарекомендовала себя как мощная архитектура для instance segmentation (т.е., не только попиксельной сегментации изображений, но и отделения нескольких объектов, принадлежащих к одному классу). К тому же, одно удовольствие работать с реализацией MRCNN от Matterport [7] в Keras. Код отлично структурирован, имеет хорошую документацию и работает прямо из коробки, хоть и медленнее, чем ожидалось.
На практике, особенно при разработке прототипа, критически важно иметь предобученную свёрточную нейросеть. В большинстве случаев набор размеченных данных у data scientist-а весьма ограничен, либо его нет совсем, в то время как ConvNet требует большого количества размеченных данных, чтобы достигнуть сходимости (так, набор данных ImageNet содержит 1,2 млн размеченных изображений). Тут на помощь приходит transfer learning [8]: мы можем зафиксировать веса свёрточных слоев и дообучить лишь классификатор. Фиксировать свёрточные слои важно для небольших датасетов, поскольку такая техника предотвращает переобучение.
Вот что я получил после первой эпохи дообучения:

Результат сегментации объектов: распознаны все ключевые ингредиенты
На следующем этапе пайплайна (Process Inferenced Data for Classifier) необходимо вырезать ту часть изображения, которая содержит тарелку, и извлечь двумерную бинарную маску для каждого ингредиента на этой тарелке:

Кропы изображения с ключевыми ингредиентами в виде бинарных масок
Эти бинарные маски затем комбинируются в 8-канальное изображение (поскольку я определил 8 классов масок для MRCNN), и мы получаем Сигнал №1:

Сигнал №1: 8-канальное изображение, состоящее из бинарных масок. В цвете для лучшей визуализации
Чтобы получить Сигнал №2, я посчитал количество раз, которое каждый ингредиент встречается на кропе тарелки и получил набор векторов-признаков, каждый из которых соответствует своему кропу.
CNN классификатор был реализован с нуля, используя Keras. Я хотел скомбинировать несколько сигналов (Сигнал №1 и Сигнал №2, а также возможное добавление данных в будущем) и позволить нейросети по ним строить прогнозы относительно качества блюда. Ниже представленная архитектура является пробной и далека от идеала:

Несколько слов по поводу архитектуры классификатора:
Для визуализации результатов работы классификатора на тестовых данных я использовал t-SNE — алгоритм, который позволяет перенести исходные данные в пространство меньшей размерности (чтобы понять принцип работы алгоритма, рекомендую прочитать статью-первоисточник [10], она чрезвычайно информативна и хорошо написана).
Перед визуализацией я взял тестовые изображения, извлек логит-слой классификатора и применил к данному датасету алгоритм t-SNE. Хоть я и не пробовал различные значения параметра перплексии, результат все равно выглядит вполне неплохо:

Результат работы t-SNE на тестовых данных с предсказаниями классификатора
Конечно, данный подход неидеален, однако он работает. При этом возможных улучшений может быть довольно много:
Заключение. Нужно, наконец, признать, что у бизнеса нет ни данных, ни пояснений, ни тем более четко поставленной задачи, которую необходимо решить. И это хорошо (иначе, зачем им ты?), ведь твоя работа как раз и заключается в том, чтобы использовать различные инструменты, многоядерные процессоры, предобученные модели и смесь технической и бизнес-экспертизы для создания дополнительной ценности в компании.
Начните с малого: работающий прототип можно создать из нескольких игрушечных блоков кода, и он в разы увеличит продуктивность дальнейших бесед с руководством компании. В этом и заключается работа data scientist-а — предлагать бизнесу новые подходы и идеи.
Автор: a-pichugin
Источник [13]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/python/281256
Ссылки в тексте:
[1] “Специалист по большим данным”: https://goo.gl/VBnBWb
[2] “Deep Learning”: https://goo.gl/DcB2F7
[3] предыдущей статье: https://habr.com/company/newprolab/blog/339484/
[4] Polygon-RNN демо-видео: https://www.youtube.com/watch?v=S1UUR4FlJ84
[5] статьи Facebook-а: https://arxiv.org/abs/1703.06870
[6] Data Science Bowl 2018: https://www.kaggle.com/c/data-science-bowl-2018
[7] реализацией MRCNN от Matterport: https://github.com/matterport/Mask_RCNN
[8] transfer learning: http://cs231n.github.io/transfer-learning/
[9] Inception модуль: https://www.cv-foundation.org/openaccess/content_cvpr_2015/papers/Szegedy_Going_Deeper_With_2015_CVPR_paper.pdf
[10] статью-первоисточник: https://lvdmaaten.github.io/publications/papers/JMLR_2008.pdf
[11] D4 или двугранную симметричную аугментацию: https://en.wikipedia.org/wiki/Dihedral_group
[12] статью FaceNet: https://arxiv.org/pdf/1703.07737.pdf
[13] Источник: https://habr.com/post/412523/?utm_campaign=412523
Нажмите здесь для печати.