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

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

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

Предварительные условия

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

Создание API OCR

В этом руководстве вы узнаете, как создать приложение Flask, которое позволяет пользователям загружать изображения через конечную точку POST, которая затем загружается с помощью Pillow и обрабатывается с помощью оболочки PyTesseract (для механизма OCR Tesseract). Наконец, он возвращает извлеченный текст в качестве ответа на запрос.

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

Для начала создайте новый каталог для вашего проекта. Затем настройте новую виртуальную среду в папке, выполнив следующие команды:

python3 -m venv env
source env/bin/activate

Затем установите Flask, PyTesseract, Gunicorn и Pillow, выполнив следующую команду:

pip3 install pytesseract flask pillow gunicorn

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

Например, в MacOS вы можете установить Tesseract с помощью Homebrew, выполнив следующую команду:

brew install tesseract

Как только это будет сделано, оболочка PyTesseract сможет взаимодействовать с механизмом OCR и обрабатывать запросы OCR.

Теперь вы готовы написать приложение Flask. Создайте новый каталог с именем окрапи и новый файл в этом каталоге с именем main.py. Сохраните в нем следующее содержимое:

from flask import Flask, request, jsonify
from PIL import Image
import pytesseract

app = Flask(__name__)

@app.route('/ocr', methods=['POST'])
def ocr_process():
    if request.method == 'POST':
        image_file = request.files['image']
        image_data = Image.open(image_file)

        # Perform OCR using PyTesseract
        text = pytesseract.image_to_string(image_data)

        response = {
            'status': 'success',
            'text': text
        }

        return jsonify(response)

Приведенный выше код создает базовое приложение Flask с одной конечной точкой —/ocr. Когда вы отправляете POST-запрос в эту конечную точку с файлом изображения, он извлекает файл, использует метод pytesseract оболочка для выполнения оптического распознавания символов с использованием ее code_to_string() метод и отправляет обратно извлеченный текст как часть ответа.

Создать wsgi.py файл в том же окрапи каталог и сохраните в нем следующее содержимое:

from ocrapi.main import app as application

if __name__ == "__main__":
    application.run()

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

gunicorn ocrapi.wsgi

Ваш базовый API OCR готов, и пришло время его протестировать!

Локальное тестирование API OCR

Вы можете использовать встроенный CLI cURL для отправки запросов к вашему API или переключиться на инструмент детального тестирования API, такой как Postman. Чтобы протестировать API, вам нужно будет загрузить образец изображения с текстом. Вы можете использовать этот простой вариант или этот, набросанный на данный момент.

Загрузите любой из них в каталог проекта и присвойте ему простое имя, например: простое изображение.png или нарисованное-изображение.png, в зависимости от выбранного вами изображения.

Затем откройте терминал и перейдите в каталог вашего проекта. Запустите следующую команду, чтобы протестировать API:

curl -X POST -F “[email protected]” localhost:5000/ocr

Это отправит запрос к вашему OCR API и вернет аналогичный ответ:

{
  "status": "success",
  "text": "This looks like it was written in a hucry\n\n"
}

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

{
  "status": "success",
  "text": "This looks like it was written with a steady hand\n\n"
}

Это также демонстрирует точность механизма OCR Tesseract. Теперь вы можете разместить свой OCR API на хостинге приложений Kinsta, чтобы к нему можно было получить доступ в Интернете.

Развертывание API OCR

Чтобы развернуть свое приложение в Kinsta, сначала необходимо отправить код проекта поставщику Git (Bitbucket, GitHub или GitLab).

Прежде чем отправлять код, вам необходимо настроить Tesseract отдельно в вашей хост-системе, чтобы иметь возможность использовать с ним оболочку PyTesseract. Чтобы иметь возможность использовать оболочку на платформе приложений Kinsta (или в любой другой среде в целом), вам также необходимо настроить ее там.

Если вы работали с удаленными вычислительными экземплярами (например, AWS EC2), вы могли подключиться к вычислительному экземпляру по протоколу SSH и запустить соответствующую команду для установки на него пакета.

Однако платформы приложений не предоставляют прямого доступа к хосту. Вам нужно будет использовать такое решение, как Nixpacks, Buildpacks или Dockerfiles, чтобы настроить первоначальные требования к среде вашего приложения (включая локальную настройку пакета Tesseract), а затем установить приложение.

Добавить nixpacks.toml файл в каталоге вашего проекта со следующим содержимым:

# nixpacks.toml

providers = ["python"]

[phases.setup]
nixPkgs = ["...", "tesseract"]

[phases.build]
cmds = ["echo building!", "pip install -r requirements.txt", "..."]

[start]
cmd = "gunicorn ocrapi.wsgi"

Это даст указание платформе сборки

  1. Используйте среду выполнения Python для создания и запуска вашего приложения.
  2. Настройте пакет Tesseract в контейнере вашего приложения.
  3. Запустите приложение, используя gunicorn.

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

pip3 freeze > requirements.txt

Как только ваш репозиторий Git будет готов, выполните следующие действия, чтобы развернуть API OCR в Kinsta:

  1. Войдите в систему или создайте учетную запись, чтобы просмотреть панель управления MyKinsta.
  2. Авторизуйте Kinsta у своего провайдера Git.
  3. На левой боковой панели нажмите Приложения а затем нажмите Добавить приложение.
  4. Выберите репозиторий и ветку, из которой вы хотите выполнить развертывание.
  5. Выберите одно из доступных мест дата-центра из списка из 36 вариантов. Kinsta автоматически определяет настройки сборки ваших приложений через файл Nixpack, поэтому оставьте поле команды запуска пустым.
  6. Выберите ресурсы приложения, такие как оперативная память и дисковое пространство.
  7. Нажмите Создать заявку.

После завершения развертывания скопируйте ссылку на развернутое приложение и выполните следующую команду в интерфейсе командной строки:

curl -x POST -F “[email protected]” <your-deployed-app-link>/ocr

Это должно вернуть тот же ответ, который вы получили локально:

{"status":"success","text":"This looks like it was written with a steady hand\n\n"}

Вы также можете использовать Postman для тестирования API.

Пробуем приложение в Postman

На этом разработка базового API OCR завершена. Вы можете получить доступ к полному коду этого проекта на GitHub.

Краткое содержание

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

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

Какая функция, по вашему мнению, необходима для локального API OCR? Дайте нам знать в комментариях ниже!