← Все кейсы

Маркировка кирпича

Штрихкод, который должен пережить печь

Год
2023
Тип
Маркировка и идентификация
Материал
Кирпич
Формат
R&D
Технологии
ML / Computer Vision
Чтение
4 мин
Два обожжённых кирпича с кодом RM4SCC на лицевой грани

В 2023 году мы исследовали, можно ли маркировать каждый кирпич прямо в глине: выдавить код на сырой заготовке на линии формовки, провести его через сушку и обжиг и прочитать камерой обычного телефона. Исследование закончилось обоснованным отказом от внедрения — и это тоже результат.

Задача

Заказчику нужна была поштучная маркировка кирпича без наклеек: оттиск в самой глине, пока заготовка ещё мягкая.

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

В успехе идеи сомневались многие. Исследование всё же провели: решение должно опираться на результаты испытаний, а не на прогнозы.

Первая проба: Code128

Начали со стандартного линейного кода Code128. Его накатывали валиком на сырой брус прямо на линии, печатали эталоны в разных масштабах и закладывали поправку на усадку.

Лист с эталонами Code128 в разных масштабах рядом с кирпичом
Эталоны: 1:1, 2:1, с усадкой 4 мм, с исправлением 2 мм
Сырые и обожжённые кирпичи с линейным кодом
Слева сырые, справа после обжига
Срез сырого бруса с оттиском кода
Оттиск на сыром брусе
Кирпич с линейным кодом в штабеле
Кирпич с кодом в штабеле
Накатка на линии
Брус после накатки

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

Выбор формата: RM4SCC

Следующим шагом стал подбор формата. Мы сравнили около сотни способов кодирования по двум требованиям:

  • как можно больший запас на исправление ошибок — после сушки код сильно деформируется;
  • надёжное считывание при низком контрасте, тенях и загрязнении.

Лучше всего подошёл RM4SCC — почтовый код Royal Mail, которым сортируют письма.

Схема · деформация штриховСлева Code128: до обжига штрихи узкие и широкие, после деформации ширины расплываются, и код не прочитать. Справа RM4SCC: после деформации ширина тоже плывёт, но штрихи по-прежнему видно вверху, внизу и в середине, и символы читаются.Схема · деформация штриховCode128: смысл в ширинеRM4SCC: смысл в высоте и положениив формепосле сушки и обжигав формепосле сушки и обжигаузкий или широкий?не прочитатьверх · середина · низчитается: «3», «0»Штрихи иллюстративные: это не настоящий код.
Почему Code128 не пережил деформацию, а RM4SCC пережил

Каждый символ в нём состоит из четырёх штрихов. Штрихи различаются только высотой и положением относительно средней линии: короткий по центру, вверх, вниз или во всю высоту. Ширина штрихов и расстояния между ними данных не несут, поэтому деформация глины на смысл кода не влияет.

Схема · символ RM4SCCЧетыре вида штриха RM4SCC: трекер, верхний, нижний, полный. Символ «3» состоит из штрихов: нижний, трекер, верхний, полный — вверх уходят ровно два и вниз ровно два. Если один штрих не читается, а остальные три — нижний, верхний, полный, то вверх и вниз уже ушло по два, значит пропущен трекер.Схема · символ RM4SCCЧетыре вида штрихаСимвол = 4 штрихаОдин штрих не читаетсяSтрекерAверхнийDнижнийLполныйDSAL3вверх — ровно 2 из 4вниз — ровно 2 из 4?вверх уже 2 → верха нетвниз уже 2 → низа нетзначит, это трекер
Устройство символа RM4SCC и восстановление нечитаемого штриха
Схема · символы RM4SCCВсе 36 знаков RM4SCC — цифры 0–9 и буквы A–Z — сеткой 6 на 6, у каждого четыре штриха на средней линии. Строка таблицы задаёт, какие штрихи уходят вверх, столбец — какие вниз. Штрихи: S — короткий, A — вверх, D — вниз, L — во всю высоту. Код начинается штрихом вверх и заканчивается полным штрихом.Схема · символы RM4SCC0SSLL1SDAL2SDLA3DSAL4DSLA5DDAA6SADL7SLSL8SLDA9DASLADADABDLSACSALDDSLADESLLSFDAADGDALSHDLASIASDLJADSLKADDALLSSLMLSDANLDSAOASLDPADADQADLSRLSADSLSLSTLDASUAADDVALSDWALDSXLASDYLADSZLLSSS — короткийA — вверхD — внизL — полныйстартстоп
Таблица символов RM4SCC

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

Прототип на линии

Код наносили так же, как Code128: валик с рельефом прокатывается по сырому брусу.

Чёрный валик с рельефом кода
Валик с рельефом кода
Валик на линии формовки рядом с глиняным брусом
Валик на линии формовки

Из печи кирпич выходил с налётом, трещинами и грязью на поверхности — с этим предстояло справляться распознаванию.

Распознавание

Для RM4SCC мы последовательно проверили три модели:

  1. Первая выделяла каждый символ своим цветом, чтобы разбить код на четвёрки штрихов. Этот подход не заработал.
  2. Вторая читала код целиком: на входе снимок, на выходе строка символов.
  3. Третья работала на уровне штрихов: определяла тип каждого штриха, CTC сводил результаты в строку, а символы собирались по четыре штриха.

Модели обучали на синтетических данных: код на текстурах кирпича и камня со сдвигами, наклоном и искажениями формы.

Синтетические символы RM4SCC на разных текстурах кирпича и камня
Синтетика на разных текстурах
Сетка входов второй модели: снимки кода и их метки
Вторая модель: входы и метки символов
Восемь синтетических кодов: распознанная строка совпадает с эталоном
Вторая модель на синтетике: распознано / эталон
Схема · CRNN + CTCИзображение кода делится на 16 столбцов. CNN считает признаки каждого квадрата, столбец сводится в вектор, BiLSTM читает векторы в обе стороны, для каждого столбца выбирается вероятный класс: A, D, S, L или пустой знак. CTC склеивает повторы и убирает пустые знаки, получается DSALSSLL; по четыре штриха это символы 3 и 0.Схема · CRNN + CTC01 Входполоса с кодом02 CNNпризнаки квадратов03 Столбец → вектор04 BiLSTMчитает в обе стороны05 Вероятностикласс × столбец06 Лучший классв каждом столбце07 CTCсклеить повторы08 CTCубрать «–»09 По 4 штрихасимвол по таблицеCNN→←ADSL–DDS–AAL–S–S–L–L–DS–AL–S–S–L–L–DSALSSLLD S A L →3S S L L →0= «30»A — вверх · D — вниз · S — трекер · L — полный · «–» — пустой знак CTC
Как CRNN раскладывает изображение кода

Последний символ кода RM4SCC — контрольный: он вычисляется из всех остальных и показывает, верно ли прочитан код. Мы использовали его и для восстановления повреждённых кодов. Если символ не распознавался, CTC ставил на его место метку [UNK], и позиция пропуска была известна точно — ради этого и понадобился CTC. Затем на это место перебором подставлялись допустимые символы с проверкой контрольного: при совпадении код считался восстановленным.

Схема · контрольный символКод на кирпиче: стартовый штрих, содержание 3 0 A 4, контрольный символ Q, стоповый штрих. Q получается из сумм номеров строк (5) и столбцов (15) символов в таблице RM4SCC по модулю 6: строка 5, столбец 3. Если символ A не прочитан, на его месте [UNK]; перебор символов от 0 до F показывает, что контрольный сходится только для A.Схема · контрольный символКод на кирпичестартстоп30A4QсодержаниеконтрольныйОткуда Q30A4суммаmod 6строка (верх штрихов)столбец (низ штрихов)1121415551553строка 5, столбец 3 →QОстаток 0 считается как 6.распознано30[UNK]4Q← контрольный прочитанперебор0123456789ABCDEFпроверка30A4Qсошёлся только для «A»CTC отмечает нечитаемый символ как [UNK] — позиция пропуска известна точно.Перебираются только символы, которые встречаются в коде.
Откуда берётся контрольный символ и как он восстанавливает код

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

Распознавание: общий вид кирпича, приближение с выравниванием, этапы обработки, найденные штрихи
Отладочный вывод декодера: штрихи разложены на верх, низ и середину
Декодер раскладывает штрихи на верх, низ и середину

Так выглядело считывание камерой телефона:

Считывание кода на кирпиче
Сканер распознал код на кирпиче
Код распознан

Результаты

Исследование подтвердило:

  • линейный Code128 для оттиска в глине не подходит: деформация разрушает данные, записанные шириной штрихов;
  • RM4SCC, где данные записаны высотой и положением штрихов, проходит сушку и обжиг и читается камерой телефона;
  • надёжнее всего работает связка «модель находит маркировку — алгоритм нормализует и декодирует»; контрольный символ позволяет восстанавливать повреждённые коды.

Решение заказчика

В производство поштучная маркировка не пошла. Заказчик выбрал обычное этикетирование партий: на каждую партию — наклейка с кодом DataMatrix. Работа осталась исследовательским проектом.

Паллета кирпича с этикеткой партии
Этикетка партии на паллете
Кирпичи с этикетками разных партий
Этикетки разных партий

Highload.Zone · R&D

У каждой проблемы есть решение?

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

hello@highload.zone