В сегодняшней статье на Хабре мы расскажем про очередную задачу распознавания. Рассмотрим проблему распознавания штрихкодов, которая очень актуальна в связи с непрерывным развитием системы маркировки и системы оплаты товаров по QR-коду в 2021 году.
![](https://habrastorage.org/getpro/habr/upload_files/f98/0dd/3c0/f980dd3c0d71af84f1fae0d68022acfe.jpg)
Штрихкод, или баркод, безусловно, является важным изобретением человечества, которое изменило течение нашей жизни. В одной из своих статей на Хабре мы уже рассказывали, как эволюционировал этот способ кодирования информации.
Сегодня не будем углубляться в техническую часть, а рассмотрим существующие проблемы при внедрении технологии распознавания баркодов. Действительно, откуда могут возникнуть проблемы, если штрихкодирование – это такой особый способ кодирования данных, который как раз призван обеспечить быстрое и беспроблемное считывание данных машиной? Все алгоритмы декодирования баркодов «разжёваны» до самых мелочей. Задача декодирования баркодов отлично решается без использования каких-либо нейронных сетей и прочих «страшилок» нашего века. Кажется, что технология распознавания баркодов – это тот «космодром», с которого должны взлетать в счастливое будущее большое количество opensource-библиотек.
Оказывается, дело обстоит не совсем так. Первый звоночек о «негодности» всего бесплатного для решения задачи распознавания баркодов мы получили в виде очередного запроса от давнего клиента – одного коммерческого банка (из топ-10), технологичности которого могут позавидовать многие. Коллеги продемонстрировали, что популярные бесплатные библиотеки категорически не справляются даже с QR-кодами. Про коды типа AZTEC даже говорить не приходится (этот вид баркодов, который встречается на платежках, визуально похож на QR-код, но при этом кардинально отличается от него по сложности декодирования).
Мы немного погрузились в задачу и очень быстро поняли, что практически все библиотеки «сдали свои позиции» на полпути, еще не дойдя даже непосредственно до распознавания. Ведь наибольшую трудность в задаче представляют точная локализация и ориентация распознаваемого штрихкода. На первый взгляд кажется, что задача должна решиться «в два счета», так как у многих штрихкодов в структуре присутствуют специальные черно-белые квадратные «мишени» для локализации. Но мы-то с вами знаем, что задача цветовой константности, решение которой как раз и позволяет понять, какие объекты каким образом окрашены, совсем непроста. Да и мишени, кстати, не всегда черно-белые и даже не всегда квадратные (дизайнерские решения, эксплуатирующие разные цвета и форму, очень мешают задаче распознавания баркода).
![](https://habrastorage.org/getpro/habr/upload_files/7b2/bd2/1fd/7b2bd21fd274186f29226cd1c10d98f0.png)
Чтобы окончательно проникнуться сложностью задачи распознавания штрихкодов, представьте, какие артефакты возникают при движении камеры, фотографировании в темноте со вспышкой, пересъемке штрихкода с монитора, попытке распознать заламинированный штрихкод. А еще представьте, как выглядит штрихкод с огромным количеством данных внутри (можно даже не представлять, а просто взять квитанцию оплаты, например, за детский садик).
![](https://habrastorage.org/getpro/habr/upload_files/cc0/f39/886/cc0f398861ab6fc0bc47698c32911d60.png)
Кстати говоря, мы уже провели первый этап исследований задачи поиска штрихкода на изображении. Ознакомиться с нашими статьями в 2020 году по тематике можно здесь и здесь.
Есть еще одна причина, почему мы не остались в стороне от решения проблемы распознавания штрихкодов. В нашей стране семимильными шагами развивается технология оплаты по QR-кодам (в подтверждение моих слов смотрите, например, материал на vc.ru здесь, здесь и здесь). Будучи участниками Глобального договора ООН и ярыми приверженцами ответственного ИИ, мы просто не могли допустить, чтобы рынок не оценил всех преимуществ оплаты по QR из-за фактической неспособности имеющихся бесплатных библиотек распознавания. И не будем забывать про набирающую обороты «Систему маркировки и прослеживаемости товаров». Все это натолкнуло нас на создание модуля распознавания штрихкодов Smart Code Engine.
Чтобы проверить эффективность получившегося решения, мы самостоятельно создали небольшой набор фотографий QR-кодов. Единственное требование – фотографировать баркоды необходимо так, как это делают обычные пользователи. Ниже приводим примеры изображений из нашего датасета.
![](https://habrastorage.org/getpro/habr/upload_files/bc6/450/5c1/bc64505c1e37cdd1cf9c88b602addf26.png)
Как видите, изображения далеки от идеальных. Мы сравнили качество работы Smart Code Engine с двумя популярными opensource-решениями: OpenCV 4.5.1 (библиотека компьютерного зрения с открытым исходным кодом, которую часто применяют при создании системы с ИИ) и Zxing (библиотека с открытым исходным кодом для распознавания баркодов). В таблице ниже представлены результаты:
Продукт | Smart Code Engine | OpenCV 4.5.1 | Zxing |
Качество распознавания | 99% | 56% | 81% |
Как трактовать эти числа? Достаточно просто:
OpenCV серьезно проигрывает Zxing по качеству декодирования;
Smart Code Engine обеспечивает в 19 раз меньше ошибок, чем Zxing (с OpenCV даже и смысла сравнивать нет).
Возникает вопрос: «А на чем ошибаются рассмотренные системы?» Проведем анализ ошибок только для Smart Code Engine и Zxing. Ниже представлено единственное изображение, на котором ошиблось Smart Code Engine.
![](https://habrastorage.org/getpro/habr/upload_files/2cb/8e4/1db/2cb8e41db79af6257492e99d1271e056.jpg)
Действительно, непростой случай для систем машинного зрения (блики, геометрические искажения, сложный фон). Что же, будем работать дальше и повышать качество распознавания. Кстати, ZXing тоже не справился с этим изображением.
А вот несколько примеров, на чем ошибается ZXing. Тоже не самые простые случаи (серьезные проективные искажения, высокая плотность, сложный фон).
![](https://habrastorage.org/getpro/habr/upload_files/f98/516/fdf/f98516fdf6c5a44659fdda689ce6b8ca.png)
На сегодняшний день Smart Code Engine обеспечивает качественное распознавание одно- и двумерных штрих-кодов из различных счетов и квитанций, включая счета за коммунальные и государственные услуги, налоговых документов и счетов, а также билетов, чеков, счетов-фактур, ценников, плакатов и объявлений. Модуль чтения QR-кодов способен читать инвертированные коды, а также устойчив к любой ориентации. Текущая версия Smart Code Engine поддерживает распознавание QR Code, AZTEC, PDF 417, Data Matrix, codabar, CODE_39, CODE_93, CODE_128, EAN_8, EAN_13, ITF, UPC_A, UPC_E.
Smart Code Engine уже внедрен в мобильные приложения Тинькофф Банка, Рокетбанка, СДМ-Банка, Банка «Санкт-Петербург». Мы уверены, это только начало.