Интеллектуальное управление розничной торговлей с помощью машинного обучения

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

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

У нас может быть идея! Копайся!

Разве это не простая проблема распознавания текста?

Подождите, разве мы не пытаемся обнаружить текст? В конце концов, названия товаров, цены, скидки - все это либо цифры, либо буквы. Разве золотая комбинация EAST (обнаружение текста) и Tesseract (распознавание текста) не работает?

С одним изображением, имеющим и продукт, и его цену, Tesseract может с треском провалиться из-за слишком большого количества шума на изображении. Tesseract подробно рассматривался в нашем предыдущем блоге здесь.

Конвейер: базовый обзор

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

Сначала изображение проходит через сеть обнаружения объектов, чтобы обнаружить все ценники. Затем обнаруженные ценники действуют как входные данные для другой сети обнаружения объектов для определения цены. После определения цены мы используем предварительно обученный YOLO-v2 для определения цифр. Наряду с этим, мы можем использовать Tesseract, чтобы получить текст в ценнике.

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

Вы можете не найти достаточно приличных ценников, чтобы их можно было отправить на вашу модель. Хотя мы и комментировали изображения из этого набора данных Yuhang, это был утомительный процесс, и у нас по-прежнему не было большого разнообразия.
Расширение данных - это выход! Пройдите через этот подробный репозиторий, чтобы узнать, как использовать imageaug для пополнения ваших данных.

Шаг 1. Определите ценник

Обнаружение объектов стало проще благодаря Tensorflow Detection API. В недавнем блоге здесь мы обсудили, как вы можете создать набор данных, настроить процесс обучения и выполнять прогнозы.

MobileNet - это легкая архитектура с приличным MAP и длительностью прогнозирования, отсюда и выбор! Мы выбрали вариант Feature Pyramid Network, потому что он доказал свою эффективность при обнаружении небольших объектов.

Шаг 2: Определите цену

Как только ценники вырезаны, они отправляются в аналогичную архитектуру MobileNet FPN, которая обучена определять цену.

Шаг 3: обнаружение и классификация цифр

Следующим шагом после определения цены является определение и классификация цифр. Для этого мы используем модель YOLO_v2, предварительно обученную на наборе данных SVHN. Мы изменили модель из-за доступности архитектуры YOLO, предварительно обученной на наборе данных Street View House Number.

Но мы добавили дополнительный класс, класс специального символа. Мы поговорим об этом подробнее на шаге 5!

Наш конвейер точно определяет наличие специального символа и распознает цифры 3, 2, 9 на изображении выше.

Шаг 4: Определите десятичную дробь

Десятичные дроби слишком малы, вы не сможете обучить детектор объектов обнаруживать эти крошечные точки.

Более того, на некоторых изображениях они практически не видны.

Подождите, а что, если мы воспользуемся их крошечным размером в наших интересах?

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

OpenCV можно использовать для рисования и измерения контуров. Найдите минимальную и максимальную площадь, найдите их соотношение, если оно меньше 1/10 тада! на этом изображении наверняка есть десятичная точка.

В качестве меры предосторожности вы можете ограничить описанный выше алгоритм случаями, когда количество обнаруженных цифр превышает 2. (Сделайте паузу и подумайте, вы никогда не видели таких цен, как 3.3, 4.5, 98).

Шаг 5: доллар или цент?

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

Но но…

Что, если бы мы создали дополнительный класс в нашем Детекторе цифр Yolo для определения наличия символа валюты. Обратите внимание на наше слово, просто на наличие символа, а не на символ доллара или цента.

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

Если он справа, это, безусловно, символ центов. Если слева, это символ доллара.

Очевидно, мы держим пари, что вы никогда не видели, чтобы на ценнике было написано 3 доллара, это всегда 3 доллара.

Оценочные показатели

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

С помощью этого замечательного репозитория Github узнать карту MAP стало очень просто.

Дальнейшая работа

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

Как вы заметили, мы постоянно вырезаем из модели предсказанные изображения, которые будут отправлены в качестве входных данных для нашей следующей модели (сначала ценники, затем цена и т. Д.). Для каждой модели обнаружения объектов существует определенный размер ввода, например (600, 600). Обрезанные изображения должны быть изменены до этих больших размеров, чтобы выполнить прогноз. Такое увеличение изображения может привести к низкому качеству изображения и, как следствие, к плохим результатам. Можно дополнительно изучить такие методы улучшения, как GAN и SRCNN.

Не стесняйтесь оставлять любые другие предложения в комментариях!

Никита и Наитик проделали эту работу как розничный проект с Xplorazzi.