dir.create("orus-ground-truth")Оптическое распознавание дореформенной орфографии:
дообучение модели Tesseract OCR на материалах газеты «Искра»
Научный руководитель — Алиева О.В.
Авторы выражают искреннюю благодарность
за всестороннюю помощь и поддержку — Анастасии Орловой;
за подготовку эталонных данных — студентам магистерской программы «Русская литература и компаративистика» Дарье Бахаровской, Айнур Гасановой, Екатерине Гуреевой, Наталье Лузгановой, Екатерине Можаровской, Полине Трофимовой, Элине Чинкиной.
Основано на материалах курса О.В. Алиевой Программирование на R для филологов и работе Andrés Cruz Fine-tuning Tesseract’s OCR (with some help from R
1 Постановка проблемы
В рамках подготовки магистерской диссертации по атрибуции текстов русской нелегальной печати начала XX века, в частности газеты «Искра» (1900–1905), возникла необходимость создания корпуса текстов предполагаемых авторов и редакторов издания. Поскольку газета «Искра» не оцифрована, а существующие OCR-технологии демонстрируют низкую точность при распознавании дореформенных шрифтов и орфографии, было принято решение о дообучении модели Tesseract на специально собранных данных.
На данной странице представлены описание процесса и результатов дообучения модели, примеры распознавания дореформенных текстов, а также код и предобученная модель, доступные для самостоятельного использования в исследовательских и прикладных целях.
2 Tesseract OCR
OCR (Optical Character Recognition) — технология автоматического распознавания печатного текста на изображениях и преобразования его в машинно-читаемый формат. Эта технология позволяет “извлекать” текст из сканированных документов, фотографий, PDF-файлов и других графических форматов.
Tesseract — это одна из самых популярных библиотек OCR с открытым исходным кодом, разработанная компанией Google. Tesseract поддерживает более 100 языков и может работать с различными типами изображений и форматами документов. Это совершенно бесплатно. Последние версии Tesseract используют обучение при помощи нейросетей (LSTM), и их можно дообучать под свои задачи, что очень удобно и не требует больших мощностей и продвинутых навыков программирования.
Пакет tesseract в R представляет собой обертку для библиотеки Tesseract, которая позволяет:
Распознавать текст с изображений различных форматов (PNG, JPEG, TIFF, PDF);
Работать с многостраничными документами;
Использовать предобученные модели для разных языков (список);
Настраивать параметры распознавания под конкретные задачи;
Дообучать модели для улучшения качества распознавания специфических шрифтов или типов документов.
В отличие от онлайн-сервисов OCR, пакет tesseract работает локально, что обеспечивает:
Конфиденциальность — данные не передаются третьим лицам;
Скорость — нет задержек на передачу данных по сети;
Настраиваемость — возможность тонкой настройки под конкретные задачи;
Бесшовную интеграцию с экосистемой R для дальнейшего анализа данных.
Однако качество распознавания сильно зависит от качества исходного изображения, типа шрифта, языка документа и правильности настройки параметров. Именно поэтому важно уметь не только использовать готовые модели, но и дообучать их под специфические задачи.
3 Файн-тюнинг
Начиная с версии 4, Tesseract использует нейронную сеть для распознавания текста, что позволяет дообучать модель для конкретных задач. Для дообучения необходимы эталонные данные — фрагменты изображений с соответствующим им текстом. За основу мы возьмем существующую модель для русского языка (rus), создадим новый язык с названием «old rus» (orus) и подготовим обучающие данные для дообучения модели распознаванию дореформенной орфографии.
3.1 Подготовка изображений
Всего для дообучения было подготовлено 36 фрагментов статей из газеты «Искра» (1900-1905). Например, вот такие два изображения с текстами, предположительно принадлежавшими перу Л.Троцкого и Парвуса (И.Л.Гельфанда).
Рис. 1. [Троцкий] «Искра». 1904. №61.
Рис. 2. [Парвус] «Искра». 1904. №61.
Создаем папку с именем {язык}-ground-truth/ (например, orus-ground-truth/) для хранения эталонных данных.
3.2 Разметка данных
Мы нарезаем изображения на отдельные слова в R. Для этого скачиваем следующий скрипт и запускаем его:
source("./helper_scripts/crop_words.R") # вставьте путь до скрипта на вашем компьютереФункция crop_words() принимает на входе путь до изображения (обязательный аргумент), название директории, куда будут сохранены слова (по умолчанию words), язык базовой модели (код tesseract, по умолчанию rus) и отступ вокруг слова при обрезке (в пикселях). Аргумент overwrite управляет тем, очищать ли существующие файлы word_*.png в out_dir перед сохранением (по умолчанию FALSE).
Также функция проверяет наличие пакетов magick, tesseract, tidyverse; при отсутствии пытается установить их вместе с зависимостями и затем подключает. Для корректной работы OCR с выбранным языком в системе должны быть установлены языковые данные Tesseract. Функция сохранит в папку изображения, а также вернет таблицу с метаданными.
crop_words(image_path = "./ocr/img_1.png", # подставьте путь к вашему файлу
out_dir = "./orus-ground-truth",
lang = "rus",
pad = 0,
overwrite = TRUE)
В папке orus-ground-truth появляются изображения подобные этим:
На следующем шаге делаются текстовые расшифровки для этих изображений. Tesseract ожидает файлы с gt.txt расширением и тем же именем, что и у изображения. Для ускорения процесса создания эталонных файлов можно использовать пакет tesseractgt. Для создания таких файлов используем базовую модель (rus).
# install.packages("remotes")
# remotes::install_github("arcruz0/tesseractgt")
library(tesseractgt)create_gt_txt(
folder = "./orus-ground-truth",
extension = "png",
engine = tesseract::tesseract(language = "rus")
)
В директории orus-ground-truth создаются текстовые файлы с расшифровками. Это выглядит примерно так:
Теперь самый важный и трудоемкий этап: корректировка текстовых файлов. Исправить автоматически созданные файлы .gt.txt поможет специальная функция:
correct_gt_txt()
Если в интерфейсе не видно папки с изображениями, смените рабочую директорию.
Источник
Обозначения шестнадцатеричных кодов в стандарте Unicode для символов, используемых в дореформенной русской орфографии:
- Ять: Ѣ (U+0462), ѣ (U+0463)
- И десятеричное: І (U+0406), і (U+0456)
- Фита: Ѳ (U+0472), ѳ (U+0473)
- Ижица: Ѵ (U+0474), ѵ (U+0475)
- Твёрдый знак, еръ: Ъ (U+042A), ъ (U+044A)
3.3 Процесс дообучения модели Tesseract OCR
Дообучение модели Tesseract OCR выполнялось с использованием специализированного проекта tesstrain, предназначенного для подготовки и обучения языковых моделей. На этом этапе формировались все необходимые материалы для обучения: изображения с разметкой, эталонные тексты и конфигурационные файлы.
Сначала из официального репозитория GitHub был загружен проект tesstrain, содержащий набор служебных скриптов и файл Makefile, обеспечивающий автоматизацию процесса обучения. Далее были добавлены языковые данные для русского языка, после чего с помощью командной строки осуществлялся запуск процедур обучения и валидации модели.
Для запуска обучения использовалась команда:
gmake training MODEL_NAME=orus START_MODEL=rus FINETUNE_TYPE=Impact LANG_TYPE=Both
Смысл отдельных частей команды:
gmake training — запускает задание training из файла Makefile, которое подготавливает данные, запускает обучение и сохраняет результат в папку с моделями.
MODEL_NAME=orus — имя новой модели, которая будет создана; в результате появится файл orus.traineddata.
START_MODEL=rus — обучение ведётся не с нуля, а на основе уже существующей русской модели rus, что ускоряет процесс и повышает надёжность.
FINETUNE_TYPE=Impact — «бережное» дообучение: изменяются только части сети, чтобы сохранить сильные стороны базовой модели и адаптировать её под новые тексты.
LANG_TYPE=Both — используется оба набора языковых данных Tesseract (классический и LSTM), что позволяет более полно покрыть правила, словари и примеры для дореформенной орфографии.
В результате была получена экспериментальная модель orus.traineddata, адаптированная под особенности дореформенной орфографии и демонстрирующая улучшенные показатели распознавания по сравнению со стандартной моделью rus.
Подробное описание методики обучения и примеры выполнения команд приведены в материалах курса О.В. Алиевой «Программирование на R для филологов».
4 Результаты и метрики
В ходе обучения модели orus на корпусе дореформенной орфографии наблюдался постепенный и стабильный прогресс точности распознавания.
4.1 Метрики точности распознавания OCR
В процессе обучения и тестирования моделей Tesseract OCR используются несколько ключевых метрик, позволяющих оценить качество распознавания на уровне символов и слов.
| Метрика | Полное название | Что измеряет | Интерпретация |
|---|---|---|---|
| CER | Character Error Rate | Ошибка на уровне символов: (вставки + удаления + замены) ÷ общее число символов | Основная метрика OCR. Чем меньше, тем лучше; отражает долю неверно распознанных символов |
| WER | Word Error Rate | Ошибка на уровне слов: (вставки + удаления + замены) ÷ общее число слов | Показывает, насколько корректно распознаются целые слова; чувствительна к пунктуации и орфографии |
| BCER | Best Character Error Rate | Лучшая (минимальная) ошибка символов, достигнутая на обучении | Используется при fine-tuning: отражает качество на обучающем наборе |
| BWER | Best Word Error Rate | Лучшая ошибка слов на обучающем наборе | Аналогично BCER, но на уровне слов |
| Character Accuracy | Точность по символам: 1 − CER | Процент правильно распознанных символов; 98 % означает 2 % ошибок | |
| Micro-CER | Micro-averaged CER | Средняя ошибка символов по всему корпусу (взвешенная по длине строк) | Более устойчива к дисбалансу длин строк; хороша для больших наборов |
| Macro-CER | Macro-averaged CER | Средняя ошибка символов по отдельным строкам (без взвешивания) | Полезна для оценки стабильности модели на коротких фрагментах |
Эти метрики используются Tesseract при обучении LSTM-моделей и позволяют количественно оценить эффективность дообучения.
BCER и BWER показывают динамику улучшения модели в процессе обучения,
а CER, WER и Character Accuracy применяются для итоговой оценки точности распознавания на тестовых данных.
4.2 Пример динамики метрик в ходе дообучения
| Этап | BCER (символы) | BWER (слова) | Комментарий |
|---|---|---|---|
| Начальные итерации | 28.153 % | 54.500 % | Модель ошибается примерно в каждом третьем символе и более чем в половине слов — типичный старт для новой модели |
| Промежуточный этап | 19.643 % | 41.000 % | Модель начинает обучаться и постепенно сокращает число ошибок |
| Финальный этап | 4.203 % | 8.600 % | Ошибка по символам уменьшилась почти в 7 раз; по словам — более чем в 6 раз |
| Итоговая оценка | Micro-CER = 1.94 % Macro-CER = 3.09 % Character Accuracy = 98.06 % |
— | Средняя точность распознавания символов превышает 98 %, что указывает на хорошее качество модели для рукописных и сложных OCR-задач |
Таким образом, модель показала значительное улучшение: с уровня 28 % ошибок по символам до около 4 %, что подтверждает эффективность обучения и корректность подготовленных данных.
4.3 Прогресс обучения по итерациям
- Начальные итерации: BCER = 22.5–28.1 %, BWER = 41–54.5 %. Модель почти не распознавала тексты дореформенной орфографии, что ожидаемо для старта fine-tuning.
- Средние чекпойнты: BCER = 4.2–5.4 %, BWER = 8.6–10.6 %. Ошибка существенно снизилась, сеть становится устойчивой и уверенной в распознавании.
- Финальные итерации: BCER = 5.374 %, BWER = 10.65 %. Выбрана лучшая модель с минимальной ошибкой на тренировочных данных.
4.4 Метрики на валидационном наборе
| Метрика | Значение | Описание |
|---|---|---|
| Micro-CER | 1.94 % | Средняя доля ошибочных символов по всему корпусу |
| Macro-CER | 3.09 % | Средняя доля ошибок по отдельным строкам |
| Character Accuracy | 98.06 % | Доля правильно распознанных символов |
| BCER (train, финал) | 5.374 % | Ошибка символов на тренировочном наборе |
| BWER (train, финал) | 10.65 % | Ошибка слов на тренировочном наборе |
4.5 Интерпретация
- Модель значительно улучшила распознавание по сравнению с начальным состоянием: ошибка символов снизилась почти в 4–5 раз, ошибка слов — более чем в 4 раза.
- Micro-CER и Macro-CER подтверждают высокую точность на валидационном наборе, а Character Accuracy >98 % демонстрирует пригодность модели для практического использования.
- Прогресс обучения показывает корректное fine-tuning, при котором модель адаптировалась к особенностям дореформенной орфографии, сохранив сильные стороны базовой модели
rus.
4.6 Вывод
Модель orus.traineddata успешно дообучена и готова к применению для распознавания текстов газеты «Искра» (1900–1905) и других текстов в дореформенной орфографии.
5 Как использовать предобученную модель?
Если вы новичок в цифровых методах, чтобы начать работать в R установите R и RStudio, как указано в учебнике О.В. Алиевой Комьпьютерный анализ текста.
5.1 Подготовка
Для работы с tesseractпонадобяться следующие библиотеки:
library(tidyverse)
library(qpdf)
library(tesseract)
library(pdftools)
library(magick)
Кроме библиотек нужно подготовить изображения для распознавания текста. Сложите фотографии распознаваемых страниц в отдельную папку и пропишите путь к ней в виде строковой переменной.
Для этого выполните код:
# --- Шаг 1: Определяем и сохраняем переменные для путей к данным
# и папки для сохранения результатов обработки.
# У нас, например, изображения лежат в папке ["./Iskra_pics_forOCR"],
# замените на ваши относительные или абсолютные пути к данным ---
# Путь до папки с изображениями для распознавания текста
input_dir <- "./Iskra_pics_forOCR"
# Путь дo папки, куда будут попадать предобраотанные изображения
processed_dir <- "./Iskra_processed_forOCR"
# Путь для папки c распознанными текстами
text_dir <- "./Iskra_text_forOCR"
# Создаем папки, если еще не было
if (!dir.exists(processed_dir)) dir.create(processed_dir)
if (!dir.exists(text_dir)) dir.create(text_dir)
# --- Список всех JPG. Собираем, проверяем ---
jpg_files <- list.files(input_dir, pattern = "jpg$", full.names = TRUE)
jpg_files5.2 Установка модели
Скачайте нашу предобученную orus модель. Найдите системную папку Tesseract.
tesseract::tesseract_info()$datapath[1] “/Users/anastasiabogdanova/Library/Application Support/tesseract5/tessdata/”
Скопируйте сюда новую модель orus.trainedata.
# --- Проверьте доступные модели ---
tesseract::tesseract_info()$available[1] “eng” “orus” “osd” “rus” “snum”
Загрузим скачанную модель и распознаем тексты с ее помощью:
# --- Шаг 2: Загружаем нашу модель для Tesseract ---
orus <- tesseract("orus")
orus5.3 Предпроцессинг и OCR.
Точность OCR зависит от качества исходного изображения. Часто можно улучшить результат, правильно масштабируя изображение, удаляя шум и артефакты или обрезая область, где находится текст. Отличный пакет {magick} содержит множество полезных функций для улучшения качества изображения. Что можно попробовать:
Если изображение наклонено, используйте image_deskew() и image_rotate(), чтобы выровнять текст по горизонтали. image_trim() обрезает поля с пробельными областями. Используйте image_convert() для преобразования изображения в градации серого. Для изменения размера используйте image_resize(). Функции image_modulate() или image_contrast() подходят для регулировки яркости/контраста. Попробуйте image_reducenoise() для автоматического удаления шума.
# --- Цикл обработки и OCR ---
for (jpg in jpg_files) {
# Читаем изображение с высоким разрешением
img <- image_read(jpg, density = "300x300")
# --- Предобработка изображения ---
img_processed <- img |>
# image_deskew() |> #выравнивает, если изображение наклонено
image_resize("1500x") |>
image_convert(colorspace = "gray") |> # перевод в черно-белое изображение
image_trim(fuzz = 40) |> # обрезает однотонные поля вокруг содержимого изображения
image_modulate(brightness = 120, saturation = 0) |> # меняет яркость и насыщенность
image_contrast(sharpen = 1) |> # повышает контраст
image_normalize() # выравнивает гистограмму — делает светлое светлее, тёмное темнее
# --- Сохраняем обработанное изображение в PNG ---
processed_name <- sub("\\.jpg$", "p.png", basename(jpg)) # теперь PNG
processed_path <- file.path(processed_dir, processed_name)
image_write(img_processed, path = processed_path, format = "png")
# --- OCR на обработанном изображении ---
text <- ocr(img_processed, engine = orus)
# --- Сохраняем текст ---
txt_name <- sub("\\.jpg$", ".txt", basename(jpg))
txt_path <- file.path(text_dir, txt_name)
writeLines(text, txt_path)
cat("Обработано и распознано:", processed_name, "\n")
}
# --- Проверка ---
list.files(processed_dir)
list.files(text_dir) Рис. 3. Оригинальное изображение
Рис. 4. После предобработки