Оптическое распознавание символов, или OCR, в основном применяется для преобразования текста из отсканированных изображений в выбираемый, копируемый, кодируемый, встроенный текст. В современных приложениях и программных стеках для сканеров есть встроенные функции OCR, а в большинстве PDF-файлов есть встроенный текст. Но еще встречаются документы и изображения, в которых нет встроенного текста и его нельзя извлечь автоматически.
В таком случае для автоматического распознавания текста можно использовать набор инструментов с открытым исходным кодом. Это будет полезно, когда вы загружаете документы или изображения в веб-приложение, которому нужно извлечь текст или если работаете с большим объемом документов, которые необходимо проиндексировать.
В этом мануале мы рассмотрим настройку конвейера OCR с помощью Ghostscript, Tesseract и PDFtk. Также будут рассмотрены другие инструменты, которые можно использовать вместо или в дополнение к ним.
Требования
Эти утилиты доступны на большинстве платформ. Также понадобится настроенный сервер (мы используем Ubuntu).
1: Установка Ghostscript, Tesseract и PDFtk
OCR можно проводить в PDF-файлах (которые содержат и иногда отображаются как изображения) и изображениях. Работа с PDF подразумевает несколько дополнительных шагов, которые можно пропустить, если вы работаете только с изображениями.
Вам понадобятся три инструмента для сквозного конвейера: Ghostscript — выполняет все виды преобразования PDF, в изображение и наоборот (изначально он был создан как интерпретатор Postscript, технологии-предшественницы PDF); Tesseract — движок OCR с открытым исходным кодом, как и Ghostscript, постоянно развивается с 1980-х годов; PDFtk — небольшая утилита для нарезки или восстановления PDF-файлов из отдельных страниц.
Все три приложения доступны в стандартных репозиториях Ubuntu и могут быть установлены с помощью менеджера пакетов apt. Нужно обновить источники пакетов с помощью apt update, а затем с помощью apt install установить их:
sudo apt update
sudo apt install pdftk ghostscript tesseract-ocr x11-utils
Теперь есть три новые команды, по одной для каждого приложения. Их можно проверить с помощью which:
which pdftk
/usr/bin/pdftk
which gs
/usr/bin/gs
which tesseract
/usr/bin/tesseract
Эти команды будут применяться для выполнения OCR на следующем шаге.
2: Преобразование PDF в изображение и запуск Tesseract
Если у вас нет PDF-файла, на котором можно провести распознавание текста, можете ознакомиться с этим туториалом и загрузить пример PDF-файла (без встроенного текста). Загрузить PDF-файл на свой сервер можно с помощью curl с флагом -O, чтобы сохранить его в текущем каталоге с тем же именем:
curl -O https://deved-images.nyc3.digitaloceanspaces.com/server-ocr/OCR-sample-paper.pdf
Если вы работаете с одним или несколькими PDF-файлами, прежде чем их использовать в качестве источников OCR, нужно преобразовать их в отдельные изображения. Это можно сделать с помощью команды Ghostscript. Необходимо включить дополнительные параметры, чтобы обеспечить согласованность DPI, цветового пространства и размеров. Сначала создадим рабочий каталог output для файлов, созданных этим процессом, а затем запустим gs:
mkdir output
gs -o output/%05d.png -sDEVICE=png16m -r300 -dPDFFitPage=true OCR-sample-paper.pdf
Команда gs с флагом -o указывает путь вывода перед остальной частью команды. %05d — это синтаксис оболочки, который Ghostscript понимает как нативный — в данном случае это значит, что выходным файлам PNG из входного PDF присваиваются автоматически увеличивающиеся 5-значные числа. Это видно в старых приложениях командной строки. После добавления синтаксиса форматирования PNG и DPI -r300 укажите путь к OCR-sample-paper.pdf или выбранному входному файлу.
Ghostscript выведет каждую страницу в PDF по отдельности:
Processing pages 1 through 14. Page 1 Page 2 Page 3 Page 4 Page 5 …
После завершения можно проверить содержимое выходного каталога.
ls output
00001.png 00003.png 00005.png 00007.png 00009.png 00011.png 00013.png 00002.png 00004.png 00006.png 00008.png 00010.png 00012.png 00014.png
Далее с помощью цикла for вначале команды tesseract, преобразуем созданные изображения обратно в отдельные страницы PDF (уже со встроенным текстом). Циклы ведут себя также, как и в других языках программирования. Их можно форматировать в одну команду, отделяя каждую часть точкой с запятой и завершая командой done:
for png in $(ls output); do tesseract -l eng output/$png output/$(echo $png | sed -e "s/\.png//g") pdf; done
Текст будет выводиться в оболочку во время выполнения команды:
Tesseract Open Source OCR Engine v4.1.1 with Leptonica Tesseract Open Source OCR Engine v4.1.1 with Leptonica Tesseract Open Source OCR Engine v4.1.1 with Leptonica Tesseract Open Source OCR Engine v4.1.1 with Leptonica …
Синтаксис Tesseract выглядит так:
tesseract -l language input_filename output_base_filename [pdf]
Если компонент -l language пропущен — Tesseract по умолчанию задействует английскую языковую модель, а если пропущен параметр pdf — Tesseract выводит обнаруженный текст отдельно от входного изображения, а не в формате PDF. Добавленный к этой команде дополнительный синтаксис sed обеспечивает предоставление правильных путей к Tesseract, а расширения файлов .png будут удалены при переименовании выходных файлов в .pdf.
Примечание. В Ubuntu Tesseract по умолчанию не устанавливает все языковые модели. Если вам нужно выполнить OCR не на английском языке, следует установить пакет tesseract-ocr-all с помощью команды sudo apt install tesseract-ocr-all.
Больше примеров командной строки Tesseract можно найти здесь.
После запуска Tesseract снова проверьте выходной каталог:
ls output
Видим все недавно созданные страницы PDF.
00001.pdf 00003.pdf 00005.pdf 00007.pdf 00009.pdf 00011.pdf 00013.pdf 00001.png 00003.png 00005.png 00007.png 00009.png 00011.png 00013.png 00002.pdf 00004.pdf 00006.pdf 00008.pdf 00010.pdf 00012.pdf 00014.pdf 00002.png 00004.png 00006.png 00008.png 00010.png 00012.png 00014.png
Если вам нужно только выходное изображение, можете перейти к последним пунктам этого мануала, там вы узнаете больше о возможностях массового извлечения текста. А если вы используете PDF, то далее мы восстановим и доработаем его.
3: Восстановление PDF-файлов из изображений (необязательно)
В предыдущем разделе мы применяли PDF-файл в качестве исходного, а теперь нужно снова с помощью PDFtk и Ghostscript собрать его из отдельных страниц, созданных Tesseract. Поскольку они последовательно пронумерованы, для их объединения в команду pdftk cat можно передать упорядоченный список файлов с помощью синтаксиса оболочки:
pdftk output/*.pdf cat output joined.pdf
Теперь есть один PDF-файл, восстановленный из выходных данных Tesseract – join.pdf. Осталось только переформатировать PDF с помощью Ghostscript. Это нужно сделать, потому что Tesseract не всегда точно соблюдает размеры PDF. Новый PDF-файл сейчас намного больше, чем исходный, так как он не был оптимизирован, потому нам нужен Ghostscript — мощный инструмент для повторного рендеринга PDF-файлов в соответствии с точными характеристиками. Выполните команду gs в файле join.pdf:
gs -sDEVICE=pdfwrite -sPAPERSIZE=letter -dFIXEDMEDIA -dPDFFitPage -o final.pdf joined.pdf
Вы можете получить предупреждение от команды о соответствии PDF-файла характеристикам, и это нормально. Ghostscript требовательнее к стандартам PDF, чем другие инструменты, но зато большинство PDF-файлов будут отображаться в большей части программ просмотра.
Параметры -sDEVICE=pdfwrite -sPAPERSIZE=letter -dFIXEDMEDIA -dPDFFitPage применяются для соблюдения размеров PDF. Вам может понадобиться изменить sPAPERSIZE=letter, если вы работаете с другими форматами страниц. Имя файла -o final.pdf, указанное команде gs, будет названием готового документа.
Чтобы убедиться, что распознавание прошло успешно, можно открыть PDF-файл локально в настольном приложении или использовать приложение командной строки. Например, pdftotext извлекает вложенный текст из документа.
Установить pdftotext в Ubuntu можно с помощью пакета poppler-utils. Он содержит инструменты для работы с PDF в командной строке:
sudo apt install poppler-utils
Затем запустите pdftotext в новом PDF:
pdftotext final.pdf
Будет создан новый файл final.txt. Просмотрите содержимое файла с помощью инструмента head:
head final.txt
Вы увидите:
Pakistan Journal of Applied Economics (1983) vol. II, no. 2 (167—180) THE MEASUREMENT OF FARM-SPECIFIC TECHNICAL EFFICIENCY 1. P. KALIRAJAN and J. C, FLINN*
Measures of technical efficiency were estimated using a stochastic translog production frontier for a sample of rainfed rice farmers in Bicol, Philippines. These estimates were farm specific as opposed to being based on deviations from an average sample efficiency. A wide variation in the level of technical
Получим поток текста из входного файла. Он может быть расположен не по порядку или включать какие-то странные символы форматирования, но это норма при выводе всего текста сразу — главное, что документ теперь содержит встроенный текст. На этом этапе можно удалить созданный каталог output, в котором содержатся незавершенные изображения и страницы PDF. Эти изображения нам больше не понадобятся.
Теперь у вас есть сквозной конвейер OCR, в котором присутствуют три инструмента и четыре команды. Их можно объединить в отдельный сценарий, интегрировать в другое приложение или запускать интерактивно по мере необходимости. Это комплексное решение для отдельных PDF-документов. Далее мы рассмотрим дополнительные параметры форматирования таблиц данных и массового извлечения текста.
4: Извлечение таблиц CSV после OCR (необязательно)
После выполнения OCR на изображениях или PDF-файлах также есть возможность извлечь любые табличные данные или данные в формате электронной таблицы в файл CSV. Это особенно полезно при работе со старыми источниками данных или научными статьями.
Для этого есть два инструмента, и оба работают одинаково: Tabula (написана на Java) и Camelot (на Python).
Tabula
Tabula можно установить как snap-пакет с помощью snap install:
sudo snap install tabula
В PDF-файле, который выступает в качестве примера, найдите таблицу в середине страницы 6:
Теперь нужно запустить tabula в PDF-файле. Укажите, что вам необходимо извлечь таблицу из -p 6 в final.pdf и перенаправить вывод в новый файл test.csv:
tabula -p 6 final.pdf > test.csv
Проверьте качество распознавания таблицы в test.csv. Теперь можно использовать её в качестве входных данных в программах для работы с электронными таблицами (например Excel) или для другого сценария анализа данных.
Camelot
Camelot — это библиотека Python, для ее работы требуются установленые Python и pip — менеджер пакетов Python. Если вы не установили Python, можете ознакомиться с первым пунктом мануала Установка Python 3 и настройка среды программирования на сервере Ubuntu.
Далее установим Camelot с помощью pip install вместе с зависимостью opencv:
sudo pip install camelot-py opencv-python-headless ghostscript
После этого можно запустить camelot в PDF-файле, указав -p 6, путь вывода и тип файла, а также входной файл final.pdf:
camelot -p 6 -f csv -o test.csv stream final.pdf
Для более точной настройки можете ознакомиться с материалами Camelot.
5: Другие инструменты OCR
Хотя Tesseract это самый долго разрабатываемый инструмент OCR, есть и другие программы для выполнения OCR. EasyOCR — это новый механизм OCR с открытым исходным кодом, он активно развивается и обеспечивает быстрые и точные результаты за счет работы на GPU. Но EasyOCR не поддерживает вывод в формате PDF, что затрудняет реконструкцию входных документов. Он полезен для вывода больших объемов необработанного текста.
EasyOCR — это библиотека Python, для работы с которой нужно установить Python и pip.
Затем установите EasyOCR с помощью pip install:
sudo pip install easyocr
После установки EasyOCR его можно использовать как библиотеку со скриптом Python или вызывать его из командной строки с помощью команды easyocr. Пример команды EasyOCR:
easyocr -l ch_sim en -f image.jpg --detail=1 --gpu=True
EasyOCR поддерживает одновременную загрузку нескольких языковых моделей для выполнения многоязычного OCR. Можно указать несколько языков после флага -l, в примере это ch_sim (упрощенный китайский) и en (английский). -f image.jpg — путь к входному файлу. –detail=1 передаст координаты рамок вместе с выводом, если вам нужно указать на местоположение извлеченного текста в файле. Можно не указывать эту информацию, используя флаг –detail=0.
Если среда GPU настроена, то флаг -gpu=True можно не использовать, и он будет пытаться использовать путь кода CUDA для более эффективного извлечения.
Подводим итоги
В этом мануале мы создали конвейер OCR с помощью инструментов с открытым исходным кодом, которые можно внедрить в другие стеки приложений или открыть через веб-сервис. Также мы рассмотрели синтаксис и опции этих инструментов для их “тонкой настройки” и возможности OCR для массового извлечения таблиц CSV и текста.
OCR — это хорошо понятная и широко используемая технология. Несмотря на это, реализация OCR “под ключ” часто ограничивается платным настольным программным обеспечением.
Читайте также: Введение в машинное обучение