OCRopus

OCRopus — открытая консольная система оптического распознавания, которая разбивает обработку сканов на отдельные этапы: выравнивание и бинаризацию страницы, поиск строк, распознавание строк нейросетевой моделью и выпуск текста либо hOCR. Рассматриваемая ветвь OCRopy 1.3.3 предназначена прежде всего для Linux и macOS, запускается через Python 2.7 и рассчитана на исследовательские и массовые проекты оцифровки, а не на работу мышью в настольном редакторе.

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

Для статьи под названием OCRopus используется именно Python-ветвь OCRopy версии 1.3.3, выпущенная Томасом Бройелем и сопровождавшаяся участниками проекта. Её нельзя смешивать с ранним монолитным OCRopus 0.x, экспериментальными OCRopy2 и OCRopus 3, современной ветвью OCRopus 4, а также с графическими оболочками сторонних разработчиков. Команды, форматы моделей и требования этих поколений различаются, поэтому инструкции ниже относятся к набору ocropus-nlbin, ocropus-gpageseg, ocropus-rpred, ocropus-rtrain и связанным утилитам версии 1.3.3.

Скачать OCRopus

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

Что представляет собой OCRopus

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

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

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

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

Реальный рабочий процесс OCRopus: исходное изображение, бинаризация, сегментация и распознавание

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

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

Название менялось вместе с архитектурой. Ранний OCRopus включал высокоуровневый управляющий слой и несколько компонентов на C++. Позже наиболее активно использовалась Python-реализация, репозиторий которой назывался ocropy. В документации проекта названия OCRopus, ocropus и ocropy употреблялись как взаимозаменяемые, но для установки важен конкретный тег и набор команд.

ОбозначениеСмыслПочему нельзя смешивать
OCRopus 0.xРанний составной проектДругой набор компонентов и процедура сборки
OCRopy 1.3.3Python-ветвь, рассматриваемая здесьМодели .pyrnn.gz и Python 2.7
OCRopy2Экспериментальная переработкаИные зависимости и незавершённые интерфейсы
OCRopus 3Нейросетевые компоненты на новом стекеДругие команды, модели и структура пакета
OCRopus 4Более поздняя исследовательская линияНе является прямой заменой инструкций 1.3.3

Версия 1.3.3 указана непосредственно в установочном сценарии ветви. Тот же файл проверяет, что используется Python 2.7, и отклоняет Python 3. Это не рекомендация для совместимости, а программное условие. Поэтому установка в современную системную среду часто заканчивается ошибкой ещё до запуска распознавания.

Существуют пакеты с добавкой ocrd-fork. Они появились для интеграции компонентов OCRopy в экосистему OCR-D и могут содержать исправления упаковки. Такие сборки полезны как запасной вариант получения кода, но их следует отличать от исходного тега проекта. В метаданных загрузки это различие отмечается отдельно.

Репозиторий ветви переведён в режим только для чтения. Это важно для оценки совместимости: пакет остаётся доступным и воспроизводимым, однако его зависимости не адаптируются автоматически к новым версиям Python, NumPy, SciPy и Pillow. Для постоянного производственного процесса разумно зафиксировать всю среду, а не устанавливать библиотеки без ограничений по версиям.

Интерфейс и логика управления

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

Типичный сеанс состоит из серии команд. Сначала оператор проверяет справку через ocropus-nlbin --help. Затем запускает нормализацию страниц в каталог book, передаёт полученные .bin.png в сегментатор, применяет модель к изображениям строк и объединяет текст. Каждый шаг можно выполнять для одной страницы, набора имён или маски оболочки.

ocropus-nlbin scans/*.png -o book
ocropus-gpageseg 'book/????.bin.png'
ocropus-rpred -m models/en-default.pyrnn.gz 'book/????/??????.bin.png'
ocropus-hocr 'book/????.bin.png' -o book.html

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

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

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

Установка OCRopus 1.3.3

Почему лучше изолировать среду

Установка в системный Python сегодня рискованна. Версия 1.3.3 требует Python 2.7, тогда как современные дистрибутивы Linux и актуальные выпуски macOS ориентированы на Python 3. Даже если интерпретатор найден, свежие библиотеки могли удалить имена функций, на которые рассчитывает старый код. Надёжнее использовать отдельную виртуальную машину, контейнер или изолированное окружение с зафиксированными пакетами.

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

Базовая установка из кода

После распаковки пакета переходят в его каталог, устанавливают системные библиотеки обработки изображений и Python-модули, затем запускают python setup.py install внутри Python 2.7. Установочный сценарий копирует команды с префиксом ocropus- и модели, находящиеся в каталоге models.

python2.7 --version
python2.7 -m pip install -r requirements.txt
python2.7 setup.py install
ocropus-nlbin --help

Команда проверки должна выводить описание нелинейной бинаризации и список параметров. Сообщение command not found означает, что каталог сценариев не входит в PATH либо установка выполнялась в другое окружение. Ошибка синтаксиса с конструкциями Python 2 обычно указывает, что команда случайно связана с Python 3.

Модель распознавания

Код не включает универсальную модель как неотъемлемую часть. Установочный сценарий отдельно напоминает загрузить en-default.pyrnn.gz и поместить файл в каталог моделей. Для немецкой фрактуры использовалась другая модель. Имя модели передаётся параметром -m, поэтому наличие программы ещё не означает готовность распознавать любой язык.

Модель должна соответствовать именно Python-распознавателю OCRopy. Форматы C++-проекта CLSTM несовместимы с .pyrnn.gz, даже когда назначение и качество близки. Простое переименование файла не помогает: отличаются сериализация и нормализация строк.

Проверка поставки

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

Зависимости и системная совместимость

OCRopus 1.3.3 написан на Python и опирается на библиотеки численных вычислений и изображений. В README перечислялись NumPy, SciPy, Pillow или PIL, matplotlib и OpenCV, а системный файл пакетов добавлял компоненты, нужные конкретному дистрибутиву. Наличие всех названий не гарантирует совместимость: значение имеет поколение API.

КомпонентРольТипичная проблема
Python 2.7Запуск всех сценариевОтсутствует в новой ОС
NumPyМассивы и матричные операцииСлишком новая версия не поддерживает Python 2
SciPyФильтры, морфология, поворотыПеремещённые или удалённые функции
Pillow/PILЧтение и запись растровКонфликт имён старого PIL и Pillow
matplotlibОтладочные графики и сохранение откликовПопытка открыть окно на сервере без дисплея
OpenCVЧасть операций и совместимость старых сценариевНесовпадение Python-модуля и системной библиотеки

Основной целевой средой считался Unix-подобный компьютер. Linux подходит лучше всего благодаря пакетному менеджеру и привычной оболочке. На macOS программа запускалась, но старые инструкции привязаны к ранним версиям Homebrew и путям Python 2. На Windows официального простого MSI нет; пользователи применяли порты, виртуальную машину или Linux-подсистему, и такой путь требует ручной настройки.

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

Графический дисплей для обычного распознавания не обязателен. На сервере задают бэкенд matplotlib agg, чтобы библиотека не пыталась подключиться к X11. Это особенно важно в заданиях cron, контейнерах и удалённых вычислительных узлах.

Подготовка входных изображений

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

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

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

Официальная тестовая страница OCRopus с двухколоночной версткой

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

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

Бинаризация и выравнивание страницы

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

Исходный фрагмент скана перед обработкой OCRopus

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

Параметр --zoom управляет уменьшением изображения во время оценки фона. Меньшее значение ускоряет расчёт и сглаживает крупные изменения освещения, но может пропустить локальные дефекты. --perc задаёт процентиль, а --range — размер фильтра. Эти величины связаны с масштабом страницы, поэтому перенос настроек между 150 и 600 dpi без пересчёта не всегда разумен.

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

После выравнивания программа выбирает нижний и верхний процентили яркости. Параметры --lo и --hi влияют на контраст нормализованного изображения. Чрезмерно узкий диапазон делает тонкие штрихи чёрными вместе с шумом; слишком широкий оставляет буквы серыми и рваными после порога.

Реальный бинарный результат команды ocropus-nlbin

Бинарный файл получает суффикс .bin.png, а нормализованный серый — .nrm.png. Первый обычно используют для анализа структуры и нормализации строк. Второй способен сохранить антиалиасинг и слабые края, поэтому иногда полезен для распознавания, если бинаризация разрушает связность символов.

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

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

Сегментация страниц и поиск строк

Команда ocropus-gpageseg получает нормализованную или бинарную страницу и создаёт карту сегментации, а также отдельные изображения строк. Буква g в названии связана с градиентным способом поиска верхних и нижних границ текстовых полос.

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

Реальный отклик градиентного фильтра в сегментации OCRopus

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

Связные компоненты, верхние и нижние границы строк OCRopus

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

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

--maxseps, --sepwiden, пороги высоты и отношения сторон разделителей управляют обработкой вертикальных линий и пробелов. --noise, --threshold, --hscale и --vscale влияют на чувствительность. Менять сразу все параметры неэффективно: сначала фиксируют масштаб и колонки, затем оценивают карту сегментации.

Реальные маски найденных строк в OCRopus

Файл .pseg.png кодирует принадлежность пикселей областям. Каталог с номером страницы содержит строки с именами вроде 010001.bin.png. Числа несут порядок чтения, но для сложной страницы он не всегда совпадает с человеческим. Поэтому hOCR следует проверять не только на точность букв, но и на последовательность блоков.

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

Изображения строк как центральный формат

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

Четыре реальные строки, выделенные OCRopus из страницы

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

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

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

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

Распознавание строк нейронной сетью

ocropus-rpred загружает модель .pyrnn.gz, нормализует строку и пропускает последовательность столбцов пикселей через рекуррентную сеть LSTM. Сеть не требует заранее разрезать изображение на отдельные символы. Она выдаёт временную последовательность оценок, из которой декодируется строка текста.

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

Реальная визуализация откликов LSTM-модели OCRopus

На визуализации сверху находится строка, снизу — матрица откликов. Горизонтальная координата соответствует продвижению по изображению, а строки матрицы — возможным символам. Яркие участки показывают сильную реакцию. Ответ часто появляется ближе к правому краю буквы: сети требуется увидеть достаточную часть штрихов.

Подписанные максимумы откликов модели OCRopus

Подписанный вариант показывает неоднозначности. Цифра 5 может конкурировать с буквой S, а слабая машинописная s — с a. Базовый распознаватель не скрывает такие сомнения за словарём; итог зависит от самой модели и декодирования. Постобработка словарём или языковой моделью выполняется отдельно.

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

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

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

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

Модели OCRopus и правила их выбора

Модель содержит алфавит, параметры нормализации и веса сети. Расширение .pyrnn.gz указывает на сжатую сериализацию Python-распознавателя. Версия файла должна соответствовать коду, который его читает. Модель CLSTM с похожим назначением не открывается в OCRopy, а модель более поздней ветви не обязана быть совместимой.

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

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

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

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

Имя модели должно описывать язык, шрифт, коллекцию и итерацию, например rus-newspaper-1905-32000.pyrnn.gz. Названия вроде final2-new.gz быстро теряют смысл и мешают воспроизводимости.

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

Поддерживаемые форматы и структура результатов

ЭтапОбычный входОсновной выход
БинаризацияРастровая страница.bin.png, .nrm.png
СегментацияНормализованная или бинарная страница.pseg.png, каталог строк
РаспознаваниеИзображение одной строки.txt
ОбучениеСтрока PNG и .gt.txt.pyrnn.gz
Экспорт разметкиСтраница и тексты строкhOCR в HTML

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

Текстовые файлы должны иметь согласованную кодировку. Для Unicode безопаснее использовать UTF-8 и проверять, как конкретный сценарий Python 2 превращает байты в строки. Ошибка декодирования часто появляется не на распознавании, а при объединении результатов или обучении на знаке, отсутствующем в ожидаемом алфавите.

hOCR представляет страницу HTML-элементами с классами и координатами. Это не готовый PDF, но удобный промежуточный формат: из него можно построить поисковый слой, отобразить рамки в браузере или импортировать данные в систему цифровой библиотеки.

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

Как получить текст и hOCR

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

cat book/????/??????.txt > recognized.txt

ocropus-hocr собирает координаты строк и распознанный текст в HTML-разметку. Каждый блок получает рамку bbox, благодаря чему результат можно связать с оригинальным изображением. Это практичнее простого текста для контроля и дальнейшего создания поискового слоя.

OCRopus 1.3.3 не принимает PDF как основной вход и не выдаёт оформленный поисковый PDF одной командой. Нужны внешние стадии: растрирование входного файла, распознавание страниц, преобразование hOCR и сборка PDF. Именно поэтому программа не является прямой заменой настольному PDF-редактору.

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

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

Обучение собственной модели

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

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

ocropus-rtrain -o models/my-font book/*/*.bin.png

Вывод обучения содержит номер шага, величину ошибки, размер входа и три текстовые строки. TRU показывает эталон, OUT — свободное предсказание, ALN — выравнивание предсказания с эталоном. ALN используется для обновления весов и часто выглядит лучше OUT на ранних шагах; применять его как реальное распознавание нельзя.

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

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

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

Длительное обучение в Python-ветви выполняется на CPU и не имеет простого параллельного ускорения. Для более быстрой тренировки проект предлагал CLSTM, но его модели не взаимозаменяемы. Если задача требует современного GPU, удобнее рассмотреть Kraken или Calamari, а не пытаться механически перенести старый файл.

Подготовка эталонных расшифровок

Для строки 010001.bin.png создают 010001.gt.txt. Базовые имена должны совпадать. В текст записывают ровно то, что модель должна воспроизводить: регистр, пробелы, дефисы, пунктуацию и исторические знаки согласно принятой политике.

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

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

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

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

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

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

Измерение точности и анализ ошибок

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

Утилиты проекта помогают считать ошибки и матрицы путаницы. Матрица показывает систематические пары: 1 и l, 5 и S, rn и m. Такие данные подсказывают, каких примеров не хватает и какие дефекты создаёт бинаризация.

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

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

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

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

Практические рабочие процессы

Оцифровка современной печатной книги

Страницы сканируют примерно в 300 dpi, разделяют развороты, приводят к PNG и проверяют ориентацию. После ocropus-nlbin открывают несколько бинарных страниц, затем настраивают колонки в ocropus-gpageseg. Для обычной антиквы стартуют с английской или другой подходящей модели и измеряют ошибку на вручную набранных строках.

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

Историческая фрактура

Официальная тестовая страница OCRopus с немецкой фрактурой

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

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

Одноколоночный исторический текст

Официальная одноколоночная тестовая страница OCRopus

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

Машинописные карточки

Машинопись часто содержит неравномерный нажим, смещение ленты и прописные подписи. Готовая книжная модель ошибается на таких данных. Рациональный путь — разметить строки, начать обучение с универсальной модели и хранить отдельный тест. Реальный пример показывает, что адаптация способна радикально снизить ошибку, но качество зависит от аккуратности ground truth.

Массовая коллекция

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

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

Пакетная обработка и организация каталогов

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

project/
  scans/
  work/book-a/
  models/
  ground-truth/
  exports/
  logs/

Нумерация страниц должна сортироваться лексикографически, поэтому используют ведущие нули. Имена 1.png, 10.png, 2.png дают неправильный порядок, тогда как 0001.png, 0002.png, 0010.png сортируются ожидаемо.

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

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

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

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

Ключевые параметры команд

ocropus-nlbin

ПараметрНазначениеКогда менять
-nОтключить проверку размера страницыНебольшие фрагменты и карточки
-tПорог бинаризацииСлишком светлые или жирные штрихи
-zМасштаб оценки фонаНеравномерное освещение
-mМаксимальный наклонКривой скан в пределах нескольких градусов
--lo/--hiПроцентили контрастаВыцветшая или очень тёмная бумага
--grayПринудительная серая обработкаВход похож на бинарный, но содержит полезные полутона

ocropus-gpageseg

ПараметрНазначениеРиск неверного значения
--maxcolsepsЛимит разделителей колонокСмешение колонок или ложные разрезы
--maxsepsЛимит других разделителейПотеря линий и рамок
--noiseФильтрация мелкого шумаУдаление точек и тонких знаков
--thresholdЧувствительность маскиСлияние или пропуск строк
--hscale/--vscaleМасштаб сглаживанияНеверная геометрия областей
--grayВывод серых строкБольший объём и неодинаковые ветви обработки

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

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

Команда запускается через Python 3

Симптомы — SyntaxError, проблемы с print, Unicode или прямое сообщение установочного сценария. Проверьте первую строку исполняемого файла и путь через which. Создайте отдельное окружение Python 2.7 и установите команды заново.

Не найден модуль ocrolib

Пакет установлен не в тот интерпретатор либо команда запускается вне дерева без установленного модуля. Сравните python2.7 -c "import ocrolib" и интерпретатор в сценарии. Не копируйте только одну команду без каталога библиотеки.

Не найдена модель

ocropus-rpred требует явный путь. Проверьте расширение, права чтения и отсутствие двойного суффикса после браузерной загрузки. Убедитесь, что это модель OCRopy, а не CLSTM или другой ветви.

Страница отклонена как слишком маленькая

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

Сообщение о возможной инверсии

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

После бинаризации исчезают точки

Порог или фильтрация слишком агрессивны, разрешение мало. Сравните .nrm.png, измените --lo, --hi и -t, уменьшите подавление шума на сегментации. Оцените результат на буквах i, ё, двоеточиях и запятых.

Сегментатор объединяет две строки

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

Колонки читаются вперемешку

Настройте --maxcolseps и разделители. Убедитесь, что центральный пробел достаточно чистый. Для нестабильной газеты предварительно вырезайте колонки как отдельные изображения и задавайте порядок на уровне сценария.

Порядок строк не соответствует странице

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

Матplotlib требует дисплей

На сервере задайте MPLBACKEND=agg. Отключите параметры показа окон, если нужны только файлы. Предварительное создание кэша шрифтов под тем же пользователем устраняет задержку и предупреждения при первом запуске.

Обучение выдаёт FloatingPointError

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

Текст содержит странные замены Unicode

Проверьте кодировку .gt.txt, алфавит модели и правила нормализации. В Python 2 смесь байтов и Unicode способна проявиться только на редком символе. Прогоните автоматический список уникальных знаков до обучения.

Распознавание медленное

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

Сильные стороны OCRopus

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

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

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

Промежуточные форматы просты: PNG, текст, hOCR. Их можно проверять обычными инструментами и переносить в другой конвейер. Даже при отказе от OCRopus подготовленные строки и ground truth пригодны для новых движков.

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

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

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

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

Второе — Python 2.7. Современная система не обязана предоставлять этот интерпретатор и совместимые двоичные библиотеки. Установка последних версий всего обычно не работает. Нужна замороженная среда или контейнер.

Третье — PDF не является прямым входом и готовым результатом. OCRopus обрабатывает растры и выпускает текст или hOCR. Растрирование и сборка поискового PDF выполняются отдельно, с контролем геометрии.

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

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

Обучение Python-распознавателя медленное и не имеет современного простого GPU-режима. Ошибка может колебаться, а процесс требует наблюдения и выбора контрольной точки. Это не автоматическая кнопка дообучить.

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

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

Совместимость с современными системами

На актуальном Linux лучший путь — отдельный образ со старым пользовательским пространством. Это может быть виртуальная машина или контейнер, где Python 2.7 и совместимые версии SciPy устанавливаются из заранее проверенных пакетов. Рабочие данные подключают как отдельный том.

На macOS прямое повторение инструкций эпохи Yosemite затруднено. Современный Homebrew не ориентирован на Python 2. Использование виртуальной машины Linux обычно быстрее и воспроизводимее, чем ручная сборка всего стека под текущую macOS.

На Windows нативная установка возможна только с подбором старых библиотек и путей. Для практической работы предпочтительнее Linux-среда. Это также упрощает использование оболочечных масок и команд объединения файлов.

На ARM-системе проблема состоит не в Python-коде, а в доступности старых бинарных зависимостей. Эмуляция x86_64 может оказаться проще сборки. Производительность распознавания при этом зависит от числа строк и размера модели.

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

Миграцию следует планировать заранее: сохранять исходные страницы, строковые изображения, ground truth, hOCR и контрольные суммы моделей. Тогда результаты можно повторить или перенести в Kraken, Calamari либо другой движок без повторной разметки с нуля.

Пошаговый разбор обработки одной страницы

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

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

mkdir -p trial
ocropus-nlbin page0001.png -o trial

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

ocropus-gpageseg trial/0001.bin.png
find trial/0001 -type f -name '*.bin.png' | sort

Для одноколоночного фрагмента полезно повторить сегментацию с --maxcolseps 0 и сравнить результат. Не следует сразу удалять первый вариант: два каталога с разными именами позволяют увидеть влияние одного параметра. В хорошем эксперименте меняется одна величина, а остальные условия остаются одинаковыми.

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

ocropus-rpred -m models/en-default.pyrnn.gz trial/0001/*.bin.png

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

Завершающий пробный этап — выпуск hOCR. HTML открывают локально и сопоставляют рамки со строками. Если текст точен, но расположен в неверном порядке, не нужно переобучать сеть: корректируют сегментацию или сортировку координат. Разделение ответственности между этапами — главный принцип диагностики OCRopus.

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

Работа со сложной версткой

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

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

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

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

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

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

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

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

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

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

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

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

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

hOCR сохраняют вместе с размером исходного изображения. Если страница позже пересжата или обрезана, создают новую версию, не заменяя прежнюю. Координаты без соответствующего растра теряют смысл.

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

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

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

Границы достижимой точности

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

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

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

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

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

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

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

ПрограммаЛучше подходит дляГлавное ограничение
OCRopusВоспроизводимых OCR-конвейеров и обучения на строках исторической печатиТребует Python 2.7 и ручной командной настройки
TesseractУниверсального OCR множества языков и прямого выпуска текста, hOCR или поискового PDFСам проект не включает графическую оболочку и сложную ручную коррекцию
KrakenСовременного OCR и HTR исторических письменностей с обучаемой сегментациейДля высокого качества всё равно нужны подходящие модели и разметка
CalamariБыстрого строкового распознавания, GPU-тренировки и голосования нескольких моделейНе является полным самостоятельным конвейером верстки страницы
OCR4allИнтерактивной обработки исторических книг пользователями без навыков терминалаСложные макеты требуют ручного вмешательства и настройки процесса

OCRopus выбирают, когда важна именно классическая модульная схема и уже существуют модели или сценарии под ветвь 1.3.3. Tesseract практичнее для обычного многоязычного OCR и поискового PDF. Kraken лучше подходит новому исследовательскому проекту с историческими или рукописными материалами. Calamari полезен как высокопроизводительный распознаватель строк и ансамбль моделей. OCR4all предпочтителен гуманитарной команде, которой нужен визуальный контроль всего процесса.

PDF Commander решает соседнюю, но не идентичную задачу: работу с готовыми PDF в настольном интерфейсе. Он удобнее для просмотра и редактирования документов, тогда как OCRopus предназначен для построения и обучения OCR-конвейера. Сравнивать их только по наличию слова PDF было бы неверно.

Когда OCRopus всё ещё оправдан

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

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

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

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

Безопасность и эксплуатационная дисциплина

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

Кодовые пакеты и модели проверяют контрольными суммами. Установочные сценарии Python выполняются с правами пользователя, а не администратора, если системная установка не обязательна. Не следует использовать неизвестные перепакованные сборки, добавляющие загрузчик или рекламу.

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

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

Частые вопросы об OCRopus

OCRopus работает в браузере?

Нет. Ветвь 1.3.3 устанавливается локально и запускается командами Python. Браузер может показывать созданный hOCR, но не заменяет сам пакет.

Есть ли русское меню?

Меню отсутствует вообще. Имена команд, параметров и сообщения написаны на английском. Русская статья помогает разобраться, но не локализует терминал.

Можно ли подать PDF одной командой?

Нет. PDF предварительно превращают в отдельные растровые страницы. После OCR текст или hOCR можно внешними средствами снова соединить с изображениями.

Можно ли использовать JPEG?

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

Подходит ли программа для рукописей?

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

Нужен ли интернет при распознавании?

Нет. После установки и получения модели обработка выполняется локально. Интернет не участвует в передаче страниц.

Почему стандартная модель плохо читает прописные буквы?

Такие примеры слабо представлены в её обучении. Нужна модель с подходящим алфавитом и корпусом либо дообучение на собственных строках.

Что лучше подавать в rpred: bin или nrm?

Бинарные строки — наиболее проверенный путь. Нормализованный серый вариант полезен, когда порог разрывает штрихи, но его следует сравнить на контрольной выборке.

Можно ли ускорить распознавание?

Предсказание распределяют параметром -Q в пределах памяти. Обучение старой Python-модели не получает аналогичного простого ускорения; для него рассматривался CLSTM.

Почему самый поздний файл модели хуже раннего?

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

Как исправить неправильный порядок колонок?

Настройте разделители, разрежьте страницу на зоны или пересортируйте строки по координатам hOCR. Распознаватель букв сам не понимает структуру газетной статьи.

Можно ли заменить rpred на CLSTM?

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

Нужно ли сохранять промежуточные PNG?

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

Поддерживает ли OCRopus таблицы?

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

Почему программа печатает длинную трассировку?

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

Итоговая оценка

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

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

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

Главные издержки — сложная установка, отсутствие графического интерфейса, зависимость от Python 2.7 и необходимость внешней обработки PDF. Для нового проекта эти факторы часто перевешивают достоинства, поэтому Kraken, Calamari, Tesseract или OCR4all могут оказаться рациональнее.

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