Зміст
Оператор ультразвукового контролю товщини (УЗТ) заповнює паперовий чернетку від руки: дата, прилад, зони, сітка замірів у міліметрах. На типовому аркуші порядку трьохсот полів, більшість — рукописні цифри. Помилка в десятих частках потрапляє в облікову систему підприємства (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, розмір еталонного набору й калібрування порогів — і це нормально казати вголос.
Головний урок практики простий: краще жовте поле на перевірку, ніж тиха помилка в міліметрах.


