Тема компьютерного зрения достаточно обширна: в ней рассматриваются различные способы распознавания статичных изображений и видео. Однако многие из предлагаемых в интернете решений требуют повышенных вычислительных мощностей, сложного ПО и специального оборудования.
В этой статье мы не будем рассматривать что‑то сложное, а вместо этого разберём создание простого сервера для распознавания изображений на 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 - 1](https://www.pvsm.ru/images/2025/02/11/razvorachivaem-prostoi-OCR-server-na-Python.png)
В результате получаем следующее:
![Разворачиваем простой OCR-сервер на Python - 2 Разворачиваем простой OCR-сервер на Python - 2](https://www.pvsm.ru/images/2025/02/11/razvorachivaem-prostoi-OCR-server-na-Python-2.png)
Далее давайте добавим функциональность для загрузки изображений на веб-сервер 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 Разворачиваем простой OCR-сервер на Python - 3](https://www.pvsm.ru/images/2025/02/11/razvorachivaem-prostoi-OCR-server-na-Python-3.png)
А после загрузки нашего тестового примера example.png мы получим следующее:
![Разворачиваем простой OCR-сервер на Python - 4 Разворачиваем простой OCR-сервер на Python - 4](https://www.pvsm.ru/images/2025/02/11/razvorachivaem-prostoi-OCR-server-na-Python-4.png)
Заключение
Конечно, в этой статье мы рассмотрели достаточно простой пример работы с распознаванием изображений. Но целью было показать, как можно достаточно легко и без лишних затрат реализовать простой веб-сервер для OCR на Python.
Всем, кому интересна тема компьютерного зрения, рекомендую обратить внимание на открытый урок 17 февраля на тему «Аугментация данных в компьютерном зрении».
Рассмотрим, что такое аугментация и зачем она нужна, познакомимся с torchvision transforms и albumentations, разберём написание случайной композиции аугментаций. Если актуально, записывайтесь на странице курса «Компьютерное зрение».
Автор: Andrey_Biryukov