Зачем нужна еще одна система распознавания баркода?

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

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

    Сегодня не будем углубляться в техническую часть, а рассмотрим существующие проблемы при внедрении технологии распознавания баркодов. Действительно, откуда могут возникнуть проблемы, если штрихкодирование – это такой особый способ кодирования данных, который как раз призван обеспечить быстрое и беспроблемное считывание данных машиной? Все алгоритмы декодирования баркодов «разжёваны» до самых мелочей. Задача декодирования баркодов отлично решается без использования каких-либо нейронных сетей и прочих «страшилок» нашего века. Кажется, что технология распознавания баркодов – это тот «космодром», с которого должны взлетать в счастливое будущее большое количество opensource-библиотек.

    Оказывается, дело обстоит не совсем так. Первый звоночек о «негодности» всего бесплатного для решения задачи распознавания баркодов мы получили в виде очередного запроса от давнего клиента – одного коммерческого банка (из топ-10), технологичности которого могут позавидовать многие. Коллеги продемонстрировали, что популярные бесплатные библиотеки категорически не справляются даже с QR-кодами. Про коды типа AZTEC даже говорить не приходится (этот вид баркодов, который встречается на платежках, визуально похож на QR-код, но при этом кардинально отличается от него по сложности декодирования).

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

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

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

    Есть еще одна причина, почему мы не остались в стороне от решения проблемы распознавания штрихкодов. В нашей стране семимильными шагами развивается технология оплаты по QR-кодам (в подтверждение моих слов смотрите, например, материал на vc.ru здесьздесь и здесь). Будучи участниками Глобального договора ООН и ярыми приверженцами ответственного ИИ, мы просто не могли допустить, чтобы рынок не оценил всех преимуществ оплаты по QR из-за фактической неспособности имеющихся бесплатных библиотек распознавания. И не будем забывать про набирающую обороты «Систему маркировки и прослеживаемости товаров». Все это натолкнуло нас на создание модуля распознавания штрихкодов Smart Code Engine.

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

    Как видите, изображения далеки от идеальных. Мы сравнили качество работы 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.

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

    А вот несколько примеров, на чем ошибается ZXing. Тоже не самые простые случаи (серьезные проективные искажения, высокая плотность, сложный фон).

    На сегодняшний день 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 уже внедрен в мобильные приложения Тинькофф Банка, Рокетбанка, СДМ-Банка, Банка «Санкт-Петербург». Мы уверены, это только начало.

    Smart Engines
    Обработка изображений, распознавание в видеопотоке

    Comments 15

      0

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


      Зы opencv не стоит рассматривать как систему, это же конструктор и результат зависит в первую очередь от того что из этого конструктора соберут

        0
        У нас в тестовом датасете изображения с разрешением не меньше 1Мпикс с разных телефонов.
          0

          Согласен. И я не понимаю, какое двуногое животное не может увеличить куркод на ЖКХ квитанции.

          +3
          Использовать для оценки работы софта распознавания статичные кадры плохая идея. Потому что пользователи не фотографируют код, чтобы потом его загрузить в программу, а реалтайм наводят камеру до сработки считывания. А значит, все варианты «мелкий код под кривым углом» уже не релевантные — человек просто поднесёт телефон ближе к коду.
          А вот что могло бы существенно улучшить «экспириенс», так это скан кода не по одному фото, а с учётом прошлых кадров видеоряда. Например, код под глянцевой наклейкой или голограммой, когда в любой момент времени половина кода не видна. Тогда на основании других кадров можно было бы построить в памяти полную карту кода и распознать его.

          Ну и не могли бы объяснить, почему сравнение точности «99% vs 81%» стало «в 19 раз меньше»?.. Отдаёт маркетологической чушью.
            0
            1. Все наши продукты умеют распознавать видеопоток в режиме реального времени. Не исключение и Smart Code Engine.
            2. В данном случае мы сравнивали качество работы разных систем распознавания на отдельных кадрах.
            3. Теперь насчет качества и количества ошибок. Из таблицы видно, что Smart Code Engine ошибается на 1% изображений, а Zxing — на 19% изображений.
              0
              1) Вы распознаёте видеопоток именно как поток, или просто как серию кадров, каждый из которых распознаётся отдельно?
              2) Но это же лишено практического смысла.
              3) То есть всё-таки маркетинговая чушь, ведь «на 22% точнее» звучит гораздо менее пафосно. Ещё можете выкинуть из подборки картинку, на которой была единственная ошибка, и впечатлять инвесторов и лохов в сети «в бесконечно раз меньше ошибок».

              Судя по тому, что 1% это одна ошибка, а 19% — 19 ошибок, то вы собрали ровно 100 картинок. Это ничтожно мало для оценки системы, а очень сильно смахивает на «мы отобрали те семплы, где наша система не ошибается, а конкуренты ошибаются». Если бы речь шла о «мы спарсили 100к фото кодов из интернета», то (не смотря на ошибочность концепции такого теста) это было бы уже что-то.
                0

                Тут все очень просто. Мы собрали небольшой датасет и оценили своё решение и два известных открытых. Кроме того, наш движок, хоть на миллиарде фото из интернета, можете самостоятельно испытать, просто скачав мобильное приложение — https://apps.apple.com/ru/app/smart-idreader/id1157877082

                  +1
                  Погодите, вы на этой жалкой выборке из 100 фото вручную проверяли?..
                  Это как продавать авто, сделав тест только на 100 метрах тестового полигона, который заранее с мылом вымыли.
                  Вопросов нет, смысла общаться дальше тоже.
                    0

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

            +4
            Я не разбираюсь в теме мобильного зрения.
            Когда потребовалось считать QR код просто подрубил.
            implementation «com.google.firebase:firebase-ml-vision:24.0.3»
            implementation 'com.google.firebase:firebase-ml-vision-barcode-model:16.1.1'
            Это бесплатно и работает локально.

            Вопрос почему Вы сравниваете свой продукт (стоимость лицензии по запросу) не с коммерческими решениями на рынке, а с опенсорсом?

              0

              У них b2b, как вы представляете, мы ваши конкуренты, дайте демку для тестов? Конечно с опенсорсом сравнение, с самыми популярными решениями. Только недавно тут обсуждали куркоды нечитаемые мобильными приложениями банков для оплаты ЖКХ квитанций.
              К тому же, решения у конкурентов могут быть такие же по качеству по сравнению с опенсорсом. Сравниваться с конкурентами некорректно, кто поверит в непредвзятость? если стоит выбор платной либы — в любом случае тест нужно делать самостоятельно. Как иначе то?

              0
              У меня несколько самописных внедрённых проекта на Xamarin с распознаванием штрих-кодов. В промышленных масштабах камера смартфона нужна чуть реже, чем никогда. Скорость работы не идёт ни в какое сравнение со сканером по блютус или, как в одном из проектов, встроенным в ТСД сканером. Так что энтерпрайз отпадает. Не только из-за скорости. И да, на всякий случай, у меня во всех приложениях есть кнопка сканирования камерой (ZXing использую).
              Приложения для конечных пользователей. Тут вам выше уже написали два замечания.
              Первое, сложно найти кейс, когда распознавание идёт по фото. Распознают видеопоток. Так что, ваши 19% попугаев преимущества, нивелируются движением смартфона и практически незаметно для конечного пользователя. Либо распознаётся, либо нет.
              Второе, ваше решение платное, непонятно сколько стоит и как решать проблемы, которые возникнут, если нет привычного гитхаб комьюнити — непонятно. Нет, вы конечно можете обещать всестороннюю поддержку после покупки решения, но, бесплатного ничего не бывает. Если вы берёте на себя обязательства, значит они должны быть компенсированы стоимостью. Что тоже не добавляет желания воспользоваться ради мифических (а иначе, на основании ваших тестов, и не скажешь) 19% более лучших механизмов распознавания. Зачем? Если ZXing открыт и там тысячи людей делятся опытом и советами.

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

                Тут недавно обсуждали, что разные банки по разному читают плотно набитые куркоды ЖКХ квитанций, а вы про звёздочек на гитхабе у опенсорса.

                –1
                1. Наша библиотека работает на 99 попугаев, тогда как две другие — на 81 и 56. (что за попугаи — не раскрыто).
                2. Наша библиотека «ошиблась» (не распознала? распознала неправильно? что-то третье? — нет ответа) на вот такой картинке. Другая — вот ещё на этих нескольких.
                3. «Покупайте наших слонов».

                Я ничего значимого не упустил в этом реферате статьи?
                  0

                  Нет данных по ложноположительным срабатываниям, когда баркод прочитан, но прочитан неверно (вы приводите только варианты, когда код просто не считался). Да, такие ситуации встречаются, нарывался. Может быть ваша система менее надежна, а ZXing просто более строгий?


                  Опять же, вы показали примеры "дизайнерских" баркодов, но не сказали, как с ними справляется ваша разработка?


                  Про малую выборку и неактуальность упоминания OpenCV уже указали.


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

                  Only users with full accounts can post comments. Log in, please.