Содержание
На полевой фотографии бланка ультразвукового контроля толщины (УЗТ) модель распознавания ещё не видит «цифру». Она видит стол, рукав, блик, пластиковый уголок, косую сетку и чужую тень. Пока лист не вырезан, не выровнен и не разрезан на клетки, любая сеть — компактная или облачная — отвечает на неправильный вопрос.
В пилоте компьютерного зрения (CV, Computer Vision) разрезка листа — отдельный продуктный контур, а не «препроцессинг на пять строк». Ниже — как устроена геометрия в нашем пайплайне и какие ещё приёмы разрезать бланки встречаются вокруг. Это продолжение серии про распознавание бланков, не энциклопедия OpenCV и не обещание готового цеха. Репозиторий закрытый; публичный контур — на странице портфолио. Сырых бланков заказчика нет.
Системный контур «геометрия → чтение → человек» — в «почему одной модели мало». Что делаем с уже вырезанной клеткой замера — в компактной CRNN, пустых клетках и цикле качества. Общий чеклист «сначала геометрия» для рукописных цифр — в пути от свёртки до трансформера. Здесь — средний слой: как именно режем лист.
Ключевые выводы
Плохой кроп убивает хороший OCR. Ошибка на десятой доли толщины часто рождается не в алфавите сети, а в том, что в кадр попала линия сетки или обрезана запятая.
Мы режем классической геометрией, не «документным ИИ». Морфология, проекции, аккуратная перспектива, известный шаблон на 23 колонки. Без SIFT-гомографии и без детектора страницы «из коробки» как первого шага.
Перспективу нельзя включать всегда. На плоских сканах и коротких последних страницах принудительный warp ломает колонтитул и шапку сильнее, чем помогает.
Карта клеток — контракт для всего контура. Координаты, запас под колонтитул, сдвиг стартовой колонки сетки, локальные полосы по колонкам при остаточном перекосе.
Другие приёмы разрезки не «хуже» — они под другой вход. Равные ROI, шаблон с ключевыми точками, нейросетевой четырёхугольник страницы, детекторы таблиц, сегментация клеток — каждый закрывает свой класс съёмки и цену ошибки.
Качество кропа — продуктовые ворота. Пока человек не подтвердил обрезку в редакторе эталонов, лист не должен тихо уезжать в обучение и в учётную систему предприятия (ERP).
Почему разрезка листа — отдельная цена ошибки
Оператор снимает черновик телефоном у объекта. Кадр почти никогда не «как в лаборатории»: угол, складка файла, тёмный стол, блик лампы. Если вырезать «примерно таблицу» и отдать облачной модели зрения, она часто всё равно что-то прочитает. Вопрос — куда это чтение попадёт.
В учёте толщины ложная цифра дороже пустой клетки. Пустую можно вернуть человеку. Тихая подмена 12,3 на 12,8 уходит в контур целостности. Поэтому в пилоте сначала строим карту клеток: где бумага, где таблица, где строка, где колонка, где запас под «Страница X из Y». Только потом — чернила, повтор, зачёркивание, замерная голова.
Тот же порядок «структура → смысл» уже знаком из загрузки документов в RAG. Домен другой, дисциплина та же: нельзя отдавать вниз по контуру то, что геометрия ещё не зафиксировала.
Как устроен пайплайн в пилоте
flowchart TB
photo[Phone_photo]
photo --> upright[Upright_and_EXIF]
upright --> persp[Gated_perspective]
persp --> deskew[Deskew]
deskew --> trim[Paper_and_margin_trim]
trim --> regions[Regions]
regions --> grid[Row_and_column_grid]
grid --> crops[Cell_crops]
crops --> review[Crop_QA_gate]
После ориентации идёт осторожная перспектива, мелкий поворот по линиям Гоу, выравнивание контраста, обрезка полей бумаги. Затем зоны шапки и таблицы, горизонтали и вертикали сетки, полосы строк, 23 колонки, кропы. Колонтитул с номером страницы читаем отдельно и склеиваем логические многостраничные бланки уже после CV.
Ориентацию выбираем не «по EXIF веры ради». Пробуем четыре поворота и скорим: ключевые слова шапки должны быть сверху, «страниц» — снизу, QR — в верхней половине, горизонтальная сетка — сильной. Телефон часто отдаёт кадр боком; без этого шага вся дальнейшая геометрия ищет таблицу там, где её нет.
На выходе — не «красивая картинка», а каталог прямоугольников плюс флаги качества. Редактор эталонов держит вкладку обрезки: лист с кривой геометрией остаётся в черновике, пока человек не подтвердил карту клеток.
Морфология и проекции: чем мы режем таблицу
Известный бланк — главное преимущество. Мы не ищем «таблицу вообще в мире документов». Мы ищем эту сетку: адаптивный порог, морфологическое открытие длинными горизонтальными и вертикальными ядрами, маска линий.
По маске считаем одномерные проекции: сколько «чернил сетки» в каждом столбце и строке пикселей. Пики проекции — кандидаты в линии. Близкие пики сливаем. Между горизонталями собираем полосы строк данных, печатный подзаголовок а, б, в, г отбрасываем, слишком высокие полосы делим. Для колонок нужны рёбра под 23 поля: девять метаданных, затем блоки замеров I–III по четыре клетки и узкая IV. Если вертикалей слишком много или мало — падаем на равномерную сетку, но защищаем зону раздела доступности, чтобы не съехать на колонку.
Когда глобальная сетка всё ещё косит после перспективы, для замерных колонок берём локальные горизонтали внутри полосы колонки. Иначе нижняя запятая или хвост цифры остаются за нижней границей общего ряда.
Отдельно живёт сдвиг стартовой колонки сетки: если чернила секции I систематически попадают не в ожидаемый индекс, двигаем начало сетки на одну колонку. Это эвристика под живые фото, не теорема. Но без неё половина замеров читается из чужой клетки.
Ещё один практический слой — обрезка полей самой бумаги до таблицы. По яркости строк и столбцов отделяем светлый лист от тёмного стола. Ищем длинную внешнюю горизонталь рамки бланка, чтобы не срезать дату и исполнителя на первой странице. Если сверху видна полоска файла с овальными «дырками» крепления, её срезаем отдельно: иначе шапка уезжает вместе с пластиком. Снизу оставляем запас под колонтитул даже когда таблица короткая — иначе логика «Страница X из Y» теряет опору.
Всё это выглядит как много эвристик — потому что так и есть. Прозрачность важнее магии: каждый порог можно показать на картинке проекции и объяснить оператору, почему клетка уехала. Когда эвристика не сходится, лист не «угадываем», а отправляем на вкладку обрезки.
Почему перспективу включаем не всегда
Классический совет «всегда выравнивай четырёхугольник страницы» на наших бланках ломается. Мы ищем четырёхугольник по контуру сетки, расширяем его вверх под шапку и вниз под колонтитул, пробуем warpPerspective в ландшафтный аспект. Применяем только если после пробы растёт число читаемых линий сетки и метрики «трапеции» выглядят как реальный keystone, а не как шум.
Плоский скан планшета часто уже достаточно ровный: принудительный warp сжимает колонтитул и рвёт шапку. Короткая последняя страница, где таблица занимает мало высоты, тоже опасна: алгоритм может «натянуть» пустой низ. Пластиковый уголок файла с овальными отверстиями даёт ложную верхнюю границу — его нужно срезать отдельно, иначе дата и исполнитель уезжают вместе с полоской файла.
Мелкий поворот после перспективы делаем по медианному углу почти горизонтальных отрезков Гоу. Слишком малый угол игнорируем, слишком большой не доверяем: лучше оставить лёгкий перекос локальным полосам, чем завернуть лист на десять градусов по ложной линии.
Другие распространённые приёмы разрезки листов
Ниже — не рейтинг «лучше/хуже», а карта, когда какой приём уместен рядом с нашим.
Равные ROI и ручная сетка
В лаборатории лист кладут в рамку, светят ровно, снимают сверху. Тогда достаточно зафиксировать прямоугольники зон один раз и резать по долям ширины и высоты. Дешево, воспроизводимо, почти не ломается. На полевом телефоне равные доли быстро едут: угол в два градуса уже сдвигает правый нижний блок на чужие цифры.
Когда уместно: контролируемая съёмка, один шаблон, дисциплина оператора со штативом или рамкой.
Сопоставление с шаблоном и гомография по ключевым точкам
Берут эталонный скан бланка, ищут особенности (ORB, SIFT и аналоги), строят гомографию на живое фото, переносят заранее размеченные ROI. Сильная сторона — перенос богатой разметки. Слабая — блики, мятый угол, рука оператора, отсутствие «текстурных» якорей на пустых полях. На наших плотных сетках линии иногда дают стабильные точки, иногда — ложные соответствия по повторяющемуся узору таблицы.
Когда уместно: стабильная печать шаблона, мало деформаций бумаги, можно вложить разметку эталона.
Нейросетевой четырёхугольник страницы
Детекторы вроде семейства DocTr и похожих моделей предсказывают углы документа на фото. Хорошо снимают «документ на столе» в общем случае. Для УЗТ-бланка страница — ещё не таблица: внутри нужны шапка, QR, легенда, сетка, колонтитул. Четырёхугольник бумаги — только первый кадр; без второй стадии разрезки клеток вы получаете красиво выровненный, но всё ещё цельный лист для OCR.
Когда уместно: сильный keystone, разношерстные документы, нет жёсткого шаблона таблицы.
Детекторы таблиц и строк
Отдельный класс моделей ищет таблицы, строки, ячейки как объекты: каскады, YOLO-подобные головы, трансформеры таблиц. Они сильны на бухгалтерских PDF и веб-снимках. На рукописной промышленной сетке с карандашными линиями и дырами файла часто спотыкаются: «ячейка» для детектора — не то же самое, что инженерная клетка замера с запасом под запятую.
Когда уместно: печатные таблицы с чёткими правилами, слабая зависимость от точного числа колонок.
Семантическая или инстанс-сегментация клеток
Пиксельная маска «это клетка / это линия / это фон» звучит заманчиво. Цена — разметка и поддержка. Для одного известного бланка часто дешевле выжать классическую сетку и эвристики, чем размечать тысячи масок. Сегментация окупается, когда шаблонов много и линии сетки визуально нестабильны.
Когда уместно: парк разных бланков, слабая повторяемость печати линий, бюджет на разметку.
Только линии Гоу без морфологии
Гоу хорошо ловит отдельные отрезки. Без морфологического «вытягивания» сетки на шумном телефоне получается каша коротких штрихов почерка и бликов. Мы используем Гоу точечно — для оценки ориентации и мелкого deskew — а каркас таблицы держим на морфологии и проекциях.
Когда уместно: чистые сканы с длинными непрерывными линиями.
Целый лист в мультимодальную модель
Отдать фото целиком модели «зрение + язык» (VLM, Vision-Language Model) и попросить JSON — самый короткий путь к демо. В пилоте это плохой первый шаг: пустые клетки заглаживаются, геометрия теряется, стоимость растёт с каждым полным кадром. VLM оставляем на вырезанные зоны и спорные места после карты клеток — об этом уже сказано в системной статье серии.
Когда уместно: редкие поля вне сетки, пояснения, арбитраж после геометрии.
Типичные ошибки разрезки
Обрезать по внешнему контуру бумаги и забыть колонтитул. Номер страницы исчезает — многостраничный бланк не склеивается.
Включить перспективу «на всякий случай». Плоский скан становится волной; шапка и подвал страдают первыми.
Резать клетки по глобальным рядам при остаточном перекосе. Нижняя строка правых колонок теряет запятые и хвосты цифр.
Кропать вместе с линией сетки. OCR и классификатор пустоты начинают «видеть чернила» там, где их нет.
Учить замерную сеть на кривых кропах. Дальше цикл качества будет лечить симптомы модели, а не геометрию.
Считать равные доли заменой детекции сетки. На телефоне это лотерея колонок.
Качество кропа как продуктовые ворота
В пилоте есть соблазн считать геометрию «техническим долгом CV» и гнать всё, что хоть как-то похоже на таблицу, в обучение замерной сети. Так мы уже обжигались косвенно: модель честно учится на том, что видит. Если в кадре линия сетки, сеть учится рисовать толщину из линии. Если обрезана запятая, сеть учится целым числам там, где нужны десятые.
Поэтому обрезка вынесена в явный статус. Человек в редакторе эталонов смотрит карту клеток, правит спорные прямоугольники, подтверждает лист. Пока статус обрезки не зелёный, лист не должен становиться «ещё одним батчем» для головы замера и не должен тихо уезжать в выгрузку. Это скучнее, чем новый чекпоинт, и дешевле, чем месяц споров «модель тупая».
Тот же принцип дисциплинирует эксперименты из цикла качества CRNN: прежде чем крутить эпохи и алфавит, убедитесь, что входные кропы из одного геометрического контракта.
Эвристика сдвига стартовой колонки и защита зоны раздела колонок всё ещё тюнятся кейсами. Порог чернил для обрезки и для детектора заполненности расходятся — это долг согласованности. Отдельная сетка под сильно мятый угол файла без перспективы пока слабее, чем хочется. Нейросетевой детектор страницы как опциональный вход перед нашей геометрией не внедрён: сначала измеряем, даёт ли он прирост на коротких последних страницах без потери колонтитула.
Редактор эталонов уже гоняет людей по вкладке обрезки, но автоматический скоринг «кроп достаточно хорош для обучения» ещё не заменяет глаз. Пока лист с плохой геометрией может уехать в обучение, если процесс дисциплины ослабнет.
Что сделать сегодня
- Возьмите десять полевых фото одного шаблона и разметьте глазами: где шапка, таблица, колонтитул, чужой фон.
- Снимите проекции горизонталей и вертикалей после морфологии — сравните с «голым» Гоу на том же кадре.
- Прогоните перспективу с воротами и без: посчитайте, на скольких кадрах пропал колонтитул.
- Зафиксируйте контракт клеток: число колонок, запас под подвал, запрет кропа на линии сетки.
- Не отпускайте кропы в обучение замерной сети, пока нет явного статуса качества обрезки.
- Запишите один провальный кейс (уголок файла, короткая последняя страница, сильный блик) как регрессионный тест, а не как «потом посмотрим».
FAQ
Нужна ли нейросеть, чтобы вырезать известный бланк УЗТ?
Не обязательно как первый шаг. При стабильном шаблоне классическая сетка часто дешевле и прозрачнее. Сеть окупается, когда шаблонов много или линии сетки визуально нестабильны.
Почему не начать с DocTr и не отдать выровненный лист в OCR?
Четырёхугольник страницы не равен карте клеток. Без второй стадии разрезки вы получаете ровный цельный лист и те же проблемы пустых клеток и чужих полей.
Можно ли обойтись равными долями ширины таблицы?
На штативе и ровном свете — иногда да. На полевом телефоне малый угол уже меняет правые колонки. Для замеров толщины это недопустимый риск.
Что важнее: идеальная перспектива или стабильные клетки?
Стабильные клетки. Лёгкий остаточный перекос можно лечить локальными полосами. Сломанный колонтитул и съехавшая колонка лечатся дороже.
Как понять, что кроп виноват, а не модель?
Смотрите кропы с ошибками: линия сетки в кадре, обрезанная запятая, чужая цифра с соседней колонки. Если визуально кроп плохой — чинить геометрию, а не наращивать эпохи.
Где в серии читать про чтение уже вырезанной клетки?
Системный контур — одна модель на весь лист не тянет. Замер — компактная CRNN. Пусто/повтор/зачёркивание — отдельный классификатор. Эксперименты — цикл качества.



Комментарии