Поиск по сайту:

Как выполнять распознавание текста на стороне сервера в PDF-файлах и изображениях


Введение

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

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

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

Предпосылки

Эти инструменты доступны на большинстве платформ. В этом руководстве содержатся инструкции по установке сервера Ubuntu 22.04 в соответствии с нашим руководством по начальной настройке сервера с Ubuntu 22.04.

Шаг 1 — Установка Ghostscript, Tesseract и PDFtk

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

Вам понадобятся три инструмента для сквозного конвейера: Ghostscript, который обрабатывает все виды преобразования PDF в изображение и наоборот (изначально он был создан как интерпретатор Postscript, технологии-предшественницы PDF), Tesseract , движок OCR с открытым исходным кодом, который, как и Ghostscript, непрерывно разрабатывался с 1980-х годов, и PDFtk, небольшая утилита для нарезки или восстановления PDF-файлов из отдельных страниц.

Все три приложения доступны в стандартных репозиториях Ubuntu и могут быть установлены с помощью менеджера пакетов apt. Обновите исходники пакетов с помощью apt update, а затем используйте apt install для их установки:

  1. sudo apt update
  2. sudo apt install pdftk ghostscript tesseract-ocr x11-utils

Теперь у вас должно быть три новых команды, по одной для каждого приложения, которые вы можете проверить, используя what:

  1. which pdftk
Output
/usr/bin/pdftk
  1. which gs
Output
/usr/bin/gs
  1. which tesseract
Output
/usr/bin/tesseract

Вы будете использовать эти команды для выполнения OCR на следующем шаге.

Шаг 2 — Преобразование PDF-файлов в изображения и запуск Tesseract

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

  1. curl -O https://deved-images.nyc3.digitaloceanspaces.com/server-ocr/OCR-sample-paper.pdf

Если вы работаете с одним или несколькими PDF-файлами, вам необходимо преобразовать их в отдельные изображения, прежде чем их можно будет использовать в качестве источников OCR. Это можно сделать с помощью команды Ghostscript. Вам нужно будет включить дополнительные параметры для обеспечения согласованности цветового пространства и размеров. Сначала создайте рабочий каталог output для файлов, созданных этим процессом, затем запустите gs:

  1. mkdir output
  2. 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 отдельно:

Output
Processing pages 1 through 14. Page 1 Page 2 Page 3 Page 4 Page 5 …

После завершения вы можете проверить содержимое каталога output.

  1. ls output
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:

  1. for png in $(ls output); do tesseract -l eng output/$png output/$(echo $png | sed -e "s/\.png//g") pdf; done

Некоторый текст будет выводиться в вашу оболочку во время выполнения команды:

Output
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 имя_входного_файла имя_базового_файла [pdf]. Если компонент -l language опущен, Tesseract по умолчанию использует модель английского языка, а если pdf опущен, Tesseract будет выводить идентифицированный текст отдельно от входного изображения, а не в формате PDF. Дополнительный синтаксис sed, добавленный к этой команде, обеспечивает предоставление правильных путей к Tesseract, а расширения файлов .png удаляются при переименовании выходных файлов в .pdf.

Примечание. В Ubuntu Tesseract по умолчанию не устанавливает все языковые модели. Если вам нужно выполнять распознавание символов не на английском языке, вам следует установить пакет tesseract-ocr-all с помощью sudo apt install tesseract-ocr-all.

Вы можете найти больше примеров командной строки Tesseract в официальной документации.

Еще раз проверьте выходной каталог после запуска Tesseract:

  1. ls output

Вы увидите все недавно созданные страницы PDF.

Output
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 для их объединения:

  1. pdftk output/*.pdf cat output joined.pdf

Теперь у вас есть один PDF-файл, реконструированный из выходных данных Tesseract, с именем joined.pdf. Единственный оставшийся шаг — переформатировать PDF с помощью Ghostscript. Это важно, потому что Tesseract не всегда соответствует точным размерам PDF. Ваш новый PDF-файл в настоящее время намного больше, чем ваш ввод, потому что он не был оптимизирован, а Ghostscript — гораздо более мощный инструмент для повторного рендеринга PDF-файлов в соответствии с точными спецификациями. Запустите последнюю команду gs в файле joined.pdf:

  1. 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-файлами в командной строке:

  1. sudo apt install poppler-utils

Затем запустите pdftotext в новом PDF-файле:

  1. pdftotext final.pdf

Будет создан новый файл final.txt. Предварительно просмотрите содержимое этого файла с помощью такого инструмента, как head:

  1. head final.txt
Output
Pakistan Journal of Applied Economics (1983) vol. II, no. 2 (167—180) THE MEASUREMENT OF FARM-SPECIFIC TECHNICAL EFFICIENCY K. 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. Эти изображения больше не нужны.

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

Шаг 4 (необязательно) — Извлечение таблиц CSV из документов после OCR

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

Есть два инструмента, которые обеспечивают эту функциональность, и оба работают одинаково: Camelot, написанный на Python.

Табула

Табула может быть установлена в Ubuntu в виде моментального пакета с помощью мгновенной установки:

  1. sudo snap install tabula

Если вы визуально осмотрите образец PDF, использованный в этом руководстве, вы найдете таблицу в середине страницы 6:

Поэтому вы запустите tabula в своем PDF-файле, указав, что вы хотите извлечь таблицу из -p 6 в вашем final.pdf, и перенаправить вывод в новый файл с именем test.csv:

  1. tabula -p 6 final.pdf > test.csv

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

Камелот

Camelot — это библиотека Python, и для ее работы требуется установленный Python и pip, менеджер пакетов Python. Если вы еще не установили Python, вы можете обратиться к первому шагу раздела «Как установить Python 3 и настроить среду программирования на сервере Ubuntu 22.04».

Затем установите Camelot с помощью pip install вместе с его зависимостью opencv:

  1. sudo pip install camelot-py opencv-python-headless ghostscript

После этого вы можете запустить camelot в своем PDF-файле, снова указав -p 6, выходной путь и тип файла, а также входной final.pdf:

  1. camelot -p 6 -f csv -o test.csv stream final.pdf

Вы можете обратиться к документации Camelot, чтобы при необходимости настроить извлечение.

На последнем, необязательном шаге этого руководства вы рассмотрите некоторые другие решения OCR.

Шаг 5 (необязательно) — Использование других решений OCR для массового извлечения

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

EasyOCR — это библиотека Python, для работы с которой необходимо установить Python и pip, менеджер пакетов Python. Если вы еще не установили Python, вы можете обратиться к первому шагу раздела «Как установить Python 3 и настроить среду программирования на сервере Ubuntu 22.04».

Затем установите EasyOCR с помощью pip install:

  1. sudo pip install easyocr

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

  1. easyocr -l ch_sim en -f image.jpg --detail=1 --gpu=True

EasyOCR поддерживает одновременную загрузку нескольких языковых моделей для выполнения многоязычного распознавания текста. Вы можете указать несколько языков после флага -l, в данном случае ch_sim для упрощенного китайского и en для английского. -f image.jpg — это путь к входному файлу. --detail=1 предоставит координаты ограничивающей рамки вместе с вашим выводом, если вам нужно сослаться на местоположение извлеченного текста в вашем файле. Вы также можете опустить эту информацию, выполнив команду --detail=0.

Флаг -gpu=True является необязательным и будет пытаться использовать путь кода CUDA для более эффективного извлечения, если настроена среда GPU.

Заключение

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

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

Статьи по данной тематике: