В кафетерии Альфа-Банка в обеденный час-пик образуются большие очереди. Процесс обслуживания замедляется на линиях раздачи горячих блюд и в кассовой зоне. При помощи современных методов компьютерного зрения можно автоматизировать процесс определения списка блюд на подносе. Решение поможет сократить время, проведенное сотрудниками в кафетерии, и издержки за счет автоматизации ручного труда, а также повысить имидж банка.
Большинство банковских задач связано с обработкой пользовательских данных и всегда оказывает существенное влияние на бизнес, что налагает ряд сложностей при их решении без предварительного трудоустройства. Фотографии подносов с едой, необходимые для решения вышеописанной задачи, к коммерческой тайне не относятся. Следовательно, о такой задаче проще рассказывать в публичном пространстве, использовать для образовательных целей и проведения соревнований по анализу данных. Дополнительный бонус — простота демонстрации решения тем, кто глубоко не погружен в тему анализа данных.
Поэтому именно задача автоматического распознавания списка блюд в кафетерии банка была выбрана из всех банковских задач для участия в конкурсном отборе программы Большие вызовы в учебном центре Сириус, проходившей в период 5-29 июля. Модераторы учебных программ оценили образовательные и практические цели проекта, приняв его в направление Большие данные, искусственный интеллект, финансовые технологии и машинное обучение. К сожалению, о положительном решение мы узнали только за месяц до старта программы. В итоге нам удалось в короткие сроки собрать и разметить датасет, составить план реализации проекта и подготовить образовательную составляющую проекта. В итоге за учебную смену удалось обучить модель детекции, реализовать android-приложение и телеграм-бота c backend на удаленном сервере, а также снять проморолик к приложению и подготовить лендинг проекта.
Сбор данных
Процесс сбора данных не должен мешать посетителям кафетерия, так что нам оставался только удаленный метод съемки. Специальных камер для съемки и интеграции с кассовым ПО у нас не было, поэтому мы ограничились камерами из личного арсенала — Go Pro: Hero5 Black и Session. Данные можно собирать двумя способами: оставить камеру непрерывно записывать видео на протяжении рабочего дня или делать снимки в момент появления подноса в кассовой зоне. Мы отказались от первого варианта, так как он генерируют большой объем данных и требует организации отдельного процесса их передачи и последующего выделения значимых кадров.
К сожалению, соседние кадры из видео также не могут быть использованы для аугментации из-за статичности процесса и интерфейса для их разметки. По второму же варианту работа асессора по сбору датасета включала: нахождение в кафетерии на период съемки, подключение к камере по wi-fi, оккупация ближайшего свободного стола (в силу ограничения радиуса действия сети), определение удачного момента для съемки через интерфейс мобильного приложения и зарядку внешнего аккумулятора после окончания работ.
Камеры были расположены в зоне самых проходных касс. В среднем в первые дни съемки на одной кассе пробивалось порядка 250 чеков за день. По итогам трех недель работы асессоров мы собрали порядка 8000 изображений подносов с едой. В дополнение к фотографиям получили выгрузку всех кассовых чеков, содержащих список блюд, а также время открытия и закрытия чека с точностью до минуты.
Разметка данных
Задачу определения списка блюд на подносе можно формулировать в терминах сегментации или детекции. В последней постановке асессорам требуется выделить минимальный прямоугольник, в котором блюдо содержится целиком. Главным преимуществом постановки задачи в терминах детекции является высокая скорость разметки обучающей выборки по сравнению с задачей сегментации. Выигрыш в скорости достигается за счет отсутствия необходимости точного выделения границ.
Разметка данных была выполнена при помощи решения CVAT. Инструмент разметки предоставляет интерфейс для определения границ объектов. Каждую выделенную область требуется промаркировать одной из категорий списка. Список категорий для каждой фотографии ограничивался по данным кассовых чеков списком блюд, пробитых на кассе в эту же минуту. К сожалению, кассовое ПО не фиксирует секунду совершения транзакции.
В среднем выделение границы одного блюда занимало 25 секунд. На фотографиях встречалось несколько подносов одновременно. Асессорам требовалось выделять только блюда и поднос посетителя, оплачивающего товар.
Особенности проектной смены
Сириус проводит отбор старшеклассников в программу "Большие вызовы" по всей Росcии. Все кандидаты проходят через этап отборочного тестирование по математике и программированию, а также защиту мини-проекта по направлению "Большие данные". Параллельно организаторы отбирают проекты от компаний-партнеров, учитывая актуальность, новизну, реализуемость и практическую значимость. После прохождения двухстороннего заочного конкурсного отбора в первый день смены в учебном центре руководители проектов очно презентуют свои проекты, а школьники составляют топ заинтересовавших их проектов. На основании заявленных приоритетов организаторы программы формируют проектные команды.
Большинство участников программы "Большие вызовы" уже имеет представление о машинном обучении, обладает хорошими навыками программирования, а некоторые даже успели поучаствовать в хакатонах по машинному обучению. Сильные технические навыки позволяют им запускать предобученные модели и даже оборачивать их в сервисы. Однако школьная программа не включает теорию по машинному обучению и, соответственно, школьники не знают, как изнутри устроены модели, процессы их обучения и оценки качества. Более того, навыки сформировавшейся проектной команды были разноплановыми, и не все члены команды были так хорошо знакомы с машинным обучением и python, как предполагалось. За будущее преимущество в виде шикарного дизайна и android-приложения пришлось заплатить мини-курсом по основам языка python.
Работа над проектом велась на протяжении трех недель, шесть дней в неделю. Первая неделя была посвящена закреплению основ python, знакомству с основными библиотеками для работы с данными: numpy, pandas, а также введению в машинное обучение. Дополнительно были рассмотрены важные практические особенности работы с данными: сбор данных, в том числе парсинг из открытых источников, и формирование задач по их разметке. На второй неделе акцент был поставлен на сверточные нейронные сети и архитектуры для решения задачи детекции. Учебный процесс состоял из лекционного материала, семинаров и самостоятельной работы в виде мини-контестов. Задания образовательной части проекта были тесно связаны с конечной задачей. Навыки работы с pandas закреплялись через объединение и джойн двадцати excel-файлов в различном формате - выгрузка данных кассовых чеков не является основным направлением деятельности, поэтому не унифицирована. Практика по краулингу была нацелена на один из кулинарных сайтов с целью дальнейшего переиспользования данных на практике по работе со сверточными нейронными сетями.
Образовательная часть проекта заняла полторы недели, затем команда приступила к выполнению конечных целей проекта. Были выделены следующие роли: machine learning engineer, backend-разработчик, python-разработчик, андроид-разработчик и дизайнер. За оставшееся время ребята с нуля обучили модель детекции блюд на подносе и развернули в виде api-сервиса, создали android-приложение с отличным дизайном, телеграм-бота и сайт-визитку, а также совместно с пресс-службой Сириуса сняли промовидео. По результатам еженедельной работы проводились предзащиты проекта, на которых команда рассказывала о достигнутых целях и дальнейших планах, отвечала на вопросы по технической и бизнес-составляющим. В завершение смены была организована финальная защита проектов с участием экспертного жюри из руководителей проектов, а также фестиваль проектов с приглашенными высокопоставленными гостями.
Разработка модели детекции
Обычно все эксперименты начинаются с использования популярных моделей: SSD, YOLO и Faster R-CNN. Затем, в зависимости от необходимого баланса между скоростью работы модели и ее качеством, выбирается оптимальный вариант. Реализации вышеперечисленных архитектур можно найти в популярных opensource-библиотеках - mmdetection и detecron2. Первый фреймворк позволяет унифицировать эксперименты со всеми перечисленными выше архитектурами, что сильно их ускоряет. Тогда как в detectron2, который развивает Facebook, из коробки поддерживаются только модели семейства Faster R-CNN. Во время учебной смены основная задача заключалась в реализации рабочего прототипа в сжатые сроки с приемлемым качеством и при этом как можно более простым api. Всем этим требованиям удовлетворяет библиотека от Facebook. У фреймворка потрясающий github-репозиторий, множество открытых туториалов для решения классических задач и он максимально прост в проведении экспериментов. По этой причине в основе всех ключевых экспериментов лежали модели семейства Faster R-CNN. Также нужно отметить, что процесс предоставления доступа на сервер с GPU затянулся по техническим причинам, что вылилось в нехватку времени для широкого спектра экспериментов. В дальнейшем пути развития проекта потребуется полноценное исследование всех типов алгоритмов.
Концептуально, применение Faster R-CNN модели детекции на кастомном наборе данных производится по следующему алгоритму. Выбирается предобученная для решения задачи классификации на большом датасете ImageNet нейронная сеть из семейств ResNet, Inception, или VGG и используется как модель извлечения признаков (feature extractor). Конкретно — берется карта признаков (feature map) с одного из глубоких слоев. Далее такая карта признаков подается в обучаемую под задачу детекции сверточную сеть (Region Proposal Network), которая для каждой ячейки карты признаков предсказывает вероятность нахождения в заданном куске изображения объекта, а также регрессирует координаты смещения заранее подготовленных default box-ов. После всего этого выход с такой сети отправляется в специальный пулинг-слой, после которого получаются вектора фиксированной размерности, и для них строится классификатор на исходном множестве классов. Обычно все компоненты такой сети заранее обучены детекции на датасете COCO, и для решения конкретной новой задачи на новом множестве классов веса всех компонент файнтюнятся.
Процесс непосредственного обучения моделей всегда следует за этапом предобработки данных и выбора схемы валидации. Собранный и размеченный датасет объемом 8000 фотографий содержал 405 различных категорий блюд, вследствие чего многие категории блюд были представлены в единственном экземпляре. Было принято решение сформировать валидационную часть из фотографии подносов, содержащих только блюда из топ-100 наиболее популярных классов. В результате размер валидационной выборки составил 10% всего датасета.
Модель |
Faster R-CNN, R50, full image |
Faster R-CNN, R50, cropped image |
Faster R-CNN, R101, cropped image |
AP50 |
84.5 |
85.0 |
87.1 |
AP75 |
75.2 |
75.6 |
77.3 |
Precision |
82 |
84 |
86 |
Recall |
80 |
81 |
85 |
F1 |
81 |
82.5 |
85.5 |
В таблице представлены метрики качества трех лучших моделей. В качестве базовой модели для извлечения признаков была выбрана R50-FPN, каждый батч размера 512 состоял из регрессированных bbox-ов, взятых с 8 случайных картинок. Вторая модификация модели была получена благодаря предобработке входных данных. Дело в том, что иногда на фотографии с камеры попадал не только поднос человека, который сейчас оплачивает заказ, но и поднос следующего посетителя. В результате модель могла верно обнаруживать объекты с соседних подносов, но получала штраф на этапе обучения, так как на этапе разметки bbox-ы для блюд с соседних подносов не определялись. Простое решение - вырезать поднос и подавать на обучение кропы изображений. Это уменьшило потребление дискового пространства примерно в 3 раза и улучшило все целевые метрик на 1-2 пункта. Третья модификация отличается от предшественницы более сложным feature-extractor-ом R101-FPN. Итого большой размер батча из большого набора картинок и достаточно глубокая сеть позволяют получить хорошее качество на выделенной выборке.
Обученную модель было сложно тестировать в Сириусе в боевых условиях, так как меню его столовой и кафетерия Альфа-Банка имеют существенный отличия. В демонстрационных целях работы приложения и телеграм-бота была обучена модель, определяющая 10 категорий блюд. Конфигурация модели Faster R-CNN + R50 + full показала следующей значения основных метрик качества: 92 AP50 и 94 F1.
Сервис
Тестовый сервис на основе Flask REST API развернут на удаленном бесплатном сервере с 2GB RAM и одним ядром. Сервис обслуживает одновременно android-приложение и телеграм-бота. По запросу из пользовательского интерфейса сервис запускает инференс модели, веса которой лежат в оперативной памяти. Выход модели передается в алгоритм NMS для фильтрации лишних box-ов. В итоге сервис возвращает ответ клиенту в виде списка блюд и их границ на исходном изображении.
Android-приложение
В течение проектной смены было невозможно провести интеграцию с кассовым ПО кафетерия ввиду отсутствия соответствующей экспертизы в команде и географической удаленности. Основной метод взаимодействия пользователя с сервисом был реализован в виде android-приложения.
Главный экран приложения предлагает отсканировать поднос, перейти к списку популярных блюд по категориям, собрать свой комплексный обед или оставить отзыв о работе сервиса и кафетерия. Интерфейс выбора фотографии для передачи в сервис позволяет сделать новую или выбрать из уже имеющихся в галерее. Перед отправкой данных пользователю предлагается вырезать часть изображения, содержащую поднос. Приложение отображает возвращенную сервисом фотографию с границами всех блюд, а также список со стоимостью каждого из них. Пользователю предлагается оплатить собранный заказ внутри приложения в одно касание. К сожалению, backend для оплаты остался нереализованным. На этом же экране реализованы рекомендации блюд, которые работают на основе алгоритма word2vec и метрики PMI. Дополнительно приложение на отдельном экране отображает историю покупок и пирог трат по категориям.
Телеграм-бот
В дополнении к android-приложению командой был реализован телеграм-бот. Бот снижает порог входа ввиду необязательности установки отдельного приложения и в силу кроссплатформенности мессенджера позволяет частично компенсировать отсутствие iOS-приложения. Функционал бота сводится к возможности отправить фотографии подноса с едой, на которую бот отвечает фотографией с распознанными границами блюд и списком найденных категорий.
Дальнейшие шаги
Промышленное использование сервиса по автоматического распознаванию блюд требует проработки вопросов интеграции с кассовым ПО, повышения скорости и отказоустойчивости сервиса, улучшения модели детекции и разработки модели для распознавания новых блюд. Анализ рынка показал, что главной зоной роста качества модели является увеличение объема размеченных данных на порядок до 100к примеров, в частности — разметка редких категорий блюд. Второе направление развития относится к тестированию других популярных архитектур: SSD и YOLO.
Полезные ссылки и материалы
Датасеты
Object detection UNIMIB2015-2016
Статьи
A multimodal deep learning approach for food tray recognition
Комментарии (9)
vmkras
02.08.2021 17:39Идея не нова, видел еще уже готовые терминалы с ПО для распознавания и инеграциями с кассой. 2019 год. Интересовались многие, но сколько дошло до покупки, тут не знаю. А ребята большие молодцы
todoman
02.08.2021 20:08+1Это всё очень здорово, но.
По моим наблюдениям, очередь в крупных компаниях происходит не из-за расчёта на кассе, а из-за того, что люди невероятно долго тупят, решая непосредственно на раздаче, что бы такое взять. В результате все ждут (и работники кафе/столовой, зависшие с пустой готовой тарелкой, и вся очередь), когда каждый второй думает, с каким соусом ему нужны драники. Как будто об этом нельзя было подумать ДО раздачи.
wadik69
03.08.2021 11:00В первом примере работы алгоритма два кусочка хлеба, а детектировало вроде только один(
smirnovevgeny Автор
03.08.2021 13:39Детектировались оба кусочка: розовый прямоугольник + белая подпись (видно часть надписи - "..сочек 100%") и черный прямоугольник + красная подпись
Uris
Полезная фишка. Ещё бы в магазине научилось бы оборудование распознавать на весах овощи и фрукты, чтобы не вводить их коды на замызганных клавиатурах весов. Хотя, наверное, уже сделано, но я пока не видел нигде.
vladbakhteev
Мы сделали, сейчас активно продаем https://smartscales.ru/en/
Grami
Подсказки конечно хорошо — ошибок явно меньше, но поставить «по старинке» 3 шт весов в зоне фруктов так же решит проблему нагрузки.
Не учитываем удобство для клиента, так как важен сам факт очереди.
vladbakhteev
CAPEX весов намного больше, чем камера и подписка на распознавание. Главная фича это предотвращение ошибки и воровства пользователей. Это экономит магазину намного больше денег, чем расход на распознавание