Разработка программного обеспечения на заказ

пн-пт с 09:00 до 18:00

Нейросеть на службе склада: быстрое и точное распознавание штрихкодов современными методами

Одно из самых частых действий, выполняемых на складе – это сканирование штрихкодов. Сканируются как линейные, так и 2D штрихкоды. От того, как быстро и точно выполняется сканирование в составе программного обеспечения склада, зависит общая производительность работников на складе.  

С одной стороны, давно существуют готовые промышленные решения – защищенные мобильные терминалы ТСД со встроенными аппаратными считывателями штрихкодов (2D imager). С другой стороны, сейчас все большее распространение получают нейронные сети. Одна из самых частых задач применения нейронных сетей – это обработка графической информации и распознавание объектов на ней, в том числе штрихкодов. Появляются новые библиотеки, которые вполне способны решать подобные задачи.  

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

Постановка задачи 

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

Требования:
 1. Нужна поддержка основных типов линейных штрихкодов и 2D штрихкодов таких как:

    • Code128
    • EAN8, EAN13
    • QR-Code
    • PDF417 

    2. Распознавание бирок от производителя с определенными типами и количеством штрихкодов на борту. 

    3. Поддержка регулярных выражений для отсеивания ненужных баркодов, не подлежащих распознаванию.  

    4. Обеспечение максимальной точности распознавания без ошибок 

    5. Версия Android 10+ 

    Что было реализовано 

    Задача была решена — был разработан native модуль под Android с минимальной версией SDK 29 на Java. Модуль был интегрирован в React-native приложение складского учета. 

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

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

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

    Также были добавлены звуковые сигналы. Сделана автоматическая активация подсветки камеры. 

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

    Выбор подходящего SDK 

    Был проведен анализ существующих библиотек или SDK под Android для распознавания баркодов 

        • Библиотека ZXing, ZBar и их производные 

        • Различные платные библиотеки 

        • Firebase ML-Kit SDK от Google 

    В результате был выбран ML-Kit SDK как наиболее перспективный вариант, к тому же бесплатный. 

    Что такое ML Kit SDK 

    ML Kit — это мобильный SDK от Google на базе обученных моделей нейронных сетей, которые могут быть загружены на устройство и использоваться offline в режиме реального времени.  

    Состав ML Kit 

    ML-Kit реализует следующие элементы машинного зрения: 

        1. Распознавание штрихкодов 

        1. Распознавание лиц на изображении 

        1. Построение уникальной сети лица 

        1. Распознавание текста 

        1. Маркировка изображений (определение объектов и создание текстовой подписи) 

        1. Обнаружение и отслеживание объектов 

        1. Распознавание цифровых чернил 

        1. Распознавание позы человека 

        1. Сегментация селфи 

    Также ML-Kit содержит API естественного языка: 

        • Идентификация языка 

        • Перевод 

        • Умный ответ 

        • Извлечение сущности 

    Преимущества ML Kit по сравнению с облачными решениями 

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

        • Отзывчивость 

        • Обработка данных в реальном времени без каких-либо задержек передачи данных 

        • Возможность работать Offline 

        • Работая непосредственно на устройстве, исключаются влияние сетевого соединения и пропускной способности 

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

    Модели нейронных сетей и ML Kit 

    Google ML Kit использует тренированные ML модели по умолчанию. Это натренированные модели, которые покрывают различные сценарии применения и достаточны для большинства случаев. Также ML Kit предоставляет возможность в случае необходимости натренировать собственную модель, которая нацелена на специфические сценарии использования.  

    Кастомизация моделей для ML Kit 

    В том случае, если стандартные модели по какой-то причине не подходят, пользователь может использовать натренированную модель TensorFlow Lite, которая уже опубликована через хаб TensorFlow или даже натренировать собственную модель TensorFlow Lite, которая отвечает предъявляемым требованиям. 

    Преимущества использования собственных моделей в ML Kit 

    Преимущества использования пользовательской модели классификации изображений с ML Kit: 

    Простые в использовании высокоуровневые API-интерфейсы  

    Нет необходимости иметь дело с низкоуровневым вводом/выводом модели, обрабатывать изображения до и после обработки или создавать конвейер обработки. 

    Не нужно беспокоиться о сопоставлении меток самостоятельно   

    ML Kit извлекает метки из метаданных модели TFLite и выполняет сопоставление за вас. 

    Поддерживает пользовательские модели из самых разных источников 

    От предварительно обученных моделей, опубликованных в TensorFlow Hub, до новых моделей, обученных с помощью TensorFlow, AutoML Vision Edge или TensorFlow Lite Model Maker. 

    Поддерживает модели, размещенные с помощью Firebase  

    Уменьшает размер APK, загружая модели по запросу. Отправляйте обновления модели без повторной публикации приложения и выполняйте простое A/B-тестирование с помощью Firebase Remote Config. 

    Оптимизирован для интеграции с Android Camera API. 

    И, специально для обнаружения и отслеживания объектов: 

        • Повысьте точность классификации, обнаружив сначала объекты и запустив классификатор только в соответствующей области изображения. 

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

    Распознавание штрихкодов в ML Kit 

    Форматы 

    ML Kit умеет распознавать следующие типы штрихкодов: 

        • Линейные штрихкоды: Codabar, Code 39, Code 93, Code 128, EAN-8, EAN-13, ITF, UPC-A, UPC-E 

        • 2D форматы: Aztec, Data Matrix, PDF417, QR Code 

    Определение типа баркода 

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

    Структурные данные 

    Для 2D баркодов извлекаются структурные данные, такие как URL, номера телефонов, e-mail, информацию о подключении к WiFi и другие данные. 

    Ориентация 

    Штрихкоды распознаются в любой ориентации камеры. 

    Автономность 

    Распознавание баркодов работает полностью на устройстве и не требует подключения к сети.  

    Ограничения 

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

        • Одномерные баркоды с одним символом 

        • Штрих-коды в формате ITF с менее чем шестью символами 

        • Штрих-коды, закодированные с помощью FNC2, FNC3 или FNC4 

        • QR-коды, сгенерированные в режиме ECI 

    Также API распознает не более 10 баркодов на один фрейм оверлея камеры. 

    Использование API ML Kit 

    1. Загрузка модели 

    Модель распространяется в двух вариантах: 

        • Раздельно — модель динамически загружается через сервисы Google Play. Требует наличие интернета при первом запуске приложения. 

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

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

    Нами был выбран второй вариант.  

    Для этого в app/build.gradle надо указать зависимость:

    dependencies { 
      // ... 
      // Use this dependency to bundle the model with your app 
      implementation 'com.google.mlkit:barcode-scanning:17.0.3' 
    }  

    2. Рекомендации по улучшению качества распознавания в реальном времени 

        • Чтобы ML Kit хорошо распознавал баркоды, входящее изображение должно содержать достаточное количество пикселей.  
          Конкретное количество пикселей зависит как от типа баркода, так и от количества данных, что в нем закодировано, так как многие форматы баркодов поддерживают переменную длину данных. Как правило, минимальная единица линейного баркода должна иметь ширину не менее двух пикселей, а для двухмерных баркодов 2 пикселя в высоту. 

        • Плохая фокусировка изображения ухудшает качество распознавания или вообще не дает никакого результата.  

        • Не захватывайте входные данные с исходным разрешением камеры. Современные телефоны обладают большим разрешением 10+ мегапиксилей изображения, что приведет к большим задержкам без повышения точности. Рекомендуется использовать изображения не более 2 мегапиксилей. 

        • Для обычных приложений рекомендуется выставлять разрешение камеры 1280 x 720 или 1920 x 1080, что позволяет захватывать штрихкоды с достаточно большего расстояния камеры. Однако при увеличении разрешения камеры распознавание замедляется. Так что следует соблюдать баланс между скоростью и точностью распознавания. Так же следует стимулировать пользователя подносить камеру достаточно близко. 

        • Для Camera API рекомендуется использовать формат захвата изображения камеры: ImageFormat.NV21. Для Camera2 API — ImageFormat.YUV_420_888 

        • Если вы хотите выводить графическую информацию поверх захвата камеры – сначала получите результат от ML Kit, затем выполните визуализацию изображения и наложите за один шаг. 

    3. Настройка сканера штрихкодов 

    Если вы знаете какие форматы баркодов ожидаются, то вы можете повысить скорость распознавания, настроив BarcodeScannerOptions. Например, если ожидаемые типы баркодов Code128 и QR-code, то создайте объект настроек как показано на примере: 

    val options = BarcodeScannerOptions.Builder() 
            .setBarcodeFormats( 
                    Barcode.FORMAT_QR_CODE, 
                    Barcode.FORMAT_CODE_128) 
            .build() 

    Поддерживаются следующие форматы: 

        • Code 128 (FORMAT_CODE_128) 

        • Code 39 (FORMAT_CODE_39) 

        • Code 93 (FORMAT_CODE_93) 

        • Codabar (FORMAT_CODABAR) 

        • EAN-13 (FORMAT_EAN_13) 

        • EAN-8 (FORMAT_EAN_8) 

        • ITF (FORMAT_ITF) 

        • UPC-A (FORMAT_UPC_A) 

        • UPC-E (FORMAT_UPC_E) 

        • QR Code (FORMAT_QR_CODE) 

        • PDF417 (FORMAT_PDF417) 

        • Aztec (FORMAT_AZTEC) 

        • Data Matrix (FORMAT_DATA_MATRIX) 

    4. Обработка результатов распознавания 

    В случае успешного распознавания баркодов в событие onSuccess возвращается коллекция объектов Barcode: 

    Task<List<Barcode>> result = scanner.process(image) 
            .addOnSuccessListener(new OnSuccessListener<List<Barcode>>() { 
                @Override 
                public void onSuccess(List<Barcode> barcodes) { 
                    // Task completed successfully 
                    // ... 
                } 
            }) 
            .addOnFailureListener(new OnFailureListener() { 
                @Override 
                public void onFailure(@NonNull Exception e) { 
                    // Task failed with an exception 
                    // ... 
                } 
            }); 

    У объекта Barcode есть следующие полезные свойства: 

        • BarcodeFormat – распознанный формат баркода 

        • BarcodeValueType – распознанный тип содержимого баркода (например TYPE_TEXT или TYPE_URL) 

    Для того, чтобы получить непосредственно данные, закодированные в баркоде, необходимо вызвать один из методов: 

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

        • getRawValue() – возвращает значение точно таким, как оно закодировано в баркоде 

        • getDisplayValue() – возвращает значение для пользователя, отчищенное от лишних символов 

    Для Code128 рекомендуется использовать метод getDisplayValue(). 

    Как работает модуль распознавания штрихкодов 

    Первоначальные настройки 

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

    Рис 7.1 Настройки камеры для модуля распознавания баркодов. 

    Рекомендуется оставить все параметры, связанные с камерой по умолчанию и в auto и изменять их только в том случае, если получены неудовлетворительные результаты распознавания. 

    Самое главное, что необходимо настроить, это разрешение камеры. Рекомендуется устанавливать Preview size не выше Full HD: 1920 x 1080. Также необходимо выбрать такое разрешение, чтобы соотношение сторон соответствовало соотношению сторон мобильного устройства. Таким образом будет задействован весь экран смартфона.  

    Рис 7.2 Выбор разрешения preview size. 

    Далее можно приступать непосредственно к сканированию. 

    Примеры работы модуля распознавания 

    Модуль умеет распознавать отдельные баркоды разных типов. Например EAN13. 

    Рис 7.3 сканирование EAN13. 

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

    Бирка содержит:  

        • Опционально 2D баркод, где закодированы серийные номера в формате PDF417 или QR-code.  

        • Набор серийных номеров в виде раздельных штрихкодов Code-128 

        • Уникальный код контейнера как штрихкод Code-128. 

    Если на бирке от производителя есть 2D баркод, то удобнее и быстрее отсканировать его.

    Рис 7.4 Сканирование 2D баркода, содержащего серийные номера. 

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

    Каждый серийный номер сканируется по два раза и выделяется на экране. Если серийный номер отсканирован первый раз, то он будет выделен зеленым прямоугольником без заливки. При повторном сканировании серийный номер выделяется зеленым прямоугольником с зеленой заливкой. Все последующие разы – серый прямоугольник, чтобы показать пользователю, где уже просканировано. 

    Рис 7.5 сканирование раздельных серийных номеров. 

    Сложности, с которыми пришлось столкнуться и пути решения 

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

    В процессе реализации и тестирования работы модуля выяснилось, что нейронная сеть от Google не принимает во внимание контрольную сумму для Code-128. Данные возвращаются уже очищенными от служебных символов, но контрольная сумма не проверяется. В отличие от, например, EAN13. При недостаточной освещенности или при сканировании баркодов издалека, когда не хватало разрешающей способности в пикселях для точного распознавания баркодов, нейронная сеть иногда генерировала мусор. Примерно 1 из 70-100 распознанных баркодов был ошибочным. 

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

    Если к этому добавить обычный полумрак складских помещений, то приходим к пониманию сложности поставленной задачи. 

    Для решения проблемы с искажениями был предпринят комплекс мер: 

        1. Повторное сканирование каждого штрихкода типа Code128 

        1. Применены формулы расчета достаточности разрешения изображения баркода для распознавания 

        1. Добавлена возможность настраивать камеру (разрешение, focus mode, scene mode, white balance, brightness) 

        1. Графическое отображение процесса сканирования и стимулирование пользователя поднести камеру ближе.  

        1. Автоматическая активация вспышки камеры телефона в качестве подсветки 

    В том случае, если на бирке есть 2D баркод, то результат всегда точный. Так как у 2D баркодов есть контроль ошибок. 

    Формулы определения достаточности разрешения изображения баркода для распознавания 

    Как мера повышения точности распознавания были применены формулы расчета достаточности ширины изображения баркода в пикселях для распознавания

    В соответствии с формулами: 

    Code128C (только цифры):      P = (11 * N) + 66    

    Code128A,B (цифры и буквы): P = (22 * N) + 66 

    Где N – это количество символов данных, закодированных в баркоде. 

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

    В результате получилось достигнуть необходимой точности распознавания без искажений. При этом скорость тоже была на высоте. За менее чем 10 секунд можно было распознать бирку на 50-100 раздельных линейных штрихкодов. Это очень хороший результат. Конечно, скорость распознавания напрямую зависит от процессора на смартфоне. Чем быстрее процессор, тем быстрее идет распознавание. 

    Конфигурация сканирования и отбрасывание ненужных штрихкодов 

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

    Был реализован специальный фильтр данных баркодов, приходящих от ML Kit. Не каждый баркод принимается на выход. Фильтр, в зависимости от внешних настроек модуля, может распознать либо одиночный баркод одного из перечисленных типов, с опциональной проверкой по регулярным выражениям, так и выполнить сканирование определенного набора баркодов различных типов в режиме бирки, с отбрасыванием дублей сканирования.  

    Так как на бирке от производителя может быть много дополнительных баркодов, которые не должны попасть в итоговую выборку, то для определения корректного набора серийных номеров применяется сопоставление по близости: 

        • Длина в символах 

        • Набор символов: только цифры или цифры и буквы и дополнительные символы / и — 

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

    Что можно реализовать в дальнейшем для улучшения модуля 

        1. Добавить в модуль возможность распознавания текста, а не только баркодов, так как некоторые сложные бирки содержат обычный текст, не закодированный в виде штрихкодов. ML-Kit позволяет считывать текст в реальном времени. 

        1. В модуле использована устаревшая реализация Android камеры (Camera), в дальнейшем необходимо перевести на CameraX, так как в Android 13 ограничена поддержка Camera1. Основной функционал работает, но количество настроек камеры ограничено.

    Консультация

    Если у Вас возник вопрос или Вы хотите связаться для расчёта проекта, оставьте заявку или свяжитесь с нами. Будем рады сотрудничеству

    Расскажите нашему ведущему IT-специалисту задачи, которые стоят перед Вами, мы подготовим самые эффективные пути решения.

    Выберите планируемый бюджет на разработку, руб:

    Политики конфиденциальности