EffOCR

EffOCR распознаёт печатный текст на сканах, выделяет строки, слова и отдельные символы, сопоставляет найденные фрагменты с визуальным индексом и возвращает текст вместе с координатами областей. Главные инструменты — готовые модели для инференса, модульная настройка локализатора и распознавателя, обучение на собственных COCO-аннотациях, визуальная проверка рамок и экспорт результатов для дальнейшей обработки.

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

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

Скачать EffOCR

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

Как устроено распознавание в EffOCR

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

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

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

Схема EffOCR с локализатором, распознавателем и индексом визуальных образцов

Какие материалы подходят для обработки

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

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

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

Историческая газетная полоса как исходный материал для распознавания

Подготовка изображений перед запуском

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

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

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

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

Установка и организация рабочего окружения

Базовая установка выполняется командой pip install efficient-ocr. Практический проект лучше размещать в отдельном виртуальном окружении, чтобы версии библиотек детекции, PyTorch, ONNX Runtime и средств работы с изображениями не конфликтовали с другими задачами. После установки проверяют импорт EffOCR в том же интерпретаторе, которым будет запускаться скрипт или блокнот; частая причина ошибки — установка пакета одним pip и запуск другим Python.

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

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

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

python -m venv .venv
# Активируйте окружение способом, принятым в вашей системе
python -m pip install --upgrade pip
python -m pip install efficient-ocr

Конфигурация моделей

Объект EffOCR получает конфигурацию с разделами Recognizer, Localizer и Line. В распознавателе отдельно задаются char и word: для каждого указываются модельный бэкенд, каталог на диске и идентификатор набора весов. В локализаторе и модели строк задаются аналогичные сведения. Если словный уровень не нужен, его не следует подключать формально: лишний модуль увеличивает загрузку и усложняет разбор ошибки.

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

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

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

from efficient_ocr import EffOCR

engine = EffOCR(config={
    'Recognizer': {
        'char': {
            'model_backend': 'onnx',
            'model_dir': './models',
            'hf_repo_id': 'dell-research-harvard/effocr_en/char_recognizer'
        },
        'word': {
            'model_backend': 'onnx',
            'model_dir': './models',
            'hf_repo_id': 'dell-research-harvard/effocr_en/word_recognizer'
        }
    },
    'Localizer': {
        'model_backend': 'onnx',
        'model_dir': './models',
        'hf_repo_id': 'dell-research-harvard/effocr_en'
    },
    'Line': {
        'model_backend': 'onnx',
        'model_dir': './models',
        'hf_repo_id': 'dell-research-harvard/effocr_en'
    }
})

Первый инференс и проверочный прогон

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

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

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

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

results = engine.infer('samples/page_0001.png')
# Сохраните results вместе с текстом и координатами
# Отдельно создайте визуализацию строк, слов и символов

Структура результата и координаты

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

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

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

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

Визуализация EffOCR: исходник, транскрипция, строки, слова и символы

Локализация строк

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

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

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

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

Локализация слов и символов

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

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

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

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

Распознавание через визуальный индекс

Распознаватель превращает каждую обрезку в embedding — компактное описание визуальных признаков. В офлайн-индексе заранее находятся embeddings эталонных изображений символов или слов, созданных из цифровых шрифтов и дополненных реальными примерами. Поиск ближайшего соседа возвращает метку самого похожего эталона.

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

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

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

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

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

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

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

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

Выбор готовой модели

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

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

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

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

Сравнение точности моделей OCR в материалах проекта EffOCR

Подготовка COCO-аннотаций

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

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

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

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

Как быстро собрать исходную разметку

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

Активная выборка экономит время. После первого прогона строки сортируют по низкой уверенности, высокому non-word rate, большому числу неизвестных символов или расхождению между словной и символьной ветвями. Разметчик исправляет эти случаи, а не ещё сотню идеально читаемых строк. Следующий цикл повторяют до стабилизации метрики.

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

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

Синтетические рендеры и шрифты

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

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

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

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

Добавление реальных фрагментов

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

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

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

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

Обучение распознавателя

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

Доступны обычные параметры обучения: learning rate, оптимизатор, weight decay, размер пакета, устройство и число эпох. Их меняют последовательно, сохраняя контрольный набор. Слишком высокий темп обучения разрушает полезные исходные признаки, слишком низкий тратит время и может не приспособить модель к печати. Остановка определяется по метрике проверки и качеству ближайших соседей.

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

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

Hard negative sampling

Трудные отрицательные примеры — пары, которые модель визуально путает: O и 0, l и 1, c и e, rn и m, близкие каны или повреждённые цифры. После начального обучения EffOCR может сформировать текстовый файл таких случаев; путь задаётся через hns_txt_path. Второй этап уделяет этим парам больше внимания.

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

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

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

Обучение локализатора

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

Параметр vertical сообщает ожидаемое направление расположения символов. no_words отключает словные объекты для систем письма, где такое группирование неприменимо. Эти два флага меняют смысл задачи и должны совпадать при подготовке разметки, обучении и инференсе.

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

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

Вертикальное письмо и документы без пробелов

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

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

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

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

ONNX и исполнение на CPU

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

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

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

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

Пакетная обработка больших коллекций

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

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

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

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

Многопоточность и производительность

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

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

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

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

Визуальная проверка результата

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

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

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

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

Метрики качества

Основная текстовая метрика — character error rate: число вставок, удалений и замен относительно эталона, делённое на длину эталона. Она подходит для сравнения конфигураций, но зависит от правил нормализации. Регистр, пробелы, переносы и исторические варианты должны обрабатываться одинаково во всех экспериментах.

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

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

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

Non-word rate и поиск сомнительных строк

Для английских газет полезен non-word rate — доля токенов, не похожих на словарные слова. Высокое значение часто указывает на плохой скан, неверную локализацию или распознавание. В проекте этот сигнал использовался, чтобы фильтровать строки при создании словных аннотаций.

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

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

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

Распределение non-word rate для газетных наборов

Работа с газетной полосой

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

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

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

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

Пример анализа макета исторических газетных страниц

Полный газетный конвейер

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

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

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

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

Последовательность обработки газет: макет, читаемость, OCR и аннотация

Интеграция с анализом макета

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

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

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

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

Читаемые и повреждённые страницы

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

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

Если видимая буква отсутствует даже для человека, vision-only распознавание не может надёжно восстановить её по контексту. Языковая модель может предложить правдоподобное слово, но это будет реконструкция, а не наблюдение. Для исследовательских данных разумнее сохранить маркер неопределённости и оригинальную обрезку.

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

Примеры читаемых, сомнительных и неразборчивых газетных фрагментов

Анализ качества большой коллекции

После распознавания полезно строить агрегаты по страницам и регионам: число найденных статей, долю нечитаемых материалов, распределение non-word rate и объём текста. Эти графики не измеряют точность напрямую, но быстро показывают разрыв в данных, неудачную партию сканов или смену формата.

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

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

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

Распределение распознанного газетного корпуса по годам

Карты и групповые отчёты

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

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

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

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

Карта количества обработанных газетных сканов по регионам

Экспорт для поиска и анализа

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

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

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

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

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

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

Особое внимание уделяют парам, похожим в конкретной печати: З и 3, О и 0, Ч и 4, Ь и Ъ, І и 1 в старой орфографии, а также латинским буквам внутри библиографических ссылок. Hard negative sampling должен включать эти пары. При смешанном алфавите метки сохраняют различие Unicode, иначе поиск и последующий анализ будут неверными.

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

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

Исправление ошибок загрузки моделей

Сообщение о ненайденном файле начинается с проверки фактического абсолютного пути. Выведите model_dir, текущий рабочий каталог и список файлов. В блокноте каталог может измениться после открытия, а в службе — указывать на системную папку. Исправление состоит в явном построении пути от корня проекта.

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

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

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

Исправление проблем с зависимостями

Ошибка импорта часто связана не с EffOCR, а с бинарными компонентами PyTorch, ONNX Runtime, FAISS или библиотек детекции. Сначала запишите полный traceback и импортируйте зависимости по одной в чистом процессе. Это показывает первый реально неработающий модуль.

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

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

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

Пустой результат или пропущенные строки

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

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

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

Если рамки есть, а текст пуст, переходите к локализатору символов и индексу. Пустые обрезки могут появиться после неверного преобразования координат. Сохраните несколько crop-файлов и убедитесь, что в них действительно находятся знаки.

Слитые и разделённые символы

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

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

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

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

Неверный порядок текста

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

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

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

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

Низкое сходство и неверные символы

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

Уверенная неверная замена часто связана с hard negative парой или ошибочной меткой эталона. Постройте ближайшие несколько соседей, а не только первый. Если все они относятся к неправильному классу, энкодеру не хватает разделяющих примеров; если среди них есть верный, можно калибровать индекс или метрику.

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

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

Проверка COCO-файла при ошибке обучения

Если обучение завершается до первой эпохи, проверьте структуру JSON: обязательные массивы, уникальные id, существование файлов, положительные размеры bbox и ссылки на категории. Один объект за границами изображения способен остановить загрузчик или создать пустой crop.

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

Проверьте кодировку и нормализацию Unicode. Визуально одинаковые составные и разложенные диакритические знаки могут стать разными метками. Нормализацию выбирают один раз для разметки, рендеров, индекса и оценки.

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

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

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

ПрограммаЛучше подходит дляГлавное ограничение
EffOCRАрхивных коллекций, редких шрифтов и few-shot адаптацииНужны Python-конфигурация и собственные данные для неподдержанных языков
PDF CommanderРаспознавания и редактирования отдельных сканированных PDF в графическом интерфейсеНе предназначен для обучения исследовательских OCR-моделей и массового программного конвейера
Tesseract OCRМногоязычного классического OCR, hOCR, TSV и создания PDF с текстовым слоемНе принимает PDF как вход напрямую и слабее адаптируется к сложной исторической печати без обучения
PaddleOCRМногоязычных документов, ориентации, таблиц и комплексных document-AI конвейеровБольшой набор компонентов и настроек сложнее развернуть и точно откалибровать
EasyOCRБыстрого старта на изображениях с широким набором готовых языковМеньше инструментов для sample-efficient адаптации к одному редкому шрифту
docTRPython-обработки PDF и изображений связкой детектора и распознавателяДля глубокой адаптации требуется собственное обучение стандартной нейросетевой схемы

Для пользователя, которому нужно открыть сканированный PDF, распознать страницу и сразу исправить документ, практичнее PDF Commander. Tesseract подходит для автоматизации распространённых языков и стандартных выходных форматов; EasyOCR — для короткого многоязычного прототипа; PaddleOCR — для более широкого анализа структуры, таблиц и ориентации; docTR — для разработчика, которому нужен единый Python-конвейер документов. EffOCR следует выбирать, когда главная проблема состоит не в отсутствии кнопки OCR, а в нестандартной печати, малом числе размеченных примеров и большом объёме однородного архива.

Практический сценарий для небольшого архива

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

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

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

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

  1. Сформировать репрезентативный набор страниц и правила транскрипции.
  2. Проверить готовые модели и сохранить исходную метрику.
  3. Подготовить COCO-разметку, шрифты и реальные обрезки.
  4. Обучить распознаватель и выполнить hard negative sampling.
  5. Настроить локализатор, пороги и порядок чтения.
  6. Проверить ONNX-экспорт и стабильность пакетной очереди.
  7. Запустить пилот, оценить качество и только затем весь корпус.

Практический сценарий для миллионов страниц

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

Макет, строки и OCR выполняются отдельными очередями. Каждый этап читает манифест, создаёт результат и отмечает статус. Это позволяет увеличить только узкое место, повторить один этап после новой модели и не держать весь конвейер в памяти.

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

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

Примеры содержания, извлечённого из исторического газетного корпуса

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

EffOCR не получает страницы PDF напрямую, поэтому растеризация и обратная связь координат входят в ваш конвейер. Нет готовой русской модели, и кириллический проект требует собственных шрифтов, меток и проверки. Управление выполняется через Python-конфигурацию, а не через мастер с последовательными кнопками.

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

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

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

Изменение доли неразборчивых материалов в исторической коллекции

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

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

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

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

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

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

Рабочая схема для стабильного результата

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

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

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

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

Карта доли неразборчивых статей как пример контроля качества корпуса

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