Содержание
Оператор ультразвукового контроля толщины (УЗТ) заполняет бумажный черновик от руки: дата, прибор, зоны, сетка замеров в миллиметрах. На типичном листе порядка трёхсот полей, большинство — рукописные цифры. Ошибка в десятых долях уходит в учётную систему предприятия (ERP) и дорого обходится: переделки, споры о толщине стенки, ручной перенос «как увидел на бланке».
В пилоте мы строим другой контур: фотография бланка → структурированный результат с оценкой надёжности по каждому полю → отчёт для человека → только потом выгрузка в ERP. Это не готовая инструкция для промышленной эксплуатации и не обещание «модель сама всё прочитает». Проект в активной разработке; интеграция с ERP вынесена во вторую фазу. Ниже — полевые заметки: что уже работает, где сознательно не доверяем модели и чему это учит команды с похожими промышленными бланками.
Краткий обзор кейса без внутренних деталей — на странице портфолио. Репозиторий закрытый: публикуем архитектуру и уроки, а не сырые формы заказчика.
Ключевые выводы
Одной мультимодальной модели «зрение + язык» (VLM, Vision-Language Model) на весь лист мало. Сначала геометрия, пустые ячейки и вырезанные области — потом чтение.
Локальное компьютерное зрение (CV, Computer Vision) и оптическое распознавание символов (OCR) нужны даже при слабой точности на рукописи. В пилоте этап CV/OCR на рукописных замерах давал порядка 35% точности — этого недостаточно для приёмки, но достаточно, чтобы знать, где таблица, где чернила и куда вешать оценку надёжности.
Несколько проходов vision LLM + проверка второй моделью снижают молчаливые ошибки лучше, чем один «уверенный» ответ.
Оценка надёжности — продукт, а не побочный балл. Веса сигналов, доменные правила и жёсткий запрет статуса ok для неоднозначных десятых ,5 / ,6 / ,7 важнее красивого промпта.
Отчёт для проверки (HTML/CSV) — граница продукта до ERP. Оператор правит сомнительное, а не перебивает весь лист заново.
Эталонный набор и сравнение моделей нужны с первого дня пилота — иначе нельзя честно сравнить «дешёвый» и «дорогой» режим.
Дообучение (TrOCR / CRNN) — опциональный путь, не замена системной архитектуры. Разбор моделей цифр — в отдельной статье «от CNN до TrOCR».
Задача и цена ошибки
Ручной перенос с бумаги в цифровой контур — не «неудобство», а источник систематических ошибок. Почерк разный, бумага мятая, фото с телефона под углом, в ячейке пятно или повторная запись. Бизнес при этом ждёт не «красивый текст с бланка», а поля с контрактом: толщина в диапазоне, дата в формате, тип элемента из словаря, пустая ячейка действительно пустая.
Цена ошибки здесь ближе к промышленной безопасности и к качеству учёта, чем к опечатке в интерфейсе. Поэтому в пилоте мы сразу отказались от схемы «отправили весь JPG в чат с моделью → вставили ответ в ERP». Нужен контур, где сомнительное видно и не принимается молча.
Тот же принцип — «низкая уверенность распознавания не должна тихо попадать дальше» — описан и для корпоративной загрузки документов в RAG. Здесь домен другой (бланк УЗТ, не скан политики в PDF), но дисциплина та же.
Почему не «весь лист в одну VLM»
Кажется естественным: современная модель «зрения» «видит» страницу, зачем резать? На практике целый бланк — плохой вход для промышленного пилота.
На одном листе смешаны печатная шапка, QR-код, полупечатные сведения строк и плотная сетка рукописных замеров. Разные зоны требуют разного внимания: в шапке мало полей, но исполнитель часто неразборчив; в сетке — сотни мелких цифр, где критичны десятые доли (12,3 против 12,8). Одна модель на весь кадр легко «сглаживает» пустые ячейки, путает строки и выдаёт правдоподобный JSON без привязки к геометрии.
Известный шаблон бланка — преимущество. После выравнивания можно найти таблицу, вырезать ячейки и решать узкие подзадачи. Это тот же порядок, что в статье про рукописные цифры: сначала геометрия, потом модель, а не наоборот.
flowchart LR
photo[PhotoForm] --> cv[LocalCV_OCR]
cv --> vlm[MultiPass_VLM]
vlm --> conf[ConfidenceFusion]
conf --> review[OperatorReview]
review --> erp[ERP_Phase2]
Этап CV: геометрия важнее «угадайки»
Первый этап выполняется локально: нормализация фото, коррекция перспективы, QR-код, поиск таблицы, поиск чернил, черновой OCR. Оркестрация на TypeScript, тяжёлая часть компьютерного зрения на Python (PaddleOCR для печатного, EasyOCR как подсказка по рукописи).
Задача этапа — не «победить рукопись», а собрать карту ячеек: координаты, есть ли чернила, предварительный текст, вырезанные фрагменты для следующих шагов. Без этой карты некуда вешать статусы и нечего показывать оператору в отчёте для проверки.
Честная цифра из пилотных замеров: на рукописных замерах один только CV/OCR давал порядка 35% точности. Для приёмки это провал. Для архитектуры — нормальный промежуточный слой. Пустые ячейки и геометрия уже стоят отдельного этапа; «красивую» рукопись закрываем иначе.
Режимы работы в пилоте полезно разделять явно:
| Режим | Когда | Облачная модель | Стоимость |
|---|---|---|---|
| Только CV | Отладка геометрии, офлайн | Нет | $0 |
| Баланс | Типовой прогон | Да, быстрее/дешевле | порядка центов за лист |
| Максимальное качество | Жёсткие требования к правкам | Да, сильнее/дороже | выше |
Цифры по точности и деньгам ниже — из внутренних замеров на эталонном листе пилота; на других бланках картина будет другой, пока эталонный набор мал.
Несколько проходов vision LLM и проверка второй моделью
На втором этапе в облако уходят не «весь лист», а вырезанные области. Три прохода:
- шапка (дата, исполнитель, прибор);
- сведения строк (зона, тип элемента, диаметры, проектная/отбраковочная толщина);
- сетка замеров по секциям.
Для каждой заполненной ячейки замера дополнительно вызывается вторая, независимая модель. Если основная и проверочная модели не согласны — поле не получает «зелёный свет». Рукописный замер без прохода проверки второй моделью в нашей схеме оценки надёжности не может стать ok.
Так мы меняем роль LLM: не единственный источник истины, а один из сигналов в контуре, который обязан спорить сам с собой.
На практике это означает два инженерных следствия. Первое — стоимость и задержка растут пропорционально числу заполненных ячеек, поэтому режим «максимальное качество» нельзя слепо включать на весь архив без бюджета. Второе — промпты и схема ответа должны быть разными для шапки, строк и сетки: один универсальный промпт на весь лист снова тянет к ошибкам, от которых мы ушли через нарезку.
Оценка надёжности как продукт
Итоговая оценка поля — взвешенная сумма сигналов (веса из пилотной модели; в коде нормализуются по присутствующим сигналам):
| Сигнал | Вес (ориентир) | Смысл |
|---|---|---|
| Самооценка основной модели | 0.35 | Насколько модель «уверена» |
| Согласие двух моделей | 0.25 | Основная и проверочная совпали |
| Согласие с OCR | 0.20 | Локальный OCR подтверждает |
| Согласие с поиском чернил | 0.10 | Нет «пусто / не пусто» |
| Доменные правила | 0.10 | Диапазон толщины, формат даты, словарь типов |
| Неоднозначность рукописи | 0.15 | Типичная путаница десятых |
Статусы для оператора (пороги по умолчанию):
| Статус | Оценка | Интерфейс |
|---|---|---|
ok |
≥ 0.85 | без подсветки |
review |
0.60–0.84 | жёлтый |
error |
< 0.60 | красный |
empty |
— | серый |
manual_ok |
после правки | принято человеком |
Доменные правила не менее важны, чем модель: толщина в разумном диапазоне (в пилоте по умолчанию примерно 0.5–80 мм), дата в ожидаемом формате, тип элемента из словаря. Слишком «большое» число после OCR часто оказывается слиянием соседних цифр — такие значения лучше сбросить, чем молча принять.
Жёсткое правило для десятых долей
В кириллической рукописи десятые ,5, ,6 и ,7 часто неотличимы. В пилоте такие значения никогда не получают статус ok автоматически — только review или error, если модели ещё и не согласны. Лучше лишняя жёлтая ячейка, чем тихая ошибка в миллиметрах стенки.
Отчёт для проверки — граница продукта до ERP
На выходе прогона — не только JSON. Файл review.html визуально повторяет бланк с цветовой подсветкой; review.csv удобен для Excel; result.json несёт значение, оценку надёжности, статус и разбор сигналов.
Типичный набор артефактов на одно фото:
| Артефакт | Зачем |
|---|---|
preprocessed.jpg |
Нормализованное изображение |
cv.json |
Карта ячеек и локальный OCR |
result.json |
Итоговые поля и статусы |
review.html / review.csv |
Проверка человеком |
legacy-payload.json |
Заглушка под выгрузку в ERP (фаза 2) |
Смысл простой: система снимает рутинный ввод, а не снимает ответственность. Оператор смотрит жёлтое и красное. Зелёное можно принять быстрее — но пороги калибруются на эталонах, а не «на глаз после демонстрации».
Выгрузка в ERP сознательно отделена. Пока контракт нестабилен, в артефактах лежит заглушка legacy-payload. Смешивать пилот распознавания и контракт учёта в рабочей системе — быстрый способ сломать оба контура.
Отдельно важно не путать роли:
- редактор эталонов — лаборатория качества и разметки;
- интерфейс оператора — рабочий просмотр и правка перед учётом;
- правки из рабочей системы не должны автоматически становиться эталоном без явного перевода в эталонный набор.
Иначе эталонный набор загрязняется, а отчёты по точности перестают быть сравнимыми. Про дисциплину эталонов в другом контуре — оценка эталонных наборов для RAG.
Эталоны, оценка и сравнение моделей
Без эталонной разметки любой разговор о «97%» — маркетинг. В пилоте эталонный набор на момент замеров был маленьким (единицы листов) и расширяется. Это ограничение нужно говорить вслух: цифры ниже — ориентир на конкретном эталонном бланке, не гарантия на всём архиве.
Сравнение режимов на эталонном листе (~313 полей) из внутренних замеров пилота:
| Режим | Точность (ориентир) | Время | Стоимость за лист |
|---|---|---|---|
| Только CV | ~35% | < 1 с | $0 |
| Баланс (быстрая модель «зрения») | ~70% | ~1,5 мин | ~$0,04 |
| Максимальное качество | ~97% | ~3 мин | ~$0,24 |
При ~97% на 313 полях остаётся порядка 8–10 ячеек на ручную правку. При ~70% — порядка 90. Выбор модели — это выбор объёма ручной работы и бюджета API, а не поиск «единственно правильной» нейросети.
По зонам в том же замере: сведения строк давались сильнее всего, сетка замеров — хорошо на лучшей модели, шапка (особенно рукописный исполнитель) — заметно слабее. Архитектура должна это отражать: разные проходы, разные пороги, разные ожидания к отчёту для проверки.
Стек пилота публично можно назвать без деталей заказчика: TypeScript и Python, схема ответа через zod, обработка изображений, локальный OCR, облачные модели «зрения» через совместимый API. Около половины кода оркестрации — TypeScript, около трети — Python. Это важно для команд, которые думают, что «OCR = один скрипт на Python»: промышленный бланк почти всегда превращается в сервис с контрактами, отчётами и оценкой качества.
Что ещё не закрыто
- Интеграция с ERP — фаза 2; контракт выгрузки стабилизируем отдельно от пилота распознавания.
- Калибровка порогов оценки надёжности на большем эталонном наборе.
- Проход проверки второй моделью и стоимость — проверка каждой ячейки второй моделью дороже; нужна экономичная политика (когда проверка обязательна, когда достаточно сигналов).
- Путь дообучения (
TrOCR/ CRNN) — задел есть; это не замена гибридного контура. Практический разбор моделей — в статье про рукописные цифры. - Качество фото — предобработка компенсирует часть углов и теней; сильные блики и мятая бумага всё ещё роняют качество.
Типичные ошибки команд с похожими бланками
Скормить весь лист одной модели и назвать это пилотом. Получите демонстрацию на одном красивом фото и регресс на архиве.
Оценивать только «общую точность». Без разбиения на шапку / строки / сетку / пустые ячейки вы не увидите, где система реально ломается.
Доверять самооценке модели. «Я уверен на 0.92» без согласия второй модели и доменных правил — слабый сигнал.
Автоматически принимать неоднозначные десятые. В промконтроле это дороже, чем лишний клик оператора.
Смешать эталоны, правки из рабочей системы и обучающую выборку. Через месяц нельзя будет объяснить, почему «точность выросла».
Обещать ERP «на следующей неделе», пока нет стабильного JSON и отчёта для проверки. Сначала контракт полей и статусов — потом шина обмена.
Что сделать сегодня
- Зафиксируйте контракт полей бланка и цену ошибки по каждому типу (замер, дата, тип элемента, пусто).
- Соберите мини-эталон (хотя бы несколько реальных фото) и считайте метрики по зонам, не одной цифрой.
- Разделите контур на геометрию → чтение → оценку надёжности → проверку человеком; не пропускайте проверку «потому что модель умная».
- Введите хотя бы одно жёсткое доменное правило (диапазон, формат, запрет автоматического
okна известных путаницах почерка).
Часто задаваемые вопросы
Это уже можно ставить в промышленную эксплуатацию?
Пилот закрывает сценарий «фото → проверяемый структурированный результат». Выгрузка в ERP и широкая калибровка — ещё в работе. Для похожих задач имеет смысл копировать дисциплину контура, а не ждать «готового продукта из статьи».
Почему не обойтись локальным OCR без LLM?
Потому что на рукописной сетке локальный OCR в наших замерах был около 35%. Он полезен для геометрии, чернил и подсказок, но не закрывает приёмку. Гибридный контур дороже по API, зато даёт проверяемый результат.
Зачем вторая модель, если первая уже «хорошая»?
Потому что одна модель ошибается уверенно. Независимое несогласие — дешёвый способ найти кандидатов на ручную проверку до ERP.
Где смотреть публичное описание проекта?
На странице портфолио AI Vision. Исходники и бланки заказчика не публикуются.
Как это связано со статьёй про TrOCR?
Там — путь моделей для рукописных цифр и последовательностей. Здесь — системный кейс бланка УЗТ: оркестрация, оценка надёжности, проверка человеком и цена ошибки. Статьи дополняют друг друга, а не дублируют.
Итог
Стоит ли внимания команде с похожими промышленными бланками? Да — если вы готовы строить контур, а не искать одну магическую модель. В пилоте уже работает связка локального CV/OCR, многопроходной модели «зрения», слияния оценок надёжности и отчёта для оператора. Ещё не закрыты фаза ERP, размер эталонного набора и калибровка порогов — и это нормально говорить вслух.
Главный урок практики простой: лучше жёлтое поле на проверку, чем тихая ошибка в миллиметрах.


