Разворачиваем простой OCR-сервер на Python

в 9:51, , рубрики: computer vision, OCR-технологии, python, Компьютерное зрение, распознавание изображений

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

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

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

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

Для начала нам потребуется установить Tesseract, открытую компьютерную систему для распознавания текстов и Leptonica, библиотеку с открытым исходным кодом, написанную C, предназначенную для обработки и анализа изображений. С её помощью можно выполнять различные операции преобразования, масштабирования, перемещения, сдвига изображений. Также, с её помощью можно работать с различными форматами изображений (JPEG, PNG, TIFF, WebP, JP2, BMP, PNM, PS, GIF и PDF).

Итак, давайте установим все необходимые пакеты.

$ sudo apt-get update

$ sudo apt -y install leptonica-progs

$ sudo apt install tesseract-ocr

Также для работы Tesseract нам потребуется создать переменную среды:

$ export TESSDATA_PREFIX=/usr/local/share/

В завершение установки ставим языковые пакеты. Пакет для английского языка уже установлен. Установим пакет для русского:

$ sudo apt-get install tesseract-ocr-rus

Можно также установить пакеты для всех известных Tesseract языков (потребуется порядка 700 Мб), с помощью команды:

$ sudo apt-get install tesseract-ocr-all

Далее установим библиотеки, необходимые для работы непосредственно Python.

Для начала давайте убедимся, установлен ли Python3.

$ python3 --version

Скорее всего, он у вас уже установлен, но если вдруг чего‑то не хватает, то выполните команду:

$ sudo apt install python3 python3-pip –y

Далее мы будем использовать pip для установки пакетов:

$ pip install pipenv

Создадим каталог для своего проекта:

$ mkdir ocr_server && cd ocr_server && pipenv install --three

Активируем наше виртуальное окружение и устанавливаем необходимые зависимости.

$ pipenv shell

$ pipenv install pytesseract Pillow

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

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

$ pipenv install Flask

Собственно, все необходимые для работы компоненты мы установили. Теперь перейдём к написанию кода.

Пишем код

В простейшем случае нам достаточно просто вызвать функцию pytesseract.image_to_string(), которая попытается распознать текст на картинке.

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

def ocr_core(filename):
    text = pytesseract.image_to_string(Image.open(filename))  
    return text

print(ocr_core('example.png'))

 

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

Разворачиваем простой OCR-сервер на Python - 1

В результате получаем следующее:

Разворачиваем простой OCR-сервер на Python - 2

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

import os

from flask import Flask, render_template, request

# импортируем OCR функцию
from ocr_core import ocr_core

# папка для хранения изображений

UPLOAD_FOLDER = '/static/uploads/'

# разрешаем только определенные типы файлов
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg'])

app = Flask(__name__)

# функция для проверки расширений
def allowed_file(filename):
    return '.' in filename and 
           filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

# функция route, в которой определяется домашняя страница 
@app.route('/')
def home_page():
    return render_template('index.html')

# функция для загрузки файлов
@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):

            # вызываем функцию ocr_core
            extracted_text = ocr_core(file)
            # извлекаем текст и отображаем его
            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()

 

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

Код страницы index.html мы здесь не приводим, так как это может быть любая статичная заглушка; или можно страницу загрузки, приведённую ниже, использовать как дефолтную.

Код файла upload.html

<!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 для отображения на веб‑странице с помощью тегов {{ }}.

В итоге страница с загрузкой будет иметь следующий вид:

Разворачиваем простой OCR-сервер на Python - 3

А после загрузки нашего тестового примера example.png мы получим следующее:

Разворачиваем простой OCR-сервер на Python - 4

Заключение

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


Всем, кому интересна тема компьютерного зрения, рекомендую обратить внимание на открытый урок 17 февраля на тему «Аугментация данных в компьютерном зрении».

Рассмотрим, что такое аугментация и зачем она нужна, познакомимся с torchvision transforms и albumentations, разберём написание случайной композиции аугментаций. Если актуально, записывайтесь на странице курса «Компьютерное зрение».

Автор: Andrey_Biryukov

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js