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


В онлайн-продажах для этого есть специальные инструменты, но как быть офлайн-ритейлу, например, сетевым дискаунтерам? Увы, ни один краулер не сможет прийти в магазин конкурента, чтобы переписать ценники. А проникновение в чужие базы данных — это уже в духе героев игр Watch Dogs — совершенно незаконно.


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


Мониторь полочные цены или положишь зубы на полку


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


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



Попутно выясняется, какие товары в принципе предлагают конкуренты. Ритейлер понимает, как улучшить собственный ассортимент: что-то добавить или, наоборот, отказаться от отдельных позиций. Мониторинг позволяет быстрее реагировать на изменение ценовой политики конкурентов по определенным товарам и сохранять конкурентоспособность.


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


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


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


Особенности ценового мониторинга в офлайн-ритейле, или Волка ноги кормят


Цены на сайтах ритейлеров и в торговых залах различаются из-за разницы в логистических затратах, а также ряда других микроэкономических факторов. Поэтому при ценовом мониторинге в офлайн-ритейле работает старый добрый принцип «волка ноги кормят». Ритейлеры ежедневно отправляют в магазины конкурентов специально обученных засланцев — скаутов, которые под видом простых покупателей фотографируют прилавки и переписывают ценники.


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



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


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

Автоматизация мониторинга цен с помощью ML


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



Список товаров — фото прилавка — подтверждение цены, распознанной при помощи ML. Базовый пользовательский сценарий в приложении скаута


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


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


  1. Администраторы выбирают магазины для мониторинга, формируют списки товаров для проверки и распределяют задания по скаутам.
  2. Скаут может самостоятельно отметить, что находится в торговой точке, и получить задание на сканирование по конкретным товарам.
  3. В мобильном приложении скаута автоматически формируется список актуальных заданий. В каждом из них — перечень товаров для проверки (обычно это 20 — 30 позиций).
  4. Руководствуясь списком, скаут снимает нужные товары и ценники и в пару кликов отправляет фото на анализ. Вводить цифры вручную не нужно.
  5. Фото попадают на сервер, нейросеть распознает цену, сохраняет в базу и направляет цену скауту на верификацию. Скауту остается лишь подтвердить достоверность результата нажатием соответствующей кнопки.
  6. Если нейросеть ошиблась (такое случается даже с самыми совершенными моделями), скаут вводит правильную цену вручную.
  7. Распознанные и верифицированные цены привязываются к геоточке/ID конкурента, компонуются в Excel-файл или передаются в 1С ритейлера.

Реализация проекта


Определившись с ключевой функциональностью, мы выбрали фреймворк Flutter для разработки кроссплатформенного приложения (Android/iOS) и приступили к работе. Главным приоритетом была точность распознавания, которая уже на стадии MVP достигла 95% по базовым ML-метрикам.


Два типа мониторинга


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


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



Типичная фотография для мониторинга по списку. В кадр попадает соседний ценник, но нас интересует только тот, что в центре


Мониторинг без списка — более сложная и интеллектуальная задача. Скаут фотографирует полку целиком, а перечень товаров с ценами формируется автоматически.



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


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



Пример сигаретного прайса, распознанного по фотографии


Работа с моделями и ML-пайплайном


Для детекции и сегментации ценников мы выбрали MMDet. Собрали и разметили около 1,5 тысяч фото российских ценников, предоставленных заказчиком. Разметка включала сам ценник, его области и содержимое.


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


Поэтому мы потюнили 1% весов LoRA, чтобы модель не разучилась распознавать цифры и латиницу и дообучили TrOCR для работы с русским языком на датасете из нескольких тысячах реальных и синтетических изображений с кириллицей. Этот тюнинг занял примерно месяц, но оно того стоило. Точность распознавания информации повысилась с 80% до 98% на тестовых данных. OCR научился справляться с русским текстом, отличать рубли от копеек и практически не ошибаться.


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


Какой пайплайн получился


Получившийся пайплайн работает следующим образом:


  1. Фотография ценника, сделанная скаутом, передается на бэкенд через веб-сокет.
  2. Фото сохраняется на сервере и помещается в очередь на распознавание, реализованную с помощью Kafka. Оттуда ее забирает консюмер ML-пайплайна.
  3. Для начала необходимо произвести сегментацию изображения — за обнаружение ценника отвечает ConvNeXt-v2 из MMdet. На этом этапе каждый пиксель изображения размечается для определения принадлежности к ценнику.


Фотография полки магазина и маска с обнаруженными ценниками


  1. В полученной маске сегментации определяется главный ценник и 4 точки, которые мы будем перспективно преобразовывать, чтобы повернуть изображение под нужным углом. За это отвечает отдельный алгоритм, основанный на методе «вращающихся штангенциркулей».
  2. Детектор из библиотеки MMdet находит текст, а затем в игру вступает TrOCR. Эта модель детектирует и классифицирует элементы ценника по трем классам: «основная сумма», «копейки», «наименование товара». Что касается ценников со скидкой, то мы специально разметили их так, чтобы класс price был у нужной цены.


Сколько стоит паста? Без пол-литры нейронки не разберешься


  1. Результаты распознавания, включая общую цену и название товара, улетают обратно на бэкенд через HTTP.
  2. Бэкенд принимает распознанные данные сохраняет и проводит постобработку. На этом этапе суммируются основная сумма и копейки.
  3. Результаты отправляются в мобильное приложение через веб-сокет.
  4. Скаут верифицирует данные, они возвращаются на бэкенд и складываются в базу PostgreSQL до востребования.

Особенности архитектуры


Архитектура приложения полностью микросервисная. Для фронта, бэка, нейронок и BentoML предусмотрены отдельные Docker-контейнеры.



Фронтэнд, бэкэнд, BentoML с нейронками существуют отдельно


Серверная часть приложения работает на Python и использует Fast API. BentoML позволяет нам обращаться к моделям через API, а не напрямую. Это более гибкое и удобное решение по сравнению с Flask, и FastAPI, оно создает отдельные процессы, полностью изолированные от обработки веб-запросов. Это облегчает масштабирование.


PostgreSQL служит базой для хранения данных, извлеченных из ценников, а брокер Kafka отвечает за упорядочивание заданий на распознавание.


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



Результаты работы нашего пайплайна на тестовом стенде


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


Вместо выводов: планы на будущее


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



Административный интерфейс, через который можно раздавать задачи скаутам


Одной из самых масштабных задач на ближайшую перспективу является реализация мониторинга торговых полок без предварительного списка товаров (пока что готов только анализ прайс-листов на сигареты). Этого слона мы будем есть по частям: придется настроить детектирование не только ценников, но и самих товаров, решить множество других подзадач.


Еще в планах — внедрить интеллектуальный алгоритм для сопоставления товаров конкурентов в базе данных. В результате мы получим исчерпывающую информацию о наименованиях тех или иных позиций у разных игроков рынка. Условно, в одной розничной сети на ценниках пишут «Виски шотландский. Высший сорт», в другой «Шотландский виски высшего сорта», а в третьей — «Виски. Шотландия». Матчинг такой информации даст нам эталонную точку входа (соответствующую графу в БД) для данных по каждому товару и повысит эффективность мониторинга без списка товаров.



Менеджерский экран с результатами мониторинга по отдельным товарным позициям


Кроме того, мы продолжим развивать клиентскую часть, улучшая UX и UI. Отменить отправку изображения, сделать фото повторно, обновить статус мониторинга — любые действия должны выполняться максимально удобно, желательно, в один-два клика.

Комментарии (17)


  1. SuharkovMP
    30.05.2024 09:44
    +13

    При входе в некоторые магазины можно даже увидеть предупреждения, что фото- и видеосъемка в помещении запрещены, а нарушителей может поджидать охрана. 

    Эту самую охрану, в свою очередь, будут рады пригласить на беседу в отделение полиции, а представителей администрации торгового заведения - в Роспотребнадзор, где им быстро растолкуют содержание постановления Правительства РФ от 31.12.2020 № 2463.

    Кратко - фотографировать ценники можно, и даже снимать на видео. Это публичная информация.


    1. kolabaister
      30.05.2024 09:44
      +4

      Можно добавить в приложение функцию "меня выгнали из магазина", вызывающую постановку задачу на отправку туда человека, умеющего доносить требования закона)


      1. DewT-Mag Автор
        30.05.2024 09:44
        +1

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


        1. Wwyn
          30.05.2024 09:44

          Ты ведь даже не представляешь, что сейчас ваша компания забивает очередной гвоздь в гроб офлайн продаж? Уже лет через 25-30 все покупки будут происходить в онлайне. А старики будут вспоминать прекрасные времена поездок в ашан.


  1. kolabaister
    30.05.2024 09:44

    Не пытались распознать на фото не только ценники но и сами товары? Тогда соотнести ценник с товаром будет намного проще


    1. DewT-Mag Автор
      30.05.2024 09:44

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


  1. SmallDonkey
    30.05.2024 09:44

    TrOCR... Этот тюнинг занял примерно месяц, но оно того стоило...

    Я так понимаю вы использовали самую большую модель?


    1. SantrY
      30.05.2024 09:44

      Довольно долго, даже если речь о чистом времени тренировки


    1. DewT-Mag Автор
      30.05.2024 09:44

      Много времени ушло на эксперименты, пробовали модели разных размеров. В итоге остановились на Base model and with LoRA, тренировка итоговой модели заняла 6 дней на всей синтетике.


  1. vis_inet
    30.05.2024 09:44
    +3

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

    Ценники на полках магазинов - это публичная оферта.

    Любые ограничения на ознакомление с ними незаконны.


  1. piton_nsk
    30.05.2024 09:44

    Может проще дать денег продавцу, чтобы скинул ексельку с ценами?


    1. vis_inet
      30.05.2024 09:44
      +2

      А вот это вряд ли законно.


      1. piton_nsk
        30.05.2024 09:44
        +1

        Зато эффективно) А если самому устроиться, что законно, а что нет? Это, конечно, шутка была, да и технология считывания ценников сама по себе хороша.


  1. Robastik
    30.05.2024 09:44

    любые действия должны выполняться максимально удобно, желательно, в один-два клика

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

    Использование видео не только бы упростило работу до уровня имбецила (с соответствующим снижением оплаты), но и повысило бы качество распознавания благодаря множеству снимков с разных ракурсов.


  1. 2PAE
    30.05.2024 09:44

    "Мелкий" упущенный момент. Магазин ОБЯЗАН предоставить вам информацию о товарах.

    Ещё раз. ОБЯЗАН. Да, не все любят соблюдать законы. А как вы её будете фиксировать, это ваше дело, не магазина.

    Иногда продавцы вот совсем совсем не любят соблюдать законы.

    Поэтому надо играть на своём поле. И не надо выходить на их поле.


  1. Forden
    30.05.2024 09:44

    Звучит так будто проще заняться небольшим промышленным шпионажем (дать взятку директору, например) или просто парсить сайт/приложение


    1. vis_inet
      30.05.2024 09:44

      Вы же понимаете, что за дачу взятки есть соответствующий абзац в книжке с названием "УК РФ" ?