Библиотека PyTesseract в Python

Люди могут понять содержание изображения, просто посмотрев на него. Компьютеры работают иначе. Именно здесь вступает в действие оптическое распознавание символов (OCR). Будь то распознавание автомобильных номеров с камеры или рукописные документы, которые следует преобразовать в цифровую копию, этот метод очень полезен. Хотя это не всегда идеально, это очень удобно и позволяет некоторым людям выполнять свою работу намного проще и быстрее.

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

Что такое оптическое распознавание символов?

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

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

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

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

Процесс может быть неточным на 100% и может потребоваться вмешательство человека для исправления некоторых элементов, которые не были отсканированы правильно. Исправление ошибок также может быть достигнуто с помощью словаря или даже обработки естественного языка (NLP).

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

Использование OCR

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

Если у вас есть сканер документов на вашем телефоне, например Adobe Scan, вы, вероятно, сталкивались с использованием технологии OCR.

Аэропорты также могут использовать OCR для автоматизации процесса распознавания паспортов и извлечения из них информации.

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

Что мы будем использовать?

Для этого проекта OCR мы будем использовать библиотеку Python-Tesseract или просто PyTesseract, которая является оболочкой для Google Tesseract-OCR Engine.

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

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

Мы также собираемся использовать Pipenv, поскольку он также выполняет настройку виртуальной среды и управление требованиями.

Помимо этого, мы также будем использовать библиотеку Pillow, которая является ответвлением Python Imaging Library (PIL) для обработки открытия и обработки изображений во многих форматах.

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

  • Textract: который может извлекать данные из PDF-файлов, но является тяжелым пакетом.
  • Pyocr: предлагает больше вариантов обнаружения, таких как предложения, цифры или слова.

Как настроить?

Начните с установки Pipenv, используя следующую команду через Pip (если вам нужно настроить его, обратитесь к этому).

$ pip install pipenv

Создайте каталог проекта и запустите проект, выполнив следующую команду:

$ mkdir ocr_server  cd ocr_server  pipenv install --three

Теперь мы можем активировать нашу виртуальную среду и начать установку наших зависимостей:

$ pipenv shell
$ pipenv install pytesseract Pillow 

Если вы не будете использовать Pipenv, вы всегда можете использовать подход Pip и Virtual Environment. Следуйте официальной документации, которая поможет вам начать работу с Pip и виртуальной средой:

Примечание. В этом случае вместо pipenv install Pillow будет команда pip install Pillow.

Выполнение

Мы планируем реализовать этот проект в 2 фазы. В первом мы создадим скрипт, а в следующем мы создадим приложение Flask, которое будет действовать как интерфейс.

Скрипт OCR

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

try:
    from PIL import Image
except ImportError:
    import Image
import pytesseract

def ocr_core(filename):
    """
    This function will handle the core OCR processing of images.
    """
    text = pytesseract.image_to_string(Image.open(filename))  # We'll use Pillow's Image class to open the image and pytesseract to detect the string in the image
    return text

print(ocr_core('images/ocr_example_1.png'))

Функция довольно проста, в первых 5 строках мы импортируем изображение из Pillow и нашей библиотеки PyTesseract.

Затем мы создаем функцию ocr_core, которая принимает имя файла и возвращает текст, содержащийся в изображении.

Давайте посмотрим, как скрипт работает с простым изображением, содержащим текст:

Как скрипт работает с простым изображением, содержащим текст

И после запуска фрагмента кода нас приветствует следующее:Запуск скрипта

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

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

Веб-интерфейс Flask

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

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

Начнем с установки пакета Flask:

$ pipenv install Flask

Теперь давайте определим базовый маршрут:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def home_page():
    return "Hello World!"

if __name__ == '__main__':
    app.run()

Сохраните файл и запустите:

$ python3 app.py

Если вы откроете браузер и перейдете к 127.0.0.1:5000 или localhost: 5000, вы должны увидеть «Hello World!» на странице. Это означает, что наше приложение Flask готово к следующим шагам.

Теперь мы создадим папку шаблонов для размещения наших HTML-файлов. Давайте продолжим и создадим простой index.html:

<!DOCTYPE html>
<html>
  <head>
    <title>Index</title>
  </head>
  <body>
    Hello World.
  </body>
</html>

Давайте также настроим наш app.py для рендеринга нашего нового шаблона:

from flask import Flask, render_template
app = Flask(__name__)

@app.route('/')
def home_page():
    return render_template('index.html')

if __name__ == '__main__':
    app.run()

Обратите внимание, что мы импортировали render_template и использовали его для рендеринга HTML-файла. Если вы перезапустите приложение Flask, вы все равно должны увидеть «Hello World!» на главной странице.

Этого достаточно для ускоренного курса Flask, давайте теперь интегрируем наш скрипт OCR в веб-приложение.

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

import os
from flask import Flask, render_template, request

# import our OCR function
from ocr_core import ocr_core

# define a folder to store and later serve the images
UPLOAD_FOLDER = '/static/uploads/'

# allow files of a specific type
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg'])

app = Flask(__name__)

# function to check the file extension
def allowed_file(filename):
    return '.' in filename and \
           filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

# route and function to handle the home page
@app.route('/')
def home_page():
    return render_template('index.html')

# route and function to handle the upload page
@app.route('/upload', methods=['GET', 'POST'])
def upload_page():
    if request.method == 'POST':
        # check if there is a file in the request
        if 'file' not in request.files:
            return render_template('upload.html', msg='No file selected')
        file = request.files['file']
        # if no file is selected
        if file.filename == '':
            return render_template('upload.html', msg='No file selected')

        if file and allowed_file(file.filename):

            # call the OCR function on it
            extracted_text = ocr_core(file)

            # extract the text and display it
            return render_template('upload.html',
                                   msg='Successfully processed',
                                   extracted_text=extracted_text,
                                   img_src=UPLOAD_FOLDER + file.filename)
    elif request.method == 'GET':
        return render_template('upload.html')

if __name__ == '__main__':
    app.run()

Как мы видим в нашей функции upload_page(), мы получим изображение через POST и отобразим загружаемый HTML-код, если запрос GET.

Мы проверяем, действительно ли пользователь загрузил файл, и используем функцию allowed_file(), чтобы проверить, имеет ли файл приемлемый тип.

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

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

Файл upload.html будет обрабатывать публикацию изображения и рендеринг результата с помощью механизма шаблонов Jinja, который по умолчанию поставляется с Flask:

<!DOCTYPE html>
<html>
 <head>
   <title>Upload Image</title>
 </head>
 <body>

   {% if msg %}
   <h1>{{ msg }}</h1>
   {% endif %}
  
   <h1>Upload new File</h1>
  
   <form method=post enctype=multipart/form-data>
     <p><input type=file name=file>
        <input type=submit value=Upload>
   </form>

   <h1>Result:</h1>
   {% if img_src %}
     <img src="{{ img_src }}">
   {% endif %}
  
   {% if extracted_text %}
     <p> The extracted text from the image above is: <b> {{ extracted_text }} </b></p>
  
   {% else %}
     The extracted text will be displayed here
   {% endif %}
 </body>
</html>

Шаблоны Jinja позволяют отображать текст в определенных скриптах с помощью тегов {% if%} {% endif%}. Мы также можем передавать сообщения из нашего приложения Flask для отображения на веб-странице в тегах {{}}. Мы используем форму для загрузки изображения в наше приложение Flask.

Результат:

Начальная страница загрузки

Теперь, если мы продолжим и загрузим наше изображение, сделанное ранее:

Результат загрузки страницы

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

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

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

Неудачное сканирование кавер-версий песен

Это свидетельствует о том, что OCR не всегда на 100% точен и может время от времени нуждаться в вмешательстве человека.

Я также проверил скрипт OCR по моему почерку, чтобы увидеть, как он будет работать, и вот результат:

Проверка скрипта OCR по почерку

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

Результат

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

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

Другие параметры PyTesseract

У Python-Tesseract есть больше возможностей, которые вы можете изучить. Например, вы можете указать язык с помощью флага lang:

pytesseract.image_to_string(Image.open(filename), lang='fra')

Это результат сканирования изображения без lang:

Результат сканирования изображения без lang

А теперь с lang:

Результат сканирования изображения с lang:

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

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

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

print(pytesseract.image_to_osd(Image.open('downloaded_handwritten.png')))

Обнаружение используемых шрифтов

На изображении не было информации о номере страницы, поэтому это не было обнаружено. Движок Tesseract способен извлекать информацию об ориентации текста на изображении и повороте. Уверенность в ориентации – это показатель уверенности двигателя в обнаруженной ориентации, которая действует как ориентир, а также показывает, что она не всегда на 100% точна. Раздел скрипта обозначает систему письма, используемую в тексте, и за ним также следует маркер уверенности.

Если бы мы следили за распознанными символами и их границами боксов, PyTesseract добивается этого с помощью pytesseract.image_to_boxes (Image.open (‘loaded_handwritten.png’)).

Это некоторые из возможностей PyTesseract среди других, такие как преобразование извлеченного текста в PDF-файл с возможностью поиска или вывод HOCR.

Что мы еще не сделали

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

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

Вы также можете создать инструмент CLI. Он позволит вам запустить команду, включая местоположение изображения, а затем распечатать вывод сканера на ваш терминал или отправить его в базу данных или API. Если вы выбрали этот путь, Docopt – фантастический инструмент для создания инструментов командной строки с использованием Python.

Заключение

С помощью Tesseract и библиотеки Python-Tesseract мы смогли сканировать изображения и извлекать из них текст. Это оптическое распознавание символов, которое может быть очень полезно во многих ситуациях.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *