OCR

Provision OCR

Распознавание текста из изображений и PDF-документов с точностью до 99.5%. Self-hosted развёртывание, поддержка CPU и GPU, REST API с клиентами для популярных языков.

Инструкция по установке и запуске

Выберите платформу для пошаговой инструкции.

⚠️ Лицензионные и технические ограничения триальной версии

Trial-версия Provision OCR предназначена для ознакомления и тестирования. Ограничения: макс. 100 страниц/день, водяной знак в ответе, отсутствует техподдержка.
📄 Полный документ с ограничениями (PDF)

🪟 Windows

Скачать .exe установщик: provision_ocr_trial.exe
Запустите: provision_ocr_trial.exe
В открывшемся окне выберите: язык и путь установки
Нажмите: Установить
Запустите: ProvisionOCR.exe из директории ProvisionScan/
В открывшемся консольном окне дождитесь статуса Provision Scan: READY
В поле Listening on будет указан URL для API
Из папки, в которой установлен OCR, запустите файл ProvisionOCR.exe
CUDA на Windows: убедитесь, что установлен CUDA Toolkit 11.8+ и драйвер NVIDIA ≥ 520.

🐧 Linux

В разработке. Нативный Linux-пакет находится в разработке. Для Linux рекомендуется использовать Docker-образ.

🐳 Docker

Shell
# Скачайте докер образ:
docker pull registry.provlabs.tech/hub/trial/provision_ocr:latest
Shell
# Запустите контейнер:
docker run -d `
  --name provision_ocr `
  --gpus all `
  -p 8098:8098 `
  --restart always `
  registry.provlabs.tech/hub/trial/provision_ocr:latest

--gpus all: тег для запуска на GPU. Для запуска на CPU или MacOS нужно исключить данный тег
После успешного старта сервис доступен по адресам:
  • API: http://localhost:8101/
  • Swagger UI: http://localhost:8101/docs
  • Health check: http://localhost:8101/health

Совместимость

Provision OCR работает на CPU и GPU. Для высокой скорости обработки рекомендуется GPU с 8+ GB VRAM.

GPU

Вендор Серия VRAM (мин.) Бэкенд Статус
NVIDIA RTX 3060 / 4060 / 4070 8 GB CUDA 11.8+ Рекомендуется
NVIDIA RTX 3080 / 4080 / 4090 12 GB CUDA 12.x Рекомендуется
NVIDIA A4000 / A10 / L4 16 GB CUDA 12.x Протестировано
NVIDIA GTX 10xx / 16xx 8 GB CUDA 11.x Частично
Apple M1 / M2 / M3 / M4 16 GB unified Metal / MLX Протестировано
CPU only Любой x86_64 / ARM64 Медленнее

Операционные системы

ОС Архитектура RAM (мин.) Статус
Ubuntu 20.04 / 22.04 / 24.04 x86_64, ARM64 8 GB Рекомендуется
Debian 11 / 12 x86_64 8 GB Протестировано
Windows 10 / 11 x86_64 8 GB Протестировано
macOS 13+ (Ventura) ARM64 (Apple Silicon) 16 GB Протестировано
Docker (Linux образ) x86_64, ARM64 8 GB Рекомендуется
Внимание: запуск на CPU значительно медленнее. Для production рекомендуется GPU с ≥ 8 GB VRAM.

Шаблоны документов

Передаётся в URL как параметр {template} при вызове /processing/{template}.

Шаблон Описание
passport Паспорт гражданина РФ
snils СНИЛС
agreement Договор
default Универсальный шаблон (поддерживает таблицы)

API Reference

Base URL: http://localhost:8098. Все ответы в формате JSON.

📄 OCR Endpoints

POST /processing/{template} Основной эндпоинт распознавания документа
templatestring (path)Шаблон документа: passport, snils, agreement, default required
bodybinary / multipartИзображение в бинарном виде или multipart с полем file / body required

Поддерживаемые форматы: image/jpeg, image/png, image/bmp, image/tiff, multipart/form-data

Response 200
{
  "documents": [
    {
      "width": 715,
      "height": 999,
      "schema_version": 1,
      "pages": [
        {
          "page_number": 1,
          "loc": { "x1": 0, "y1": 0, "x2": 715, "y2": 999 },
          "blocks": [ ... ],
          "paragraphs": [ ... ],
          "tables": [ ... ],
          "figures": [ ... ]
        }
      ]
    }
  ]
}
Код Описание
200 Результат распознавания
400 Некорректный запрос (отсутствует файл, неизвестный шаблон, ошибка пайплайна)
415 Неподдерживаемый формат изображения
POST /processing2/{template} Сохранено для обратной совместимости с устаревшими клиентами, которые использовали /processing2 путь.
templatestring (path)Шаблон документа: passport, snils, agreement, default required
bodybinary / multipartИзображение в бинарном виде или multipart с полем file / body required

Поддерживаемые форматы: image/jpeg, image/png, image/bmp, image/tiff, multipart/form-data

Response 200
{
  "documents": [
    {
      "width": 715,
      "height": 999,
      "schema_version": 1,
      "pages": [
        {
          "page_number": 1,
          "loc": { "x1": 0, "y1": 0, "x2": 715, "y2": 999 },
          "blocks": [ ... ],
          "paragraphs": [ ... ],
          "tables": [ ... ],
          "figures": [ ... ]
        }
      ]
    }
  ]
}
Код Описание
200 Результат распознавания
400 Некорректный запрос (отсутствует файл, неизвестный шаблон, ошибка пайплайна)
415 Неподдерживаемый формат изображения

🔗 Общие эндпоинты

POST /health Проверка доступности сервиса (liveness probe)
Response 200
{ "status": "ok" }
Код Описание
200 Сервис работает нормально
503 Сервис временно недоступен (middleware отключён)
POST /reload_service Выгрузить и перезагрузить все ONNX-модели без перезапуска сервиса

Перезагружает модели: Mask R-CNN, CRAFT, TextRecognizer, CharRecognizer, EfficientNet, Edge. Полезно после замены весов на диске.

Response 200
{ "status": "ok" }

📋 Формат ответа

Все эндпоинты распознавания возвращают единую структуру.

Структура верхнего уровня

Поле Тип Описание
width int Ширина изображения в пикселях
height int Высота изображения в пикселях
schema_version int Версия формата ответа
pages array Страницы документа (обычно 1–2)

Объект Page

Поле Тип Описание
page_number int Номер страницы (с 1)
loc object Bounding box страницы: x1, y1, x2, y2
blocks array Плоский список всех распознанных блоков
paragraphs array Сгруппированные блоки — основной источник полей при шаблонном распознавании
tables array Таблицы (заполняется для шаблона default)
figures array Обнаруженные фигуры / изображения

Объект Block

Поле Тип Описание
text string Распознанный текст блока
tag string Семантический тег (lastName, dateIssued, word, header, data, …)
prob float Уверенность распознавания (0–1)
loc object Bounding box: x1, y1, x2, y2

Объект Paragraph (пустой в шаблоне default)

Группирует несколько Block-ов в одно логическое поле. text — конкатенация всех блоков.

Поле Тип Описание
tag string Тег поля документа
text string Объединённый текст всех блоков
prob float Уверенность (0–1)
loc object Bounding box параграфа
blocks array Отдельные блоки внутри параграфа

Объект Table (шаблон default)

cells — двумерный массив строк и столбцов.

Поле ячейки Тип Описание
tag string header — заголовок, data — данные
text string Текст ячейки
prob float Уверенность (0–1)
colspan int Объединение столбцов
rowspan int Объединение строк
loc object Bounding box ячейки
blocks array Блоки внутри ячейки

Теги полей паспорта

Тег Описание
lastName Фамилия
firstName Имя
middleName Отчество
birthday Дата рождения
birthPlace Место рождения
gender Пол
dateIssued Дата выдачи
placeIssued Кем выдан
codeIssued Код подразделения
ru_passport_number Серия и номер паспорта

Примеры кода

Готовые сниппеты для работы с Provision OCR API.

🐍 Python — передача изображения в бинарном виде

Python
import requests

with open("passport.jpg", "rb") as f:
    response = requests.post(
        "http://localhost:8098/processing/passport",
        data=f,
        headers={"Content-Type": "image/jpeg"},
    )

result = response.json()
doc = result["documents"][0]
page = doc["pages"][0]

# Извлечь все поля по тегу из параграфов
fields = {p["tag"]: p["text"] for p in page["paragraphs"]}
print(fields)
# {'birthPlace': 'ГОР.', 'codeIssued': '741-002', 'dateIssued': '16.03.2007', ...}

🐍 Python — передача через multipart/form-data

Python
import requests

with open("snils.jpg", "rb") as f:
    response = requests.post(
        "http://localhost:8098/processing/snils",
        files={"file": ("snils.jpg", f, "image/jpeg")},
    )

result = response.json()
page = result["documents"][0]["pages"][0]
fields = {p["tag"]: p["text"] for p in page["paragraphs"]}
print(fields)

🐍 Python — обход таблиц (шаблон default)

Python
import requests

with open("balance.jpg", "rb") as f:
    response = requests.post(
        "http://localhost:8098/processing/default",
        data=f,
        headers={"Content-Type": "image/jpeg"},
    )

page = response.json()["documents"][0]["pages"][0]
for table in page["tables"]:
    for row in table["cells"]:
        print([cell["text"] for cell in row])

🐍 Python — получить все блоки со страницы

Python
import requests

with open("document.png", "rb") as f:
    response = requests.post(
        "http://localhost:8098/processing/default",
        data=f,
        headers={"Content-Type": "image/png"},
    )

page = response.json()["documents"][0]["pages"][0]
for block in page["blocks"]:
    print(block["text"], block["tag"], block["prob"], block["loc"])

⚡ curl

Bash — Health check
curl -X POST http://localhost:8098/health
Bash — Распознавание паспорта
curl -X POST http://localhost:8098/processing/passport \
  -H "Content-Type: image/jpeg" \
  --data-binary @passport.jpg

FAQ / Поддержка

Ответы на часто задаваемые вопросы по Provision OCR.

Какие форматы документов поддерживает OCR?
PNG, JPG/JPEG, TIFF, BMP, WEBP и PDF (в том числе многостраничные). Максимальный размер файла — 50 MB. Для больших PDF рекомендуется асинхронный режим (async: true).
Какое оборудование нужно для запуска?
Минимально: 8 GB RAM, x86_64 процессор. Для GPU-ускорения: NVIDIA с 8+ GB VRAM и CUDA 11.8+. На CPU OCR работает, но значительно медленнее — для production рекомендуется GPU.
Как включить аутентификацию по API-ключу?
В файле provision.yml задайте api_key: your-secret-key. После перезапуска все запросы должны содержать заголовок Authorization: Bearer your-secret-key. Для Docker используйте переменную PROVISION_API_KEY.
Поддерживается ли WSL2?
Да. Установите Provision OCR в WSL2 так же, как на Linux. GPU-проброс через NVIDIA CUDA в WSL2 поддерживается с драйвера 525+. Используйте пакет provision-ocr-linux-amd64.
Как сообщить об ошибке?
Создайте issue на GitHub или напишите на help@provisionlabs.ru. Для срочных вопросов — Telegram-канал поддержки.