ОГРН 1027735006991
ИНН 7735115890
1993-2024 © Компания Арсис. Все права защищены
Разработка программного обеспечения на заказ
Одно из самых частых действий, выполняемых на складе – это сканирование штрихкодов. Сканируются как линейные, так и 2D штрихкоды. От того, как быстро и точно выполняется сканирование в составе программного обеспечения склада, зависит общая производительность работников на складе.
С одной стороны, давно существуют готовые промышленные решения – защищенные мобильные терминалы ТСД со встроенными аппаратными считывателями штрихкодов (2D imager). С другой стороны, сейчас все большее распространение получают нейронные сети. Одна из самых частых задач применения нейронных сетей – это обработка графической информации и распознавание объектов на ней, в том числе штрихкодов. Появляются новые библиотеки, которые вполне способны решать подобные задачи.
С развитием нейронных сетей и появлением готовых библиотек безальтернативность использования промышленных терминалов на складе ставится под сомнение. Библиотека с интегрированной обученной моделью нейронных сетей, установленная на обычный смартфон с хорошей камерой, позволяет выполнять работу не хуже. Это позволяет отказаться от дорогостоящих, громоздких, дефицитных и медленных промышленных ТСД и использовать на складе относительно недорогие смартфоны массового сегмента в защищенном чехле. Причем за цену одного промышленного терминала можно купить 5 смартфонов или больше.
Перед нами была поставлена задача, в контексте системы складского учета WMS реализовать быстрое и точное распознавание группы штрихкодов различного типа при помощи камеры на смартфоне. Распознавание должно выполняться реальном времени с отрисовкой динамики сканирования поверх видеопотока с камеры смартфона. Пользователь должен получать обратную связь в реальном времени.
Требования:
1. Нужна поддержка основных типов линейных штрихкодов и 2D штрихкодов таких как:
2. Распознавание бирок от производителя с определенными типами и количеством штрихкодов на борту.
3. Поддержка регулярных выражений для отсеивания ненужных баркодов, не подлежащих распознаванию.
4. Обеспечение максимальной точности распознавания без ошибок
5. Версия Android 10+
Задача была решена — был разработан native модуль под Android с минимальной версией SDK 29 на Java. Модуль был интегрирован в React-native приложение складского учета.
Модуль обеспечивает сканирование штрихкодов напрямую с видеопотока камеры в реальном времени, с динамической отрисовкой графической информации поверх видеопотока:
Таким образом модуль делает процесс сканирования штрихкодов интерактивным и интуитивным и предоставляет пользователю обратную связь о том, какие штрихкоды и в каком количестве уже отсканированы, а какие нет. Стимулирует пользователя поднести камеру ближе, если разрешения изображения недостаточно для точного распознавания. Цвет рамок вокруг баркодов различается в зависимости от того был ли уже распознан баркод или нет. Если баркод был считан первый раз, то происходит отрисовка прямоугольной рамки зеленого цвета, иначе выводится серая. Так пользователь получает обратную связь от модуля и более оптимально наводит камеру на бирку. Если бирка достаточно большая (бывают бирки размером А4), то пользователь должен вести камерой по столбцам со штрихкодами и видеть, что он уже отсканировал, а что нет.
Также были добавлены звуковые сигналы. Сделана автоматическая активация подсветки камеры.
После испытаний в модуль была добавлена защита от ошибок сканирования штрихкодов формата Code-128, так как нейронная сеть иногда выдавала искаженные данные. Каждый штрихкод сканируется дважды и каждый раз проверяется, достаточно ли разрешение изображения штрихкода в пикселях по ширине, чтобы достоверно его распознать. Несмотря на двойное сканирование, скорость распознавания остается достаточно высокой и позволяет распознавать десятки штрихкодов в секунду.
Был проведен анализ существующих библиотек или SDK под Android для распознавания баркодов
В результате был выбран ML-Kit SDK как наиболее перспективный вариант, к тому же бесплатный.
ML Kit — это мобильный SDK от Google на базе обученных моделей нейронных сетей, которые могут быть загружены на устройство и использоваться offline в режиме реального времени.
ML-Kit реализует следующие элементы машинного зрения:
Также ML-Kit содержит API естественного языка:
ML Kit обрабатывает все данные на мобильном устройстве. В отличие от других решений, которые отправляют данные на сервер, где обрабатывают их и возвращают результат приложению, в котором результаты используются. Таким образом ML Kit имеет следующие преимущества:
Google ML Kit использует тренированные ML модели по умолчанию. Это натренированные модели, которые покрывают различные сценарии применения и достаточны для большинства случаев. Также ML Kit предоставляет возможность в случае необходимости натренировать собственную модель, которая нацелена на специфические сценарии использования.
В том случае, если стандартные модели по какой-то причине не подходят, пользователь может использовать натренированную модель TensorFlow Lite, которая уже опубликована через хаб TensorFlow или даже натренировать собственную модель TensorFlow Lite, которая отвечает предъявляемым требованиям.
Преимущества использования пользовательской модели классификации изображений с 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 автоматически определяет тип каждого распознанного баркода, желательно в настройках сканнера указать только те типы, которые ожидаются. Это ускорит распознавание и отзывчивость.
Структурные данные
Для 2D баркодов извлекаются структурные данные, такие как URL, номера телефонов, e-mail, информацию о подключении к WiFi и другие данные.
Ориентация
Штрихкоды распознаются в любой ориентации камеры.
Автономность
Распознавание баркодов работает полностью на устройстве и не требует подключения к сети.
Ограничения
Не распознаются баркоды следующих форматов:
Также API распознает не более 10 баркодов на один фрейм оверлея камеры.
Модель распространяется в двух вариантах:
Этот способ позволяет уменьшить исходный размер приложения, но обладает меньшей автономностью.
Нами был выбран второй вариант.
Для этого в app/build.gradle надо указать зависимость:
dependencies {
// ...
// Use this dependency to bundle the model with your app
implementation 'com.google.mlkit:barcode-scanning:17.0.3'
}
Если вы знаете какие форматы баркодов ожидаются, то вы можете повысить скорость распознавания, настроив BarcodeScannerOptions. Например, если ожидаемые типы баркодов Code128 и QR-code, то создайте объект настроек как показано на примере:
val options = BarcodeScannerOptions.Builder()
.setBarcodeFormats(
Barcode.FORMAT_QR_CODE,
Barcode.FORMAT_CODE_128)
.build()
Поддерживаются следующие форматы:
В случае успешного распознавания баркодов в событие 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 есть следующие полезные свойства:
Для того, чтобы получить непосредственно данные, закодированные в баркоде, необходимо вызвать один из методов:
Для Code128 рекомендуется использовать метод getDisplayValue().
При первом запуске необходимо выполнить настройку модуля таким образом, чтобы получить оптимальные результаты распознавания. В режиме распознавания нажать на шестеренку, чтобы открыть параметры:
Рис 7.1 Настройки камеры для модуля распознавания баркодов.
Рекомендуется оставить все параметры, связанные с камерой по умолчанию и в auto и изменять их только в том случае, если получены неудовлетворительные результаты распознавания.
Самое главное, что необходимо настроить, это разрешение камеры. Рекомендуется устанавливать Preview size не выше Full HD: 1920 x 1080. Также необходимо выбрать такое разрешение, чтобы соотношение сторон соответствовало соотношению сторон мобильного устройства. Таким образом будет задействован весь экран смартфона.
Рис 7.2 Выбор разрешения preview size.
Далее можно приступать непосредственно к сканированию.
Модуль умеет распознавать отдельные баркоды разных типов. Например EAN13.
Рис 7.3 сканирование EAN13.
Также модуль предназначен для распознавания сложных бирок, на которых закодирована полная информация о товаре, нанесенная на коробку с товаром от производителя. В коробке находится определенное количество единиц товара.
Бирка содержит:
Если на бирке от производителя есть 2D баркод, то удобнее и быстрее отсканировать его.
Рис 7.4 Сканирование 2D баркода, содержащего серийные номера.
В противном случае приходится сканировать серийные номера раздельно.
Каждый серийный номер сканируется по два раза и выделяется на экране. Если серийный номер отсканирован первый раз, то он будет выделен зеленым прямоугольником без заливки. При повторном сканировании серийный номер выделяется зеленым прямоугольником с зеленой заливкой. Все последующие разы – серый прямоугольник, чтобы показать пользователю, где уже просканировано.
Рис 7.5 сканирование раздельных серийных номеров.
В процессе реализации и тестирования работы модуля выяснилось, что нейронная сеть от Google не принимает во внимание контрольную сумму для Code-128. Данные возвращаются уже очищенными от служебных символов, но контрольная сумма не проверяется. В отличие от, например, EAN13. При недостаточной освещенности или при сканировании баркодов издалека, когда не хватало разрешающей способности в пикселях для точного распознавания баркодов, нейронная сеть иногда генерировала мусор. Примерно 1 из 70-100 распознанных баркодов был ошибочным.
Ситуация усугублялась, если бирка от производителя, пусть и напечатанная типографским способом, была с баркодами малого размера, тогда вероятность возникновения ошибки сильно повышалась.
Если к этому добавить обычный полумрак складских помещений, то приходим к пониманию сложности поставленной задачи.
Для решения проблемы с искажениями был предпринят комплекс мер:
В том случае, если на бирке есть 2D баркод, то результат всегда точный. Так как у 2D баркодов есть контроль ошибок.
Формулы определения достаточности разрешения изображения баркода для распознавания
Как мера повышения точности распознавания были применены формулы расчета достаточности ширины изображения баркода в пикселях для распознавания:
В соответствии с формулами:
Code128C (только цифры): P = (11 * N) + 66
Code128A,B (цифры и буквы): P = (22 * N) + 66
Где N – это количество символов данных, закодированных в баркоде.
По формулам определяется, достаточно ли близко подвели камеру телефона для распознавания конкретного баркода или нет. Если нет, то такой результат распознавания не выделяется на превью камеры и отбрасывается как ошибочный.
В результате получилось достигнуть необходимой точности распознавания без искажений. При этом скорость тоже была на высоте. За менее чем 10 секунд можно было распознать бирку на 50-100 раздельных линейных штрихкодов. Это очень хороший результат. Конечно, скорость распознавания напрямую зависит от процессора на смартфоне. Чем быстрее процессор, тем быстрее идет распознавание.
Модуль сканирования конфигурируется и запускается из внешнего React-native приложения. Задается специальная конфигурация-программа сканирования, по которой выполняется сканирование до тех пор, пока нужное количество и типы баркодов не отсканированы. Данные, полученные в результате сканирования, возвращаются в React-native приложение.
Был реализован специальный фильтр данных баркодов, приходящих от ML Kit. Не каждый баркод принимается на выход. Фильтр, в зависимости от внешних настроек модуля, может распознать либо одиночный баркод одного из перечисленных типов, с опциональной проверкой по регулярным выражениям, так и выполнить сканирование определенного набора баркодов различных типов в режиме бирки, с отбрасыванием дублей сканирования.
Так как на бирке от производителя может быть много дополнительных баркодов, которые не должны попасть в итоговую выборку, то для определения корректного набора серийных номеров применяется сопоставление по близости:
Таким образом на выход из модуля попадают только нужные баркоды. Каждый баркод отсканирован дважды и выполнена проверка, что ширина баркода в пикселях достаточна для уверенного распознавания без искажений.
Если у Вас возник вопрос или Вы хотите связаться для расчёта проекта, оставьте заявку или свяжитесь с нами. Будем рады сотрудничеству
ОГРН 1027735006991
ИНН 7735115890
1993-2024 © Компания Арсис. Все права защищены
Выберите планируемый бюджет на разработку, руб: