eslav_PP-OCRv5_mobile_rec для русского, PP-OCRv6_medium_rec для английского), смена детектора PP-OCRv5_server_det → PP-OCRv6_medium_det без апгрейда paddlepaddleeslav vs cyrillic (обе mobile, разница ~1%), PP-OCRv6_medium_rec (46 латинских + CN/JP/EN, без кириллицы), PP-FormulaNet для формул, SLANeXt для таблицthresh (порог карты вероятности), box_thresh (фильтр bbox), unclip_ratio (расширение контура), max_side_limit (обрезает upscale)paddlexSURYA_INFERENCE_KEEP_ALIVE=true (-23s повторный старт), CTX_PER_SLOT=8192 (-30% RAM), PARALLEL=1 (-80% слотов), pre-scale=1056px (~96 DPI), -t 8 --threads-batch 8 (стабильная загрузка CPU)http://host:port/health, пересоздание engine при падении llama-server, lru_cache.cache_clear() для сбросаmin_area ≥ 30% (чтобы не детектить внутренние таблицы как страницу)fastNlMeansDenoisingColored — Non-Local Means. Полезен для шумных сканов, NOP для чистых. НЕ вреден для нейросетевого OCRadaptiveThreshold (Gaussian, окно 31) вредна для нейросетевого OCR — жёсткие границы рвут буквы, создают ложные контуры. Нейросети обучены на естественных изображениях, не на бинарныхcv2.resize(INTER_CUBIC) бесполезен, если OCR-движок обрезает max_side_limitParsedBlock, OcrPageResult → отдельный models.py — 7 модулей отвязаны от paddle_engineCallable[[ParsedBlock], None] проще@functools.lru_cache(maxsize=N) вместо _engine: X | None = None + global _engineload_env() с внутренним guard’ом — не нужны внешние _ENV_LOADED флагиcall_qwen_vlm() + image_to_base64() в qwen_client.py — общий для OCR-движка и корректораAnnotated[Path, typer.Option("--input", "-i")] — минимум бойлерплейта= None, булевы через --flag / --no-flag<details><summary>--help</summary>...</details>opencv-contrib-python и opencv-python-headless делят cv2/ — удаление одного ломает другой. Выбор: headless легче (-18 MB), без X11paddlepaddle==3.2.2 (баг ONEDNN/PIR в 3.3.1), numpy<2.4 (paddlex ограничение), opencv-python-headless<5.0 (surya-ocr требует 4.11)parsing_res_list, Surya blocks[].html, Qwen blocks[].content), автоопределение по структуреHTML_TEMPLATE, CDN MathJax 3, $$...$$ для display-формул<table> → LaTeX tabular, Markdown |...| → HTML <table>stage2_results.md — 16 вариантов, маркировка ✅/❌/⚠️, причина решения| Что | Причина |
|---|---|
| LLM-корректор (Qwen2.5-7B, 4.4 GB) | Галлюцинации, слепой, большой |
| Binarization (adaptive threshold) | Вредна для нейросетевого OCR |
| Upscale ×2 | max_side_limit=4000 съедает |
| surya2html.py, tex2html.py | Дубликаты json_to_latex.py |
| 100+ пакетов в requirements.txt | Транзитивные зависимости pip freeze |
| 2.2 GB мёртвых моделей | Неиспользуемые v5 и cyrillic |