Pull to refresh
0

Проверка ценников в магазине с помощью YOLOv4-Tiny+EasyOCR

Reading time 10 min
Views 9.7K

Привет всем читателям Хабра! Нас зовут Сергей и Павел, мы студенты Томского государственного университета систем управления и радиоэлектроники (ТУСУР). В прошлом году мы победили в треке “Искусственный интеллект” 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

Tags:
Hubs:
+20
Comments 27
Comments Comments 27

Articles

Information

Website
www.samsung.com
Registered
Founded
1938
Employees
Unknown
Location
Южная Корея