TableNet

TableNet помогает находить таблицы на сканированных страницах, отделять их от остального содержимого, строить маски столбцов и передавать найденные ячейки в OCR, чтобы собрать результат в строки, столбцы и табличный набор данных. Основные инструменты рабочего процесса — предварительная обработка изображения, две ветви сегментации, пороговая обработка масок, поиск геометрии таблицы и столбцов, распознавание текста Tesseract и проверка полученной структуры в DataFrame.

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

Наиболее полезный результат TableNet — не картинка с зелёной рамкой, а координатная модель страницы. Маска таблицы определяет границы нужного блока, маска столбцов задаёт вертикальное разбиение, координаты слов от Tesseract связываются с найденными областями, а правила строк собирают отдельные фрагменты в записи. После этого данные можно очистить в pandas, сохранить в CSV или Excel либо передать в собственный процесс проверки документов.

Скачать TableNet

Оценка 9.7 Рекомендуем
  • Редактирование PDF
  • Русский интерфейс
  • Просто новичкам
Скачать бесплатно на Windows
Лучшая альтернатива
TableNet
Оценка 8.5
  • Нет готового установщика
  • Нужен Tesseract OCR
  • Требуется настройка Python
Скачать TableNet
Загрузка начнётся после нажатия

Как TableNet превращает страницу в таблицу

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

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

После сегментации начинается геометрическая обработка. Карта вероятностей переводится в бинарную маску, мелкие островки и шум удаляются, связные области маркируются, для каждой области вычисляется ограничивающий прямоугольник. Табличные рамки сопоставляются со столбцами, лежащими внутри них. Затем координаты слов, полученные OCR, распределяются по этим прямоугольникам. Именно на этом этапе пиксельное предсказание становится объектами, с которыми можно работать как с ячейками и полями.

Архитектура TableNet с общим кодировщиком и двумя декодерами

Схема показывает не последовательность экранов, а путь данных. Слева находится изображение документа, в центре — блоки VGG-19 от conv1 до pool5, справа — две независимые ветви для таблиц и столбцов. Связи с pool3 и pool4 возвращают более детальные признаки при увеличении карты. Благодаря этому выход не ограничивается грубым прямоугольником размером в несколько ячеек: границы уточняются за счёт признаков более высокого разрешения.

Рабочее пространство и порядок проверки

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

Проверять результат удобнее в фиксированном порядке. Сначала следует убедиться, что страница ориентирована правильно и целиком попала в кадр. Затем оценивают маску таблицы: она должна покрывать табличную область без заголовка страницы, соседней диаграммы и сносок. После этого смотрят маску столбцов и проверяют, не слились ли соседние поля. Только при корректной геометрии имеет смысл анализировать распознанные слова, потому что OCR не исправит неверно вырезанную область.

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

Сопоставление исходной страницы, эталонных и предсказанных масок

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

Подготовка PDF и сканированных страниц

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

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

Цветной скан не обязательно сразу переводить в чёрно-белый. В архитектуре учитываются визуальные признаки, а в режиме с семантической подсветкой цвет используется намеренно. Безопасная схема — сохранить исходный RGB-кадр, отдельно подготовить контрастную копию для OCR и применять бинаризацию только к выходным картам вероятностей. Если таблица напечатана на сером фоне или содержит цветные заливки, ранняя жёсткая бинаризация способна удалить разделители и светлый текст.

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

Исходная сканированная страница с таблицей

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

Масштабирование и нормализация изображения

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

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

Нормализация должна соответствовать подготовке, применявшейся при обучении весов. Для кодировщика, инициализированного признаками ImageNet, обычно используются канальные средние и стандартные отклонения этой выборки. Подмена нормализации делением на 255 без последующего приведения распределения меняет значения активаций. Результат может выглядеть как слишком слабая маска, хотя сама загрузка весов прошла без ошибки.

Контрольный тест прост: сохраните преобразованный кадр непосредственно перед созданием тензора и визуализируйте его после обратной нормализации. Текст должен оставаться читаемым, поля — ожидаемыми, а таблица — находиться в том же месте. Этот шаг выявляет перепутанный порядок каналов, двойное деление на 255, неверную интерпретацию прозрачности и случайное зеркальное отражение.

Маска таблицы: порог, шум и связные области

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

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

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

Бинарная маска области таблицы

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

Для страниц с несколькими таблицами компоненты сортируют по вертикальной координате центра, а при одинаковом уровне — слева направо. Нельзя полагаться на порядок, возвращённый библиотекой маркировки: он зависит от обхода пикселей и может измениться после подготовки изображения. Явная сортировка делает имена выходных файлов и строки журнала воспроизводимыми.

Маска столбцов и восстановление вертикального деления

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

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

Сортировка выполняется по горизонтальной координате. После этого соседним областям присваиваются индексы от нуля или единицы. Для восстановления границ ячеек можно использовать середину промежутка между правым краем одного столбца и левым краем следующего. Если полосы перекрываются, границу задают по центрам или возвращаются к карте вероятностей и ищут минимум между пиками.

Бинарная маска столбцов таблицы

На маске отдельные полосы имеют разную ширину, что соответствует неодинаковым полям исходной таблицы. Разрывы внутри полос появляются из-за многоуровневого заголовка и пустых участков. Замыкание должно соединять части одного столбца по вертикали, но не расширять их настолько, чтобы соседние поля слились. Для числовых таблиц особенно внимательно проверяют узкие столбцы процентов и единиц измерения.

Объединённые ячейки требуют дополнительного правила. Маска столбцов описывает основную сетку, но не сообщает напрямую, что заголовок занимает три поля. Если задача ограничивается выгрузкой значений, заголовок можно сохранить отдельными строками и позже нормализовать. Если нужна точная HTML-структура с colspan, одной пары масок недостаточно: потребуется анализ линий, пересечений и диапазонов текста либо более специализированная модель распознавания структуры.

Поиск прямоугольников таблиц

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

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

Компоненты можно фильтровать по площади, отношению сторон и доле заполнения. Слишком маленький объект обычно является шумом, а очень узкая длинная область может быть линейкой или декоративным разделителем. Однако жёсткие фильтры опасны для небольших двухстрочных таблиц. Надёжнее хранить оценку и отправлять пограничные случаи на ручную проверку, а не молча удалять их.

Найденные прямоугольники таблиц на странице

Рамки на примере охватывают две таблицы и не включают абзацы ниже. Это тот уровень результата, на котором удобно строить контроль качества: число рамок, их площадь, уверенность маски и доля OCR-слов внутри каждого прямоугольника записываются в журнал. Если страница ожидаемо содержит одну таблицу, но найдено две, её можно автоматически пометить для проверки.

Передача областей в Tesseract OCR

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

Для русского текста необходимо установить языковые данные Tesseract и передать код языка, включающий русский. В смешанных русско-английских документах задают оба языка, но следует проверить порядок и влияние на скорость. Цифровые столбцы полезно валидировать регулярными выражениями: OCR часто путает латинскую O с нулём, I с единицей, запятую с точкой и дефис с длинным тире.

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

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

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

Сборка слов в строки и ячейки

После распределения слов по столбцам их нужно объединить в строки. Простое совпадение координаты y работает только на ровном скане и однострочных записях. Обычно сравнивают вертикальные интервалы: слова принадлежат одной строке, если их базовые линии близки или прямоугольники заметно перекрываются по высоте. Допуск задают относительно медианной высоты символов, а не фиксированным числом пикселей.

Для таблиц с горизонтальными линиями промежутки между вертикально соседними словами проверяются на наличие разделителя. В описании метода для поиска горизонтальной линии применяется преобразование Радона. Найденный разделитель однозначно завершает строку. Этот признак полезен даже при многострочном тексте внутри ячейки: внутренние строки описания объединяются, пока не встретится линия сетки.

Если разделителей нет, новая запись может определяться по заполнению полей. Строка с максимальным количеством непустых столбцов считается началом очередной записи, а последующие короткие фрагменты присоединяются к ней. Такой приём подходит для каталожных таблиц, где код, количество и цена занимают одну строку, а описание переносится на две или три.

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

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

Проверка результата в pandas DataFrame

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

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

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

Распознанные значения таблиц в pandas DataFrame

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

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

Архитектура кодировщика и двух декодеров

Кодировщик основан на свёрточных слоях VGG-19 от conv1 до pool5. Полносвязная часть этой сети не используется: после pool5 признаки проходят через свёртки 1×1, которые уменьшают число каналов и подготавливают пиксельную классификацию. За conv6 следует ReLU и dropout с вероятностью 0,8. Высокая доля отключения нейронов служит регуляризацией и заставляет модель меньше зависеть от отдельных каналов признаков.

После общего блока поток разделяется. В ветви таблиц дополнительная свёртка conv7 table формирует признаки крупной активной области. Далее транспонированные свёртки повышают разрешение. На промежуточных уровнях результат объединяется с картами pool4 и pool3. Эти пропуски возвращают информацию о мелких границах, которая теряется после нескольких операций уменьшения размера.

В ветви столбцов применяется отдельная conv7 column с ReLU и dropout, затем conv8 column и последовательность увеличения разрешения с теми же уровнями pool4 и pool3. Хотя декодеры обучаются на разных целях, общий кодировщик получает градиенты от обеих задач. Столбец является частью таблицы, поэтому совместное обучение помогает выделять области, в которых вертикальная регулярность действительно относится к табличной структуре.

Свёртки 1×1 здесь выполняют не пространственный поиск, а смешивают каналы в каждой точке. Перед дорогим увеличением карты они сокращают размерность признаков и формируют оценки классов. Последний слой каждой ветви выдаёт число каналов, соответствующее классам фона и нужной области. По максимальной вероятности или выбранному порогу создаётся маска.

При переносе архитектуры между TensorFlow и PyTorch важно сравнивать не только названия слоёв, но и порядок осей, способ интерполяции и выравнивание при объединении карт. Разница в один пиксель после транспонированной свёртки приводит к несовпадению форм. Разработчики реализаций решают это явным масштабированием, обрезкой или подбором параметров stride и padding. Весовые файлы совместимы только с точно соответствующим определением модели.

Сводка слоёв и обучаемых параметров реализации TableNet

Сводка одной реализации показывает DenseNet-кодировщик и две выходные ветви размером 1×1024×1024. В ней насчитывается 9 116 546 обучаемых параметров. Это пример адаптации идеи, а не основание смешивать любые веса: кодировщик DenseNet имеет другую структуру, чем VGG-19, поэтому файл параметров от одной схемы нельзя загрузить в другую. Перед запуском необходимо сверить класс модели с описанием весов.

Семантическая подсветка текстовых областей

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

Перед извлечением слов в описанном процессе выполняется выравнивание гистограммы. Затем OCR возвращает координаты прямоугольников. Числа, текст и другие базовые категории получают собственные цвета. Области одинакового типа окрашиваются одинаково, после чего подсвеченное изображение попиксельно складывается с исходным. Это сохраняет линии, углы, заливки и другие визуальные признаки, которые исчезли бы на чистой карте цветных прямоугольников.

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

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

Регулярные выражения для типов данных должны соответствовать языку документов. Десятичная запятая, разделитель тысяч пробелом, обозначение процентов, коды с дефисами и даты с точками отличаются от англоязычных шаблонов. Ошибка классификации не обязательно портит OCR-текст, но меняет цветовой признак и может ухудшить сегментацию столбца.

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

Подготовка разметки для обучения

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

Для таблиц размечают всю область, включая заголовок и пустые ячейки, если они относятся к структуре. Для столбцов задают вертикальные области внутри табличного блока. В наборе Marmot имелись рамки таблиц, но не было требуемой структурной разметки, поэтому для 509 англоязычных документов столбцы были размечены отдельно. Расширенный набор позволяет учить обе ветви на одних страницах.

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

Разделение на обучающую и проверочную части выполняют по документам, а не по случайным страницам одного файла. Иначе почти одинаковые шрифты, шаблоны и колонтитулы попадут в обе части, и оценка окажется завышенной. Для форм фиксированного типа разумно дополнительно оставить отдельную группу шаблонов, не встречавшихся при настройке.

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

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

Случайное кадрирование не должно отрезать таблицу без корректировки целевой маски. Если используется квадратный crop 896×896 из более крупного изображения, необходимо решить, допускаются ли частичные таблицы. Для детектора целого блока такие примеры могут научить сеть обрезанным областям. Безопаснее сохранять целую таблицу или явно помечать частичные объекты отдельным правилом.

Настройки обучения и контроль сходимости

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

Эксперимент использовал пакет из двух примеров, 5000 итераций, скорость обучения 0,0001 и Adam с beta1 0,9, beta2 0,999 и epsilon 1e-08. Эти параметры описывают конкретное обучение и не гарантируют оптимум для другого кодировщика, размера изображения или набора данных. При большем пакете эффективная динамика градиента меняется, поэтому скорость обучения проверяют заново.

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

Журнал должен разделять loss_table и loss_column. Если общая величина уменьшается за счёт первой задачи, а вторая стоит на месте, итоговая структура останется слабой. Дополнительно строят IoU или Dice для каждой маски и измеряют качество связанных компонентов. На контрольных страницах сохраняют изображения предсказаний после каждой эпохи или через фиксированный интервал.

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

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

Контроль воспроизводимости включает фиксирование случайных начальных значений, перечня файлов в каждом разделении, параметров аугментаций, размера входа, нормализации и точного определения модели. Одного имени файла весов недостаточно. Вместе с ним сохраняют конфигурацию и контрольную страницу с ожидаемыми масками, чтобы быстро проверить корректность среды.

Оценка качества детекции и структуры

Для детекции таблиц в публикации использовались полнота, точность и F1. Базовая конфигурация показала полноту 0,9501, точность 0,9547 и F1 0,9547. Добавление пространственно-семантических признаков дало 0,9621, 0,9547 и 0,9583. После дополнительной настройки на данных ICDAR значения составили 0,9628, 0,9697 и 0,9662.

Для распознавания структуры и данных базовые показатели равны 0,8987, 0,9215 и 0,9098. Семантические признаки дали 0,8994, 0,9255 и 0,9122, а дополнительная настройка — 0,9001, 0,9307 и 0,9151. Эти цифры относятся к конкретной методике оценки и наборам ICDAR 2013 и Marmot; их нельзя переносить на счета, медицинские формы или русскоязычные отчёты без собственной проверки.

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

В рабочем проекте следует добавить прикладные показатели. Доля найденных таблиц отвечает на вопрос, пропущен ли документ. Точность границ показывает, сколько слов попало в правильный блок. Доля строк с ожидаемым числом столбцов характеризует структуру. Символьная или словесная ошибка OCR измеряет текст. Конечная метрика может считать полностью корректные записи, готовые к загрузке без исправления.

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

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

Пакетная обработка документов

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

Модель загружают один раз на процесс, а не перед каждой страницей. Изображения группируют в пакеты одинакового размера, если хватает памяти. Страницы с резко отличающимися размерами заранее приводят к общей форме. OCR можно выполнять параллельно на CPU, пока GPU обрабатывает следующий пакет, но следует ограничить число потоков, чтобы Tesseract не занял всю память.

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

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

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

Статистика по пакету включает время растеризации, предсказания, OCR и очистки, среднее число таблиц на страницу, долю пустых результатов и число отправленных на проверку. Резкий рост пустых страниц обычно связан с изменением входного формата, поворотом, другой нормализацией или ошибкой загрузки весов.

Форматы входа и выхода

Нейронный этап принимает растровое изображение, обычно PNG или JPEG, после чтения в массив RGB. PNG предпочтителен для чётких сканов и синтетических страниц, поскольку не добавляет блочную компрессию. JPEG экономит место, но сильное сжатие создаёт ореолы вокруг символов и линий. TIFF удобно использовать как промежуточный формат многостраничного сканирования, однако страницы всё равно передаются по одной.

PDF рассматривается как контейнер страниц. Текстовый слой не используется самой сегментацией, но может улучшить извлечение содержимого: если координаты слов доступны напрямую из PDF, их можно сопоставить с рамками вместо повторного OCR. Для чисто растрового PDF требуется Tesseract или другой движок. Смешанный документ разумно обрабатывать единообразно, сохраняя происхождение текста для каждой страницы.

Маски сохраняют в PNG без потерь. Для дальнейшей обработки удобны два вида: карта вероятностей с плавающими значениями и бинарная маска после порога. Первая позволяет подобрать другой порог без повторного запуска сети, вторая подходит для морфологии и визуального контроля. Если карта записывается как восьмибитное изображение, следует сохранить формулу преобразования вероятности.

Геометрию лучше выдавать в JSON: координаты страницы, таблиц, столбцов, слов и строк, уверенности, параметры масштаба и идентификаторы. CSV и Excel предназначены для плоского содержимого и не сохраняют отношения между рамками. HTML может представить объединённые ячейки, но TableNet не всегда восстанавливает colspan и rowspan, поэтому такие атрибуты следует добавлять только после проверки.

DataFrame экспортируется в CSV с явной кодировкой UTF-8 и выбранным разделителем. Для значений с десятичной запятой точка с запятой часто безопаснее запятой. В Excel удобно хранить отдельный лист с данными, лист с предупреждениями и ссылку на номер страницы. Не следует переносить визуальное форматирование скана как доказательство структуры без проверки.

Если результат поступает в базу данных, сначала сохраняют сырой слой, затем очищенный слой. Сырой содержит текст OCR и координаты, очищенный — типизированные поля и исправления. Это позволяет пересчитать правила очистки без повторного распознавания и объяснить каждое изменение оператору.

Интеграция в процесс обработки PDF

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

Для документа с несколькими страницами таблица иногда продолжается на следующем листе. Сегментация обрабатывает страницы независимо, поэтому объединение выполняется после извлечения. Признаками продолжения служат одинаковое число столбцов, близкие относительные границы, повторяющийся заголовок и отсутствие итоговой строки на предыдущей странице. Повторный заголовок удаляют только после точного сравнения нормализованных названий.

Если PDF содержит цифровой текст, полезно извлечь слова и координаты непосредственно из его текстового слоя. Они обычно точнее OCR, но могут иметь необычный порядок чтения или разбиваться на отдельные символы. Координаты переводят в ту же систему, что и рамки TableNet, учитывая начало координат PDF и масштаб растеризации. При несовпадении поворота слова окажутся зеркально смещены по вертикали.

При наличии форм и подписей табличные области следует отделять от остальных полей. TableNet не назначает бизнес-смысл каждому столбцу и не понимает, что одна таблица относится к платежам, а другая — к реквизитам. Идентификацию выполняют по заголовкам, положению, числу колонок и шаблонам значений после OCR.

Для двустороннего контроля рядом с каждой строкой данных можно хранить ссылку на вырезанный фрагмент страницы. Оператор видит исходные значения и не ищет их в полном документе. Координаты фрагмента получают из рамки строки, расширенной на небольшой запас. Сохранение таких фрагментов особенно полезно для строк с низкой уверенностью или нарушением арифметической проверки.

При обработке конфиденциальных документов важно понимать, какие файлы создаёт процесс. Растры страниц, маски и текстовые результаты могут содержать персональные данные. Каталоги временных файлов следует очищать по политике хранения, доступ к журналам ограничивать, а в отладочные изображения не включать страницы без необходимости. Эти меры относятся ко всему конвейеру, а не только к модели.

Русскоязычные и смешанные таблицы

Сегментация не распознаёт алфавит напрямую, поэтому геометрия русскоязычной таблицы может определяться так же, как англоязычной. Основная разница возникает в OCR и семантической подсветке. Кириллические языковые данные Tesseract должны быть доступны, а шаблоны типов — учитывать сокращения, обозначения валют, даты и десятичную запятую.

Для смешанного текста задают несколько языков, но это увеличивает пространство вариантов. В колонке артикулов латинская C и кириллическая С выглядят одинаково, хотя являются разными символами. После OCR полезно нормализовать алфавит по ожидаемому типу поля: код может допускать только латиницу и цифры, а наименование — кириллицу и стандартные знаки.

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

Числа с пробелами требуют сохранения геометрии. OCR может вернуть 1 234 567 тремя словами, и простой пробел при объединении сохранит корректный вид. Но если алгоритм группировки ошибочно принимает каждую часть за отдельную ячейку, структура смещается. Решение — сначала назначить слова столбцу по координате, затем объединять близкие числовые фрагменты внутри одной строки.

Для дат вида 01.08.2026 точки могут восприниматься как шум. Проверка по шаблону позволяет отличить потерянный разделитель от обычной последовательности цифр. Если известен период документа, значение дополнительно проверяют по диапазону. Автоматическое исправление должно сохранять исходную строку и уверенность каждого символа.

Семантическая раскраска для русского набора настраивается отдельно. Категории могут включать целое число, десятичное число, процент, дату, денежное значение, буквенный текст и смешанный код. Чем больше категорий, тем сложнее правила и выше риск неверного цвета. Начинать лучше с нескольких устойчивых типов и добавлять новые только при измеримом улучшении масок.

Типичные ошибки запуска и их устранение

Весы не загружаются

Сообщение о недостающих или лишних ключах означает, что определение модели не совпадает с файлом параметров. Нужно сверить кодировщик, названия декодеров, число выходных каналов и наличие префикса, добавленного обучающей оболочкой. Удалять несовпадающие ключи без анализа опасно: запуск может продолжиться с необученной ветвью и выдать правдоподобную, но бессмысленную маску.

Ошибка формы тензора часто связана с другим размером входа или способом увеличения карты. Следует выполнить пробный проход случайного тензора и вывести формы после каждого блока. До загрузки весов модель должна возвращать две маски ожидаемого размера. Если объединение с pool3 или pool4 не проходит, проверяют padding, stride и округление размера.

Не найден Tesseract

Python-обёртка не включает сам исполняемый файл OCR. Если команда не находится, задают путь к Tesseract в конфигурации либо добавляют каталог программы в переменную PATH. Затем выполняют отдельную проверку на простой картинке и выводят список доступных языков. Ошибку OCR не следует искать в нейронной сети.

Когда английский текст читается, а русский нет, проверяют наличие языкового файла и точный код языка в параметрах. Если файл установлен в нестандартный каталог, задают путь к tessdata. Смешанный код передают в синтаксисе, поддерживаемом Tesseract. После изменения языка повторяют только OCR-этап, сохраняя готовые рамки.

Пустая или почти чёрная маска

Сначала визуализируют распределение вероятностей: минимум, максимум, среднее и несколько процентилей. Если максимум ниже выбранного порога, временно снижают его и проверяют форму активной области. Если все значения близки, возможны неверная нормализация, перепутанные каналы, незагруженные веса или режим обучения вместо режима оценки.

В PyTorch перед предсказанием вызывают eval и отключают вычисление градиентов. Это фиксирует поведение dropout и нормализующих слоёв. Входной тензор переносится на то же устройство, что и модель. После получения результата применяют корректную активацию: sigmoid для независимого бинарного выхода или softmax по каналу классов.

Вся страница становится таблицей

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

Если ошибка возникает только на страницах с рамкой по краю, функция удаления компонентов на границе может вести себя неожиданно. Следует сравнить результат до и после clear_border. Иногда полезно сначала исключить белые поля и только затем маркировать области, сохраняя смещение для обратного пересчёта.

Столбцы сливаются

Снижают размер структурного элемента замыкания, повышают порог или анализируют профиль вероятности по оси x. Между соседними столбцами обычно есть минимум. Если минимум отсутствует на объединённом заголовке, границы ищут по основной части таблицы ниже заголовка. Узкие поля нельзя удалять только по ширине, если они содержат проценты или номера.

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

Строки перемешаны

Компоненты и слова необходимо сортировать явно. Таблицы сортируют сверху вниз, столбцы — слева направо, слова внутри строки — по x. Для строк используют базовую линию или центр по y с допуском. Сортировка только по верхнему краю нестабильна для символов разной высоты.

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

CSV открывается с неправильными символами

Файл сохраняют в UTF-8, а для программ, ожидающих метку порядка байтов, при необходимости выбирают UTF-8 с BOM. Разделитель задают явно. Если десятичная запятая совпадает с разделителем CSV, используют точку с запятой или корректное кавычение полей. Проверку выполняют повторным чтением тем же кодом и сравнением DataFrame.

Ограничения, которые нужно учитывать заранее

TableNet выделяет таблицы и столбцы, но не является полноценным распознавателем всех видов табличной структуры. Объединённые ячейки, вложенные таблицы, диагональные заголовки и сложные многоуровневые шапки требуют дополнительных правил. Маска столбца показывает вертикальную организацию, но не кодирует каждое пересечение строк и столбцов отдельным объектом.

Качество зависит от обучающих шаблонов. Документы с другой типографикой, языком, разрешением и способом сканирования могут давать хуже результат, даже если визуально кажутся человеку простыми. Собственная контрольная выборка обязательна. Несколько красивых демонстрационных страниц не заменяют проверку на случайной выборке из реального потока.

Модель не извлекает текст без OCR или координат из PDF. Даже идеальная маска оставляет задачу распознавания символов, порядка слов и нормализации. Ошибки этих этапов складываются. Поэтому итоговую точность нужно измерять по готовым значениям, а не только по пикселям маски.

Ресурсы существенно зависят от размера изображения и кодировщика. Квадрат 1024×1024 создаёт крупные карты признаков, а две ветви декодирования увеличивают расход памяти. На CPU предсказание возможно, но пакетная обработка будет медленнее. Уменьшение изображения ускоряет работу, однако может разрушить мелкий текст и узкие столбцы.

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

Разные открытые реализации не образуют взаимозаменяемый набор. Одна следует VGG-19 и TensorFlow, другая использует PyTorch Lightning, третья заменяет кодировщик на DenseNet и добавляет демонстрационную форму. Их команды, размеры входа и формат параметров различаются. Документацию и код следует рассматривать как единый комплект.

Нет встроенной бизнес-проверки результата. TableNet не знает допустимые суммы, справочники кодов и связи между строками. Эти правила добавляются после извлечения. Без них уверенно распознанное, но неверное число может пройти в итоговый файл.

Производительность и требования к ресурсам

Основная нагрузка приходится на свёрточное предсказание и OCR. GPU ускоряет нейронную часть, тогда как Tesseract в типичном процессе использует CPU. Баланс зависит от документа: на странице с несколькими плотными таблицами OCR может занять больше времени, чем сегментация. Измерять нужно каждый этап отдельно.

В экспериментальной конфигурации обучение выполнялось на 32-ядерном Intel Xeon Silver, 128 ГБ оперативной памяти и Tesla V100 с 6 ГБ видеопамяти. Это описание исследовательского стенда, а не минимальное требование. Предсказание одной страницы требует меньше ресурсов, однако размер пакета и входа нужно подбирать по доступной памяти.

Если возникает ошибка нехватки видеопамяти, сначала уменьшают batch size до единицы, отключают хранение градиентов и проверяют, что промежуточные тензоры не накапливаются в списке. Затем рассматривают меньший входной размер или смешанную точность, если модель и устройство работают с ней корректно. После оптимизации обязательно сравнивают маски на контрольных страницах.

На CPU полезно ограничить число параллельных процессов. Одновременный запуск нескольких тяжёлых моделей может привести к конкуренции за память и замедлению. Разумнее держать один процесс сегментации и отдельную ограниченную очередь OCR. Для повторных прогонов сохраняют карты вероятностей и не вычисляют сеть заново при изменении только порога.

Время чтения больших PNG иногда заметно. Можно хранить страницы в формате без чрезмерного сжатия или заранее создавать изображения нужного размера. Однако кэш должен быть связан с параметрами растеризации; иначе после изменения DPI процесс случайно использует старые кадры.

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

Сравнение TableNet с аналогами

ПрограммаЛучше подходит дляГлавное ограничение
TableNetИсследовательского конвейера сегментации таблиц и столбцов на сканах с доступом к промежуточным маскамТребует самостоятельной сборки OCR и правил строк
Table TransformerДетекции таблиц и распознавания строк, столбцов и объединённых ячеек моделью объектного обнаруженияДля текста нужен отдельный OCR или текстовый слой PDF
PaddleOCR PP-StructureКомплексного анализа макета, OCR и распознавания таблиц в одном программном конвейереМного моделей и параметров усложняют настройку
CamelotБыстрой выгрузки таблиц из PDF с доступными текстовыми объектами и управляемыми областямиКлассические режимы не читают чистые сканы без предварительного OCR
TabulaРучного выделения области таблицы и экспорта из текстового PDF в CSV или электронную таблицуНе предназначена для страниц без текстового слоя
PDF CommanderРедактирования, сборки, разметки и повседневной обработки PDF без написания кодаНе строит нейронную структуру таблицы для выгрузки данных

TableNet выбирают, когда важны собственное обучение, контроль двух масок и возможность встроить алгоритм в специализированную обработку сканов. Table Transformer лучше описывает более детальные структурные объекты, но также требует отдельного получения текста. PP-Structure удобнее для комплексной автоматизации документов, где нужны макет, OCR и таблицы. Camelot и Tabula быстрее осваиваются на PDF с текстовым слоем. PDF Commander подходит для ручных операций с документом, когда задача состоит в редактировании и организации страниц, а не в программной выгрузке сетки.

Практические сценарии применения

Финансовые отчёты со сканированными таблицами

Страницы растеризуются в едином DPI, TableNet выделяет таблицы и столбцы, Tesseract распознаёт заголовки и числа. После сборки DataFrame денежные значения очищаются от пробелов, скобки переводятся в отрицательный знак, проценты проверяются по диапазону. Итоговые строки сверяются с суммами и помечаются при расхождении.

Особое внимание уделяют многоуровневому заголовку и сноскам. Маска таблицы может захватить примечание под нижней линией. Его отделяют по меньшему размеру текста, отсутствию вертикального соответствия столбцам и положению за границей основной сетки. Удаление выполняют после сохранения исходного фрагмента.

Прайс-листы и каталоги

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

Коды проверяют по допустимому алфавиту и длине. Цена преобразуется только после удаления валютного обозначения и нормализации разделителя. Если в одной строке найдено две цены, страница отправляется на проверку, поскольку причиной может быть акция, старая цена или ошибка деления столбцов.

Статистические сборники

Одна страница может содержать несколько небольших таблиц. Компоненты сортируются по координатам, каждой таблице присваивается номер страницы и порядковый индекс. Заголовок над рамкой можно связать с ближайшей областью по вертикальному расстоянию. При объединении страниц учитывают повторяющиеся названия показателей и годы.

Пустые ячейки имеют смысл и не удаляются. Они могут обозначать отсутствие данных, неприменимость или продолжение группы. Различить эти случаи можно по условным обозначениям документа. OCR-символы тире и многоточия сохраняют до этапа предметной нормализации.

Счета и накладные

TableNet выделяет строковую часть с товарами, но реквизиты вокруг неё обрабатываются другими правилами. Для каждой позиции проверяют количество, цену, ставку налога и сумму. Произведение количества на цену сравнивают с итогом с учётом округления. Несовпадение помогает обнаружить ошибку OCR даже при высокой уверенности символов.

Столбец с длинным наименованием требует многострочной группировки. Горизонтальные линии, если они есть, становятся главным разделителем записей. Если линий нет, начало новой позиции определяется по заполненному номеру или коду товара. Нельзя считать каждую визуальную строку отдельной позицией.

Научные статьи

Таблицы окружены подписями, формулами и ссылками. Маска должна ограничиваться сеткой, а подпись храниться отдельно как метаданные. Математические символы Tesseract распознаёт хуже обычного текста, поэтому для формул может потребоваться специализированный движок. Геометрия TableNet остаётся полезной для вырезания и назначения столбцов.

Объединённые заголовки и сноски со звёздочками требуют ручного или программного постанализа. Для простого CSV допустимо повторить общий заголовок в названиях дочерних столбцов. Для точного воспроизведения структуры нужно определить диапазоны объединения отдельным алгоритмом.

Как построить воспроизводимый процесс

Начните с одной реализации и одного набора весов. Зафиксируйте среду Python, размер входа, нормализацию, активацию, пороги и параметры морфологии. Подготовьте несколько контрольных страниц и сохраните ожидаемые маски, рамки и таблицы. Любое изменение библиотек проверяйте на этом наборе до обработки новых документов.

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

Для координат используйте единый формат прямоугольника и укажите, включается ли правая и нижняя граница. Смешение схем x1, y1, x2, y2 и x, y, width, height создаёт трудно заметные ошибки. При сериализации храните размер исходной страницы и преобразованного кадра.

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

Тесты должны включать пустую страницу, страницу без таблиц, несколько таблиц, таблицу у края, повёрнутый скан, очень узкий столбец и многострочную ячейку. Для каждого случая проверяются не только отсутствие исключения, но и ожидаемое число областей, порядок столбцов и форма выходной матрицы.

При ручном исправлении сохраняйте изменения отдельно от автоматического результата. Исправленная таблица может стать обучающим примером, если одновременно уточнить маски и координаты. Нельзя обучать модель на одной исправленной CSV без связи с изображением: сегментации нужны пиксельные цели.

Контроль перед экспортом данных

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

Страница считается успешно обработанной только при прохождении заданного набора условий. Отсутствие исключения в коде недостаточно. Для одного проекта критерием может быть совпадение итоговой суммы, для другого — заполнение обязательных полей и допустимый формат идентификатора. Условия записываются рядом с результатом.

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

Исправления классифицируют: пропущенная таблица, лишняя область, неверный столбец, неверная строка, ошибка символа, ошибка нормализации или предметного правила. Статистика по категориям показывает, куда направить усилия. Рост ошибок символов требует улучшения OCR, а не нового обучения сегментации.

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

Итоговый рабочий подход

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

Для первого запуска достаточно подготовить несколько страниц, согласовать класс модели с весами, проверить размер входа, получить две маски и построить рамки. Затем подключается Tesseract, слова распределяются по столбцам и строкам, а сырая матрица сохраняется без преждевременного исправления. Только после визуального контроля добавляются пакетная очередь и предметные правила.

Надёжность достигается не максимальным числом фильтров, а наблюдаемостью. Исходный кадр, карта вероятностей, бинарные маски, координаты, текст OCR и очищенный результат должны оставаться связанными одним идентификатором. Тогда порог можно перенастроить, ошибку — воспроизвести, а исправление — проверить на контрольной выборке.

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