Привет всем читателям Хабра! Нас зовут Сергей и Павел, мы студенты Томского государственного университета систем управления и радиоэлектроники (ТУСУР). В прошлом году мы победили в треке “Искусственный интеллект” IV Межвузовского конкурса выпускных проектов «‎IT Академии Samsung»‎. Там мы представили проект, использующий нейронные сети для анализа информации на ценниках.

Мы распознавали ценники сети магазинов “Лента” при помощи нейронных сетей для сегментации и OCR и теперь хотим рассказать о том, как проходила работа над проектом и что мы узнали за это время.

(Источник фото: https://hi-tech.mail.ru/news/57068-v-rossiyskih-magazinah-rastut-ceny-na-tehniku-foto/)
(Источник фото: https://hi-tech.mail.ru/news/57068-v-rossiyskih-magazinah-rastut-ceny-na-tehniku-foto/)

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

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

Сейчас распространены такие способы проверки ценников:

  • Ручная проверка.

    • плюсы: дёшево, если работники успевают всё сделать вовремя.

    • минусы: трудоёмко, высокая вероятность совершения ошибки, нужно доплачивать персоналу за переработки.

  • Проверка с применением терминалов сбора данных (ТСД).

    • плюсы: частичная автоматизация процесса, ниже временные затраты.

    • минусы: высокая стоимость ТСД и ПО для них, не исключены ошибки из-за человеческого фактора.

  • Электронные ценники.

    • плюсы: полная автоматизация, за них может отвечать буквально несколько человек.

    • минусы: дорого.

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

Хотя нейронные сети для анализа ценников используются не так часто, в разных странах мира (например, в Малайзии, Украине, Китае) ведутся исследования на эту тему [1-3]. На данный момент на рынке представлены следующие решения, позволяющие анализировать информацию на ценниках:

  • price tag scanning, OCR & data capturing от Klippa — это ПО для получения информации с ценников, нацеленное на розничных клиентов магазинов. Достоинства: высокая точность распознавания, возможность использовать разные форматы вывода (JSON, CSV, XLSX, XML). Недостаток: небольшое число поддерживаемых языков может ограничить аудиторию нашего решения в будущем. 

  • price tag recognition: a smartphone instead of a pdt от Neti — ПО для автоматизации сравнения цены с информацией в базе данных. Оно нацелено на владельцев магазинов и работников. Достоинства: низкий порог вхождения и высокая точность распознавания. Недостаток: отсутствие возможности распознавания описания товара.

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

Алгоритм и методы

 Планируемый алгоритм работы проекта:

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

  • сегментация изображения для выделения областей, содержащих нужную информацию;

  • вырезание полученных сегментов;

  • применение оптического распознавания символов (OCR) в выделенных областях;

  • сравнение реальной информации с информацией представленной на ценнике;

  • возврат результатов пользователю.

Для обучения нейронных сетей была собрана база изображений ценников сети магазинов “Лента”.  Всего было собрано порядка 250 фотографий. Для каждого изображения размечались следующие сегменты (см. рисунок 1):

  • Measure — общая информация о количестве товара (например, «80 г» приправы Роллтон);

  • Measure_num — количество товара;

  • Measure_name — наименование единицы количества;

  • Price_card — цена товара по скидочной карте Лента;

  • Price — цена товара без учёта скидочной карты.

Для разметки ценников использовалась программа LabelImg.

Рисунок 1. Пример разметки изображения ценника
Рисунок 1. Пример разметки изображения ценника

В ходе работы над проектом были опробованы следующие решения:

Архитектуры нейронных сетей для сегментации изображений:

  • UNet-Mini [5, 6];

  • MobileNetV2 [6];

  • VGG16 [7];

  • YOLOv4-Tiny [8].

Решения для OCR:

  • Keras-ocr;

  • EasyOCR.

В итоге мы остановились на связке YOLOv4-Tiny + EasyOCR. Сейчас подробно объясним, почему.

UNet-Mini представляет собой набор из 8 свёрточных слоёв, для которых использован приём bottleneck. Обучение данной сети производилось на сегменте цены с учётом скидочной карты, т.к. он обладает наибольшим размером. Пример разметки изображения с этим сегментом представлен на рисунке 2.

Рисунок 2. Разметка изображения с помощью UNet-Mini
Рисунок 2. Разметка изображения с помощью UNet-Mini

Главным плюсом архитектуры UNet-Mini является ее простота, но обнаружились и серьезные минусы: эта модель требует длительного обучения, при этом итоговая точность получается невысокой, а для вырезания сегмента требуется найти координаты углов полученного произвольного сегмента и соответственно вырезать сегмент по полученным координатам.

Рисунок 3. Результаты работы сети UNet-Mini: фиолетовой областью отмечается область, выделенная нейронной сетью, а черной рамкой показан реальный сегмент выделенный нами.
Рисунок 3. Результаты работы сети UNet-Mini: фиолетовой областью отмечается область, выделенная нейронной сетью, а черной рамкой показан реальный сегмент выделенный нами.

MobileNetV2 стала следующей использованной архитектурой. Модель обучалась с теми же параметрами, что и UNet-Mini. На рисунке 4 показано, что эта нейронная сеть правильно определяет положение сегмента, но иногда не выделяет нужные части или затрагивает нерелевантную область.

Рисунок 4. Разметка изображений с помощью MobileNetV2
Рисунок 4. Разметка изображений с помощью MobileNetV2

Для повышения точности мы опробовали три вида медианного фильтра (см. рисунок 5). Такой фильтр берёт вокруг каждого пикселя область, определяет в ней наиболее часто встречаемое значение и заменяет пиксель на это значение.

Рисунок 5. (a) Медианный фильтр с ядром =1; (b) он же, но с ядром =3; (c) он же, но с ядром =5
Рисунок 5. (a) Медианный фильтр с ядром =1; (b) он же, но с ядром =3; (c) он же, но с ядром =5

Плюсы такого подхода:

  • высокая точность;

  • высокая скорость обучения.

Минусы:

  • наличие “артефактов” при распознавании;

  • необходим дополнительный метод для вырезания сегмента.

VGG16 уже не использует приём bottleneck, что увеличивает производительность сети. В нашем проекте в качестве оптимизатора был выбран алгоритм Adagrad, а лосс-функцией была выбрана метрика Mean Absolute Percentage Error (MAPE).

Рисунок 6. Разметка изображений с помощью VGG16
Рисунок 6. Разметка изображений с помощью VGG16

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

YOLOv4-Tiny. Хотя предыдущая сеть предоставляет удобные инструменты для работы с прямоугольными областями, она всё же имеет существенные недостатки: после одного прогона сегментируется всего один класс, при этом его нахождение само по себе — достаточно медленный процесс.

В связи с этим разработка была перенесена на YOLOv4-Tiny. Эта нейронная сеть имеет не менее высокие показатели точности, при этом её скорость настолько высокая, что позволяет классифицировать объекты даже на видео, а способ представления координат найденных объектов аналогичен предыдущей сети. Также YOLOv4 позволяет обнаружить сразу несколько объектов, принадлежащих разным классам, что позволяет свести всю операцию нахождения координат к одному прогону сети.

Детектор для распознавания сегментов был обучен с помощью репозитория Darknet (https://github.com/pjreddie/darknet). Обучение проходило сравнительно быстро, так как производилось сразу со всеми сегментами. Результаты работы сети представлены на рисунке 7.

Рисунок 7. Разметка изображений с помощью YOLOv4
Рисунок 7. Разметка изображений с помощью YOLOv4

Точность и скорость работы рассмотренных сетей собрана в таблицу 1.

Таблица 1. Точность и скорость работы нейронных сетей.

UNet-Mini

MobileNetV2

VGG16

YOLOv4

Точность (accuracy)

64.23%

97.69%

96.44%

98.31%

Время на эпоху (time per epoch)

142,33 sec

2.68 sec

2.36 sec

2.74 sec

Видно, что наиболее выгодной в отношении качество-время является архитектура YOLOv4. Однако для корректной обработки сегментов необходимо программно расширить области, полученные с помощью этой нейронной сети. Так, в частности, область Description нужно увеличить по ширине, чтобы соответствовать ширине входного изображения. Поскольку на рассматриваемых нами ценниках область Description не окружена лишней информацией, данное расширение никак не повлияет на последующее распознавание символов. Благодаря этому точность работы YOLOv4 можно считать достаточной для наших нужд.

Keras-ocr является доработанной и упакованной версией реализации Keras CRNN и опубликованной модели обнаружения текста CRAFT. Она применяется для распознавания текстового содержимого выделенном сегменте. Примеры её работы представлены на рисунке 8.

Плюсы:

  • быстрая работа;

  • поддержка английского языка “из коробки”.

Минусы:

  • объединение полей «рубли» и «копейки» в одну строку;

  • низкая точность распознавания на русском языке;

  • вывод данных в виде тензора с большим количеством ненужной информации.

Рисунок 8. Распознавание текста в keras-ocr
Рисунок 8. Распознавание текста в keras-ocr

Видно, что система совершает большое число ошибок при определении текста, такие результаты являются неудовлетворительными.

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

Рисунок 9. Пример разметки изображений
Рисунок 9. Пример разметки изображений

Новый датасет предоставляет сразу несколько преимуществ:

  • на сегментах больше нет лишней информации (например, в сегментах цены теперь только цифры, нет текстовой строки “руб.”);

  • появилась возможность работы со штрихкодами.

  • выше точность определения сегментов.

В новой разметке выделяются следующие сегменты:

  •  Description — описание товара;

  •  Barcode — штрихкод товара типа EAN-13;

  • Rub — часть цены товара в рублях;

  • Kop — часть цены товара в копейках;

  • Rub_card — часть цены товара в рублях по скидочной карте;

  • Kop_card — часть цены товара в копейках по скидочной карте.

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

Недостатком же данного API являются ошибки при распознавании спец символов(_, #, % и пр.) и скобок. Однако данная проблема может быть исправлена дополнительным дообучением. В ходе тестирования нам удалось достичь высоких показателей точности для каждого из сегментов. Для распознавания штрихкодов в соответствующем сегменте использовалась библиотека pyzbar, которая может как декодировать сам штрихкод, так и определять его тип. Результаты работы EasyOCR и библиотеки pyzbar представлены на рисунке 10.

Рисунок 10. (a) Распознавание сегмента Description; (b) сегмента Rub; (c) сегмента Kop; (d) декодирование штрихкода
Рисунок 10. (a) Распознавание сегмента Description; (b) сегмента Rub; (c) сегмента Kop; (d) декодирование штрихкода

Клиент-сервер

Для удобства работы создано клиент-серверное приложение для Android. В качестве языка программирования использовался Java, и для установления связи с сервером использовалась библиотека Retrofit. При этом само соединение с сервером осуществлялось посредством сервиса ngrok из-за отсутствия “белого” IP-адреса. Ссылка на последнюю версию приложения. Для работы приложению необходимо предоставить разрешение на использование камеры для съёмки ценников и отправки их на сервер для анализа данных.

Сам сервер реализован на основе фреймворка Django, который предоставляет широкий выбор возможностей для настройки и работы сервера. ПО для сегментации и распознавания написано на языке Python.

Результаты работы клиент-серверного приложения представлены на рисунке 11.

Рисунок 11. Результаты работы клиент-серверного приложения.
Рисунок 11. Результаты работы клиент-серверного приложения.

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

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

Обсуждение результатов

Для расчета точности работы нейронной сети были использованы следующие метрики: MAPE для числовых сегментов (1), соотношение правильно распознанных символов к общему числу символов для текстовых сегментов (2) и соотношение распознанных штрихкодов к общему количеству штрихкодов (3). Итоговая точность работы нейронной сети рассчитывается как среднее арифметическое между всеми ранее названными метриками (4) и представлена в таблице 2.

Среднее время обработки запроса сервером составило 9-11 сек из-за того, что она производится на CPU.

Таблица 2. Точность работы YOLOv4-Tiny+EasyOCR на выборке из 50-ти результатов.

Description

Rub

Kop

Rub_card

Kop_card

Barcode

Total accuracy

Accuracy

93.34%

100%

90%

100%

100%

88%

95.22%

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

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

Ну и в завершение хотелось бы выразить свою благодарность образовательному проекту «‎IT Академия Samsung»‎, флагману глобальной программы Samsung Innovation Campus, за предоставленную возможность освоить навыки проектирования и разработки проекта с нейронными сетями, а также нашим кураторам за многочисленные советы по улучшению проекта и общее хорошее настроение.

Ссылки

Исследования зарубежных учёных на схожую тематику:

  1. Hussin, M. N. A., Ahmad, A. H., & Razak, M. A. (2017). Price tag recognition using hsv color space. Journal of Telecommunication, Electronic and Computer Engineering (JTEC), 9(3-9), 77-84.

  2. Kovtunenko, A., Yakovleva, O., Liubchenko, V., & Yanholenko, O. (2020). RESEARCH OF THE JOINT USE OF MATHEMATICAL MORPHOLOGY AND CONVOLUTIONAL NEURAL NETWORKS FOR THE SOLUTION OF THE PRICE TAG RECOGNITION PROBLEM. Bulletin of National Technical University "KhPI". Series: System Analysis, Control and Information Technologies, (1 (3), 24–31.

  3. Yong-Qiang, M., Bao-Jie, F., Chao, S., Rui, Y., & Yi-Shi, G. (2020). Towards accurate price tag recognition algorithm with multi-task RNN. Acta Automatica Sinica, 45, 1-7.

Исследования использованных архитектур:

  1. Weng, Y., Zhou, T., Li, Y., & Qiu, X. (2019). Nas-unet: Neural architecture search for medical image segmentation. IEEE Access, 7, 44247-44257.

  2.  Pravitasari, A. A., Iriawan, N., Almuhayar, M., Azmi, T., Fithriasari, K., Purnami, S. W., & Ferriastuti, W. (2020). UNet-VGG16 with transfer learning for MRI-based brain tumor segmentation. Telkomnika, 18(3), 1310-1318.

  3. Sandler, M., Howard, A., Zhu, M., Zhmoginov, A., & Chen, L. C. (2018). Mobilenetv2: Inverted residuals and linear bottlenecks. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 4510-4520).

  4. Simonyan, K., & Zisserman, A. (2014). Very deep convolutional networks for large-scale image recognition. arXiv preprint arXiv:1409.1556.

  5. Bochkovskiy, A., Wang, C. Y., & Liao, H. Y. M. (2020). Yolov4: Optimal speed and accuracy of object detection. arXiv preprint arXiv:2004.10934.

Об авторах

Лаптев Павел
Лаптев Павел

pavel.laptev.87@gmail.com \ https://vk.com/octoded
Студент 4 курса Томского государственного университета систем управления и радиоэлектроники, Факультет Безопасности
Победитель конкурса IT Академии Samsung в треке “Искусственный интеллект”, 2021
Награжден дипломом I степени международной конференции “Перспективы развития фундаментальных наук”, 2021

Давыденко Сергей
Давыденко Сергей



sergun_dav@mail.ru \ https://vk.com/sergun_dav
Студент 4 курса Томского государственного университета систем управления и радиоэлектроники, Факультет Безопасности
Победитель конкурса IT Академии Samsung в треке “Искусственный интеллект”, 2021

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


  1. warhamster
    23.03.2022 15:11
    +4

    Я, может, чего-то не понимаю, а почему нельзя тупо добавить на ценник QR-код и его уже сканировать вместо вот этого вот всего?


    1. vvviperrr
      23.03.2022 15:15

      легаси, сэр


      1. warhamster
        23.03.2022 15:35

        По идее QR-код можно хоть на Коболе сгенерировать, небось не бином ньютона.

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


        1. cofein51
          24.03.2022 11:39

          М.видео печатает коды возле ценника.

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


    1. shale
      23.03.2022 15:18

      Я так думаю, что базу ведут одни, а ценники печатают другие. И проблема как всегда во взаимодействии. Но это уже мои домыслы


    1. SiteCenter
      23.03.2022 16:12

      Добавить QR-код можно. Более того, так уже делают. Проблема QR-кодов в том, что они отнимают место, которое можно использовать, например, для информации об акциях (сделать шрифт крупнее чем, если бы был QR-код). Не стоит забывать про законодательство - есть информация, которая обязана быть на ценниках. Т.е. с технической точки зрения, добавить QR - не проблема, но это повлечет увеличение размера ценника и, как следствие, повышение его стоимости (как следствие - увеличение затрат на протяжении всей работы магазина). В случае с предложенным в данной статье вариантом - затраты на долгой дистанции окажутся существенно ниже, чем при использовании QR


  1. Albel9999
    23.03.2022 15:34

    Никогда не понимал всей этой возни с ценниками. Почему бы просто при печати/экспорте не запоминать состояние цены на тот или иной товар? И при изменении сразу ставить новые ценники в очередь на печать? Работнику магазина останется только взять свежераспечатанный ценник и найти товар на полке… Вообще никакое распознавание не потребуется


    1. AigizK
      23.03.2022 15:52

      Одна из причин - человеческий фактор. Тот кто должен заменить, допустим забыл.


    1. glebasterBajo
      23.03.2022 16:20
      +5

      Я расскажу Вам, как это происходит (происходило в моем случае), на своем личном примере.

      Я прихожу на работу в 7:45, включаю освещение, компьютеры, кассу, начинаю загружать обновление БД с ценами, переодеваюсь и пью чай. В 8:00 магазин открывается и уже заходят первые покупатели. Какие-то цены изменились, я печатаю ценники, режу их и начинаю менять. Стоит понимать, что пока я их печатаю/режу/меняю меня "дергают" туда-сюда и этот процесс откладывается.

      Часто бывает, что цена меняется в течение дня. К примеру, ты разгружаешь или раскладываешь товар и тут "прилетают" обновления цен. Были случаи (2 раза), когда цены менялись почти на весь ассортимент (а это сотни наименований!). И в течение всего этого не забываем, что вас "дергают" туда-сюда покупатели.

      Это просто пояснения к словам "Никогда не понимал всей этой возни с ценниками ..." и " ... Работнику магазина останется только взять свежераспечатанный ценник ..."


      1. XaBoK
        23.03.2022 17:18
        +3

        В дополнение к рассказу со стороны работника, добавлю сторону разработчика. Заранее извиняюсь, но терминалогия английская. Ценник относится к Shelve Label и является частью Public Offer (публичная оферта) и регулируется законом. Поэтому в этой области свои стандарты и в некоторых странах даже сертификации. Сертификация касается как информационной Label системы (цифровой или бумажной) так и периферийных устройств (принтеров, дисплеев и тд). Так что просто добавить QR зачастую просто очень дорого. Смена принтеров и пересертификация и тд.


      1. PereslavlFoto
        23.03.2022 18:40

        А пока вы меняете ценники, касса продаёт товары по той цене, которая указана на прежних ценниках? Ведь именно ценник, а не касса, содержит условия публичной оферты?


        1. XaBoK
          23.03.2022 23:06

          Принцип основан на регуляции - обычно лучший вариант для клиента в приоритете. Если ценник говорит 10, а касса 9, то значит 9. И если ценник 9, а касса 10, то тоже 9.


          1. vvzvlad
            23.03.2022 23:21

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


            1. XaBoK
              23.03.2022 23:36
              +3

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


  1. kahi4
    23.03.2022 20:19

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


    1. vvzvlad
      23.03.2022 23:23

      А у вас, это где?
      Так-то да, электронные ценники внедряют там, где большая минимальная зарплата+налоги или где большие штрафы за несоответствие цен, или где цена меняется очень часто.


      1. kahi4
        24.03.2022 00:16

        В Швеции. Цена меняется редко, остальное да, высокая зарплата и штрафы. Но тут ещё часто акции на конкретные продукты. В целом тут автоматизируют все что можно автоматизировать как раз потому что с учетом зарплат, окупается достаточно быстро.


      1. zlat_zlat
        24.03.2022 07:48

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


        1. XaBoK
          24.03.2022 13:24

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


  1. dimnsk
    24.03.2022 12:34
    +4

    А расскажите ценность данной статьи в 2022 году ?
    обычная курсовая работа студентов 4 курса...

    я что-то не понимаю ?