|
|
@@ -22,7 +22,7 @@
|
|
22
|
22
|
JPEG/TIFF/PNG (многостраничный скан)
|
|
23
|
23
|
│
|
|
24
|
24
|
▼
|
|
25
|
|
-src/image_split.py ← Stage 1: разрезание
|
|
|
25
|
+src/image_prepare.py ← Stage 1: подготовка (разрезание, обрезка)
|
|
26
|
26
|
│ --slice / --slice-auto
|
|
27
|
27
|
│ --pre-rotate, --border
|
|
28
|
28
|
│ --post-crop
|
|
|
@@ -31,7 +31,7 @@ src/image_split.py ← Stage 1: разрезание
|
|
31
|
31
|
JPEG страницы
|
|
32
|
32
|
│
|
|
33
|
33
|
▼
|
|
34
|
|
-src/image_ocr.py ← Stage 2: OCR + Markdown (бывший image_to_latex.py)
|
|
|
34
|
+src/image_ocr.py ← Stage 2: OCR + Markdown
|
|
35
|
35
|
│ --ocr-engine paddle|surya
|
|
36
|
36
|
│ --input file.jpg (одна страница)
|
|
37
|
37
|
│ --input pages/ (пакетный режим: все изображения в каталоге)
|
|
|
@@ -52,7 +52,7 @@ src/image_ocr.py ← Stage 2: OCR + Markdown (бывший image_to_la
|
|
52
|
52
|
|
|
53
|
53
|
## Параметры
|
|
54
|
54
|
|
|
55
|
|
-### Stage 1: `src/image_split.py`
|
|
|
55
|
+### Stage 1: `src/image_prepare.py`
|
|
56
|
56
|
|
|
57
|
57
|
| Параметр | Описание | По умолчанию |
|
|
58
|
58
|
|----------|----------|:---:|
|
|
|
@@ -66,10 +66,58 @@ src/image_ocr.py ← Stage 2: OCR + Markdown (бывший image_to_la
|
|
66
|
66
|
|
|
67
|
67
|
Пример:
|
|
68
|
68
|
```bash
|
|
69
|
|
-python -m src.image_split -i scan.jpg -s 3:3 -b 10 -o pages/
|
|
70
|
|
-python -m src.image_split -i scan.jpg --slice-auto
|
|
|
69
|
+python -m src.image_prepare -i scan.jpg -s 3:3 -b 10 -o pages/
|
|
|
70
|
+python -m src.image_prepare -i scan.jpg --slice-auto
|
|
71
|
71
|
```
|
|
72
|
72
|
|
|
|
73
|
+<details>
|
|
|
74
|
+<summary><code>--help</code></summary>
|
|
|
75
|
+
|
|
|
76
|
+```
|
|
|
77
|
+ Usage: python -m src.image_prepare [OPTIONS]
|
|
|
78
|
+
|
|
|
79
|
+ Подготовить отсканированное изображение: разрезать по сетке, обрезать,
|
|
|
80
|
+ добавить рамку.
|
|
|
81
|
+
|
|
|
82
|
+╭─ Options ────────────────────────────────────────────────────────────────────╮
|
|
|
83
|
+│ --input -i <file> Путь к входному │
|
|
|
84
|
+│ изображению (JPEG, │
|
|
|
85
|
+│ PNG, TIFF) │
|
|
|
86
|
+│ --slice -s <str> Размер сетки в │
|
|
|
87
|
+│ формате │
|
|
|
88
|
+│ <колонки>:<строки>, │
|
|
|
89
|
+│ например 3:2 │
|
|
|
90
|
+│ --slice-auto -a Автоматически │
|
|
|
91
|
+│ определить размер │
|
|
|
92
|
+│ сетки по содержимому │
|
|
|
93
|
+│ изображения │
|
|
|
94
|
+│ --output-dir -o <directory> Каталог для │
|
|
|
95
|
+│ сохранения │
|
|
|
96
|
+│ результатов (по │
|
|
|
97
|
+│ умолчанию — текущий) │
|
|
|
98
|
+│ [default: .] │
|
|
|
99
|
+│ --pre-rotate -r <int> Поворот изображения │
|
|
|
100
|
+│ перед разрезанием: │
|
|
|
101
|
+│ 90, 180 или 270 │
|
|
|
102
|
+│ --border -b <int range> [x>=0] Отступ в пикселях │
|
|
|
103
|
+│ (белая рамка / │
|
|
|
104
|
+│ отступ при обрезке │
|
|
|
105
|
+│ содержимого, по │
|
|
|
106
|
+│ умолчанию 50) │
|
|
|
107
|
+│ [default: 50] │
|
|
|
108
|
+│ --post-crop -c --no-post-crop Обрезать каждую │
|
|
|
109
|
+│ страницу по границам │
|
|
|
110
|
+│ полезного │
|
|
|
111
|
+│ содержимого │
|
|
|
112
|
+│ (включено по │
|
|
|
113
|
+│ умолчанию) │
|
|
|
114
|
+│ [default: post-crop] │
|
|
|
115
|
+│ --help Show this message │
|
|
|
116
|
+│ and exit. │
|
|
|
117
|
+╰──────────────────────────────────────────────────────────────────────────────╯
|
|
|
118
|
+```
|
|
|
119
|
+</details>
|
|
|
120
|
+
|
|
73
|
121
|
### Stage 2: `src/image_ocr.py`
|
|
74
|
122
|
|
|
75
|
123
|
| Параметр | Описание | По умолчанию |
|
|
|
@@ -104,6 +152,58 @@ python -m src.image_ocr -i ./pages/ --ocr-engine surya --no-result-one-document
|
|
104
|
152
|
python -m src.image_ocr -i page.jpg --ocr-engine paddle --fix-by-llm
|
|
105
|
153
|
```
|
|
106
|
154
|
|
|
|
155
|
+<details>
|
|
|
156
|
+<summary><code>--help</code></summary>
|
|
|
157
|
+
|
|
|
158
|
+```
|
|
|
159
|
+ Usage: python -m src.image_ocr [OPTIONS]
|
|
|
160
|
+
|
|
|
161
|
+ OCR → PostProcess → Markdown. Принимает файл или каталог изображений.
|
|
|
162
|
+
|
|
|
163
|
+╭─ Options ────────────────────────────────────────────────────────────────────╮
|
|
|
164
|
+│ * --input -i <path> Путь к входному │
|
|
|
165
|
+│ изображению или │
|
|
|
166
|
+│ каталогу (JPEG, PNG, │
|
|
|
167
|
+│ TIFF) │
|
|
|
168
|
+│ [required] │
|
|
|
169
|
+│ * --ocr-engine <str> OCR-движок: paddle │
|
|
|
170
|
+│ (PP-StructureV3), │
|
|
|
171
|
+│ surya (Surya 2 VLM) │
|
|
|
172
|
+│ или external-qwen3 │
|
|
|
173
|
+│ (Qwen3.8 Max API) │
|
|
|
174
|
+│ [required] │
|
|
|
175
|
+│ --output-dir -o <directory> Каталог для │
|
|
|
176
|
+│ сохранения │
|
|
|
177
|
+│ результатов (по │
|
|
|
178
|
+│ умолчанию — рядом с │
|
|
|
179
|
+│ входным файлом) │
|
|
|
180
|
+│ --fix-by-llm Исправить OCR-ошибки │
|
|
|
181
|
+│ локальным LLM │
|
|
|
182
|
+│ (Qwen2.5-7B). Не │
|
|
|
183
|
+│ работает с │
|
|
|
184
|
+│ --ocr-engine │
|
|
|
185
|
+│ external-qwen3 │
|
|
|
186
|
+│ --fix-by-external-q… Исправить OCR-ошибки │
|
|
|
187
|
+│ внешней VLM (Qwen3.8 │
|
|
|
188
|
+│ Max, API). Не │
|
|
|
189
|
+│ работает с │
|
|
|
190
|
+│ --ocr-engine │
|
|
|
191
|
+│ external-qwen3 │
|
|
|
192
|
+│ --no-result-one-doc… Не объединять .md │
|
|
|
193
|
+│ результаты в один │
|
|
|
194
|
+│ документ │
|
|
|
195
|
+│ [default: True] │
|
|
|
196
|
+│ --pause <int range> Пауза между │
|
|
|
197
|
+│ [0<=x<=600] изображениями в │
|
|
|
198
|
+│ секундах (по │
|
|
|
199
|
+│ умолчанию 5) │
|
|
|
200
|
+│ [default: 5] │
|
|
|
201
|
+│ --help Show this message and │
|
|
|
202
|
+│ exit. │
|
|
|
203
|
+╰──────────────────────────────────────────────────────────────────────────────╯
|
|
|
204
|
+```
|
|
|
205
|
+</details>
|
|
|
206
|
+
|
|
107
|
207
|
### Debug-лог
|
|
108
|
208
|
|
|
109
|
209
|
Для отладки зависаний и падений — файл с полным логом всех этапов обработки.
|
|
|
@@ -255,8 +355,8 @@ llama-server не указывает количество потоков — п
|
|
255
|
355
|
|
|
256
|
356
|
```
|
|
257
|
357
|
src/
|
|
258
|
|
- image_split.py — CLI Stage 1
|
|
259
|
|
- image_ocr.py — CLI Stage 2 (бывший image_to_latex.py)
|
|
|
358
|
+ image_prepare.py — CLI Stage 1
|
|
|
359
|
+ image_ocr.py — CLI Stage 2
|
|
260
|
360
|
split/slicer.py — разрезание, post-crop
|
|
261
|
361
|
ocr/
|
|
262
|
362
|
paddle_engine.py — PP-StructureV3
|