info@severcart.org
Русский English

Применение OCR Tesseract совместно с Python

11 января 2018 г.    Python

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

Тем не менее будет полезно воспользоваться OCR tesseract через язык программирования Python, когда нужно применить OCR к собственным проектам, при условии, что будут получены хорошие и чистые тексты.

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

В этой статье будет рассказано, как установить пакет Tesseract OCR для Python, а затем напишем простой Python скрипт для распознавания текста с картинок.

Установка пакета Tesseract для Python

Чтобы установить pytesseract воспользуемся менеджером пакетов Python pip. Также рекомендуется использовать виртуальную среду чтобы устанавливать свой набор пакетов для разных проектов. В данном случае virtualenv называется cv.

$ python3 –m venv cv
$ cd cv; source bin/activate

Затем установим Pillow (удобный клон PIL для Python) от которого зависит pytesseract.

$ pip install pillow
$ pip install pytesseract

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

Рассмотрим код, который отделяет текст переднего плана от фона, а затем применим установленный pytesseract.

Распознавание текста с помощью Tesseract и Python

Создадим файл с именем ocr.py:

from PIL import Image
import pytesseract
import cv2
import os

image = '/tmp/tests.png'

preprocess = "thresh"

# загрузить образ и преобразовать его в оттенки серого
image = cv2.imread(image)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# проверьте, следует ли применять пороговое значение для предварительной обработки изображения

if preprocess == "thresh":
    gray = cv2.threshold(gray, 0, 255,
        cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]

# если нужно медианное размытие, чтобы удалить шум
elif preprocess == "blur":
    gray = cv2.medianBlur(gray, 3)

# сохраним временную картинку в оттенках серого, чтобы можно было применить к ней OCR

filename = "{}.png".format(os.getpid())
cv2.imwrite(filename, gray)

Теперь применим OCR к изображению, используя pytesseract:

# загрузка изображения в виде объекта image Pillow, применение OCR, а затем удаление временного файла
text = pytesseract.image_to_string(Image.open(filename))
os.remove(filename)
print(text)

# показать выходные изображения
cv2.imshow("Image", image)
cv2.imshow("Output", gray)
input(‘pause…’)

Вызов оператора pytesseract.image_to_string преобразует изображение в строку текста. Обратите внимание, что была передана ссылка на временный файл картинки.

print(text) – распечатывает результата распознавания скрипта в терминал. В ваших собственных приложениях вы можете выполнить некоторые дополнительные действия, например, проверку орфографии или обработку естественного языка.

В заключении, строки с cv2.imshow обрабатывают исходное и предварительно обработанное изображение на экране в отдельных окнах. input(‘pause…’) сообщает программе, что нужно ожидать пользовательского нажатия клавиши перед выходом из сценария.

Результаты OCR

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

В этом разделе проверим OCR двух образцов изображений.

  • Сначала пропустим каждое изображение через двоичный файл Tesseract.
  • Затем передадим каждое изображение скрипту ocr.py (который выполняет предварительную обработку перед отправкой их в tesseract).
  • Сравним результаты обоих этих методов и выявим ошибки.

Пример картинки

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

$ tesseract /tmp/example_01.png stdout
Noisy image
to test
Tesseract OCR

В этом случае Tesseract отлично справился с ошибками. Теперь подтвердим, что скрипт ocr.py также работает:

$ python ocr.py

Noisy image
to test
Tesseract OCR

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

Затем протестируем Tesseract и наш скрипт на изображении, предварительно обработанным фильтром с шумом «соль и перец».

Результаты работы двоичного файла tesseract:

$ tesseract /tmp/example_02.png stdout
Detected 32 diacritics
" Tesséra‘c't Will
Fail With Noisy
Backgrounds

К сожалению, tesseract не смог распознать текст без ошибок.

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

# image =/tmp/example_02.png и preprocess=blur

$ python ocr.py 

Tesseract Will
Fail With Noisy
Backgrounds

Этап предварительной обработки blur позволило Tesseract правильно распознать OCR и вывести желаемый текст.

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

Примечание. Если текст повернут, нужно также выполнить предварительную обработку.

Резюме

В этой статье было продемонстрировано применение OCR движка tesseract с языком программирования Python. Что позволило нам применять алгоритмы OCR из собственных сценариев Python.

Самый большой недостаток связан с ограничениями самого Tesseract – он работает когда на переднем плане есть чрезвычайно чистые фрагменты текста. Кроме того, эти фрагменты должны быть как можно более высокого разрешения (DPI), а символы входного изображения не были подвергнуты «пикселированию» после сегментации.

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

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