Единый скрипт src/cli.py → разрезание изображений на страницы (Stage 1). Нужен Stage 2 — распознавание текста и структуры документа, генерация LaTeX/HTML/Markdown для последующего анализа LLM.
Результат: 66 текстовых блоков, русский текст — ~60% точности.
i-WHAeKC AOrOBOpa вместо і - индекс договораt - номер месяцаB дефолте — латиница смешана с кириллицейРезультат: 22 структурированных блока с layout-разметкой.
[number], [formula], [text], [paragraph_title]\mathrm{C Rec}_{\mathrm{it}}=\sum...Результат: разница ~1-2%, несущественна.
LGD_ехtг; (кириллица г)LGD_ехtr; (латиница r) — чуть лучшеРезультат: ❌ не поддерживают русский язык.
Результат: +25% читаемости текста.
До: t - номер месяцаB дефолте, на который прогнозируются возвраты
После: т — номер месяца в диапазоне между текущим сроком в дефолте и горизонтом взыскания
Результат: полное восстановление текста + автоопределение inline-формул.
До: ΣДсе, - дисконтированная сумма возвратов
После: $\sum_t DCF_{i,t}$ — дисконтированная сумма возвратов, получаемых на t-ом периоде
zen/go/v1/messagesРезультат: ❌ не поддерживает PaddleOCR как OCR-backend.
Результат: модель загружена (1.79 GB), но ~15 мин/стр на CPU.
Результат: ⭐ лучший русский OCR из коробки.
<math>MRec_{it}</math>$$...$$ формулами Входное изображение (JPEG/PNG/TIFF)
│
┌─────────────┴─────────────┐
│ src/image_split.py │
│ --slice / --slice-auto │
│ --pre-rotate, --border │
│ --post-crop (default ON) │
└─────────────┬─────────────┘
│
JPEG страницы
│
┌─────────────┴─────────────┐
│ src/image_to_latex.py │
│ --ocr-engine paddle/surya │
│ --llm, --vlm (optional) │
└─────────────┬─────────────┘
│
┌─────────────────────┼─────────────────────┐
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ src/ocr/ │ │ src/postprocess/ │ │ src/postprocess/ │
│ paddle_engine │ │ fixups.py │ │ llm_corrector │
│ surya_engine │ │ vlm_corrector │ │ corrector.py │
└────────┬────────┘ └────────┬────────┘ └────────┬────────┘
│ │ │
└────────────────────┼─────────────────────┘
│
ParsedBlock[]
│
┌─────────────┴─────────────┐
│ src/markdown/ │
│ generator.py │
│ Валидация $, {}, \left │
└─────────────┬─────────────┘
│
┌───────────────────┼───────────────────┐
▼ ▼ ▼
.json (raw) .md .tex + .html
(PP-StructureV3 (Markdown) (LaTeX + MathJax)
полный дамп)
src/
cli_utils.py — run_main() общий для CLI
image_split.py — CLI разрезания (Stage 1)
image_to_latex.py — CLI OCR (Stage 2)
split/
slicer.py — разрезание, поворот, рамка, post-crop
ocr/
paddle_engine.py — PP-StructureV3 + кастом YAML (eslav)
surya_engine.py — Surya 2 VLM + llama.cpp
postprocess/
fixups.py — VaR, V^2
corrector.py — Corrector Protocol + apply_corrector()
llm_corrector.py — Qwen2.5-7B локально (llama-cpp-python)
vlm_corrector.py — Qwen3.8 Max через OpenCode API (Anthropic)
markdown/
generator.py — Markdown + валидация LaTeX
latex/
tex2html.py — .tex → .html + MathJax
~/.paddlex/official_models/ (PaddleOCR, ~2.5 GB)
PP-DocLayout_plus-L layout detection
PP-OCRv5_server_det text detection
eslav_PP-OCRv5_mobile_rec RU/EN recognition
PP-OCRv5_server_rec EN/CN recognition
SLANeXt_wired table structure
PP-FormulaNet_plus-L formula recognition (728 MB)
~/.cache/llama_models/ (LLM, ~4.4 GB)
Qwen2.5-7B-Instruct-Q4_K_M.gguf локальный корректор
HF Hub (Surya 2, ~1.5 GB)
datalab-to/surya-ocr-2-gguf 650M VLM
| Параметр | PaddleOCR (PP-StructV3) | Surya 2 |
|---|---|---|
| Архитектура | Ансамбль 5 моделей | Один VLM (650M) |
| Русский текст | ~85% | 95%+ |
| Формулы | PP-FormulaNet (отлично) | VLM (отлично) |
| Таблицы | PP-TableMagic + bbox | HTML <table> |
| Inline-формулы | Не детектируются | <math> тэги |
| Скорость CPU | ~140s | ~430s |
| Размер моделей | ~2.5 GB | ~1.5 GB |
| LLM-коррекция | Нужна для русского | Не нужна |
| VLM-коррекция | Нужна для сложных мест | Не нужна |
| Этап | PaddleOCR | Surya 2 |
|---|---|---|
| Image split + post-crop | 1-2s | 1-2s |
| OCR | 140s | 430s |
| LLM-корректор (Qwen2.5-7B) | ~20s/блок | не нужен |
| VLM-корректор (Qwen3.8 Max) | ~10s/блок | не нужен |
| Markdown генерация | <1s | <1s |
| Итого на страницу | ~5 min | ~7 min |
PaddleOCR PP-StructureV3 — надёжный выбор для структуры документа и формул. Русский текст требует коррекции (LLM или VLM).
Surya 2 — лучший русский OCR из коробки, авто inline-формулы. Медленнее на CPU, но качество несравнимо выше.
Гибрид Surya 2 + PP-FormulaNet — теоретически лучший вариант (Surya для текста, Paddle для формул), не реализован.
LLM/VLM коррекция — эффективна для PaddleOCR, не нужна для Surya 2.
OpenCode Go API — практичный способ подключить мощную VLM без локального GPU.