docreader-ocr 0.2.4__tar.gz → 0.2.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. docreader_ocr-0.2.5/PKG-INFO +69 -0
  2. docreader_ocr-0.2.5/README.md +292 -0
  3. docreader_ocr-0.2.5/README_pypi.md +36 -0
  4. {docreader_ocr-0.2.4 → docreader_ocr-0.2.5}/pyproject.toml +2 -2
  5. docreader_ocr-0.2.4/PKG-INFO +0 -34
  6. docreader_ocr-0.2.4/README.md +0 -1
  7. {docreader_ocr-0.2.4 → docreader_ocr-0.2.5}/.github/workflows/publish.yaml +0 -0
  8. {docreader_ocr-0.2.4 → docreader_ocr-0.2.5}/.gitignore +0 -0
  9. {docreader_ocr-0.2.4 → docreader_ocr-0.2.5}/LICENSE +0 -0
  10. {docreader_ocr-0.2.4 → docreader_ocr-0.2.5}/src/docreader/__init__.py +0 -0
  11. {docreader_ocr-0.2.4 → docreader_ocr-0.2.5}/src/docreader/classifier/__init__.py +0 -0
  12. {docreader_ocr-0.2.4 → docreader_ocr-0.2.5}/src/docreader/classifier/base.py +0 -0
  13. {docreader_ocr-0.2.4 → docreader_ocr-0.2.5}/src/docreader/classifier/yolo_classifier.py +0 -0
  14. {docreader_ocr-0.2.4 → docreader_ocr-0.2.5}/src/docreader/config.py +0 -0
  15. {docreader_ocr-0.2.4 → docreader_ocr-0.2.5}/src/docreader/detector/__init__.py +0 -0
  16. {docreader_ocr-0.2.4 → docreader_ocr-0.2.5}/src/docreader/detector/base.py +0 -0
  17. {docreader_ocr-0.2.4 → docreader_ocr-0.2.5}/src/docreader/detector/yolo_obb.py +0 -0
  18. {docreader_ocr-0.2.4 → docreader_ocr-0.2.5}/src/docreader/factory.py +0 -0
  19. {docreader_ocr-0.2.4 → docreader_ocr-0.2.5}/src/docreader/hub.py +0 -0
  20. {docreader_ocr-0.2.4 → docreader_ocr-0.2.5}/src/docreader/ocr/__init__.py +0 -0
  21. {docreader_ocr-0.2.4 → docreader_ocr-0.2.5}/src/docreader/ocr/base.py +0 -0
  22. {docreader_ocr-0.2.4 → docreader_ocr-0.2.5}/src/docreader/ocr/easyocr_engine.py +0 -0
  23. {docreader_ocr-0.2.4 → docreader_ocr-0.2.5}/src/docreader/pipeline.py +0 -0
  24. {docreader_ocr-0.2.4 → docreader_ocr-0.2.5}/src/docreader/preprocessing/__init__.py +0 -0
  25. {docreader_ocr-0.2.4 → docreader_ocr-0.2.5}/src/docreader/preprocessing/geometry.py +0 -0
  26. {docreader_ocr-0.2.4 → docreader_ocr-0.2.5}/src/docreader/resolver/__init__.py +0 -0
  27. {docreader_ocr-0.2.4 → docreader_ocr-0.2.5}/src/docreader/resolver/base.py +0 -0
  28. {docreader_ocr-0.2.4 → docreader_ocr-0.2.5}/src/docreader/resolver/lvl_resolver.py +0 -0
  29. {docreader_ocr-0.2.4 → docreader_ocr-0.2.5}/src/docreader/schemas.py +0 -0
  30. {docreader_ocr-0.2.4 → docreader_ocr-0.2.5}/src/docreader/utils.py +0 -0
  31. {docreader_ocr-0.2.4 → docreader_ocr-0.2.5}/tests/test_hub.py +0 -0
  32. {docreader_ocr-0.2.4 → docreader_ocr-0.2.5}/tests/test_pipeline.py +0 -0
  33. {docreader_ocr-0.2.4 → docreader_ocr-0.2.5}/tests/test_run.py +0 -0
@@ -0,0 +1,69 @@
1
+ Metadata-Version: 2.4
2
+ Name: docreader-ocr
3
+ Version: 0.2.5
4
+ Summary: Document OCR pipeline: classify → detect fields → recognize text
5
+ Project-URL: Homepage, https://github.com/mishanyacorleone/docreader
6
+ Project-URL: Repository, https://github.com/mishanyacorleone/docreader
7
+ Project-URL: Issues, https://github.com/mishanyacorleone/docreader/issues
8
+ Author-email: Mikhail Kardash <mishutqac@mail.ru>, Ruslan Abzelilov <ruslanr26@mail.ru>, Ekaterina Karmanova <monitor81@mail.ru>
9
+ License: MIT
10
+ License-File: LICENSE
11
+ Keywords: document,ocr,recognition,yolo
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Topic :: Scientific/Engineering :: Image Recognition
17
+ Requires-Python: >=3.9
18
+ Requires-Dist: easyocr>=1.7
19
+ Requires-Dist: numpy>=1.24
20
+ Requires-Dist: opencv-python>=4.8
21
+ Requires-Dist: rapidfuzz>=3.14.0
22
+ Requires-Dist: requests>=2.28
23
+ Requires-Dist: torch>=2.0
24
+ Requires-Dist: torchvision>=0.15
25
+ Requires-Dist: tqdm>=4.65
26
+ Requires-Dist: ultralytics>=8.0
27
+ Provides-Extra: dev
28
+ Requires-Dist: mypy; extra == 'dev'
29
+ Requires-Dist: pytest-cov; extra == 'dev'
30
+ Requires-Dist: pytest>=7.0; extra == 'dev'
31
+ Requires-Dist: ruff; extra == 'dev'
32
+ Description-Content-Type: text/markdown
33
+
34
+ # docreader-ocr
35
+
36
+ Python-библиотека для автоматического распознавания российских документов.
37
+
38
+ ```python
39
+ from docreader import DocReader
40
+
41
+ result = DocReader().process("passport.jpg")
42
+ print(result.documents[0].fields)
43
+ # {"surname": "Иванов", "firstname": "Иван", "passport_num": "1234 567890", ...}
44
+ ```
45
+
46
+ ## Установка
47
+
48
+ ```bash
49
+ pip install docreader-ocr
50
+ ```
51
+
52
+ Модели скачиваются автоматически при первом запуске.
53
+
54
+ ## Поддерживаемые документы
55
+
56
+ - Паспорт РФ
57
+ - СНИЛС
58
+ - Аттестат об образовании
59
+ - Диплом о высшем образовании
60
+
61
+ ## Как работает
62
+
63
+ Трёхэтапный конвейер: **классификатор** (YOLO OBB, accuracy 97.5%) определяет тип документа → **детектор зон** (YOLO OBB, mAP@50 = 90%) находит поля → **OCR** (EasyOCR, word accuracy 87.3%) распознаёт текст.
64
+
65
+ Данные обрабатываются локально — никаких внешних серверов, полное соответствие 152-ФЗ.
66
+
67
+ ## Документация
68
+
69
+ Полный README, примеры и API — на [GitHub](https://github.com/mishanyacorleone/docreader).
@@ -0,0 +1,292 @@
1
+ # docreader-ocr
2
+
3
+ [![PyPI version](https://img.shields.io/pypi/v/docreader-ocr.svg)](https://pypi.org/project/docreader-ocr/)
4
+ [![Python](https://img.shields.io/badge/python-3.12+-blue.svg)](https://www.python.org/downloads/)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT)
6
+ [![GitHub stars](https://img.shields.io/github/stars/mishanyacorleone/docreader.svg)](https://github.com/mishanyacorleone/docreader/stargazers)
7
+
8
+ Python-библиотека для автоматического распознавания российских документов. Сфотографировал — получил структурированные данные.
9
+
10
+ ```python
11
+ from docreader import DocReader
12
+
13
+ result = DocReader().process("passport.jpg")
14
+ print(result.documents[0].fields)
15
+ # {"surname": "Иванов", "firstname": "Иван", "passport_num": "1234 567890", ...}
16
+ ```
17
+
18
+ ---
19
+
20
+ ## Поддерживаемые документы
21
+
22
+ | Документ | Распознаваемые поля |
23
+ |----------|---------------------|
24
+ | Паспорт РФ | surname, firstname, middlename, dateOfBirth, birthCity, sex, passport_num, issued_by, issued_date, issued_code |
25
+ | СНИЛС | fio, snils, date_of_birth, sex, location, reg_date |
26
+ | Аттестат | fio, lvl, number, issue_date, grad_year, school_name, gerb |
27
+ | Диплом | fio, lvl, series_numbers, reg_num, issue_date, spec_name, university_name, gerb, stamp |
28
+
29
+ ---
30
+
31
+ ## Установка
32
+
33
+ ```bash
34
+ pip install docreader-ocr
35
+ ```
36
+
37
+ Модели скачиваются автоматически при первом запуске и кэшируются в `~/.cache/docreader/models/`.
38
+
39
+ ### Требования
40
+
41
+ - Python 3.12+
42
+ - PyTorch (CPU или CUDA)
43
+ - ~200 МБ дискового пространства для моделей
44
+
45
+ ---
46
+
47
+ ## Быстрый старт
48
+
49
+ ### Базовое использование
50
+
51
+ ```python
52
+ from docreader import DocReader
53
+
54
+ reader = DocReader()
55
+ result = reader.process("photo.jpg")
56
+
57
+ for doc in result.documents:
58
+ print(f"Тип: {doc.doc_type}")
59
+ print(f"Поля: {doc.fields}")
60
+ ```
61
+
62
+ ### Пакетная обработка
63
+
64
+ ```python
65
+ results = reader.process_batch(["doc1.jpg", "doc2.jpg", "doc3.jpg"])
66
+
67
+ for page in results:
68
+ for doc in page.documents:
69
+ print(doc.fields)
70
+ ```
71
+
72
+ ### Использование numpy array
73
+
74
+ ```python
75
+ import cv2
76
+ from docreader import DocReader
77
+
78
+ image = cv2.imread("passport.jpg")
79
+ result = DocReader().process(image)
80
+ ```
81
+
82
+ ### Получение кропов зон
83
+
84
+ ```python
85
+ result = DocReader().process("passport.jpg", return_crops=True)
86
+
87
+ for doc in result.documents:
88
+ for zone in doc.zones:
89
+ print(f"{zone.name}: {zone.text}")
90
+ # zone.crop_image — numpy array с вырезанной зоной
91
+ ```
92
+
93
+ ### Использование GPU
94
+
95
+ ```python
96
+ from docreader import DocReader
97
+ from docreader.config import PipelineConfig
98
+
99
+ config = PipelineConfig(device="cuda")
100
+ reader = DocReader(config=config)
101
+ ```
102
+
103
+ ---
104
+
105
+ ## Архитектура
106
+
107
+ Библиотека реализует трёхэтапный конвейер:
108
+
109
+ ```
110
+ Фото → [Классификатор] → [Детектор зон] → [OCR] → Словарь полей
111
+ YOLO OBB YOLO OBB EasyOCR
112
+ 97.5% acc mAP@50=90% CER=0.15
113
+ ```
114
+
115
+ **Классификатор** — определяет тип документа и вырезает его из произвольной фотографии. Работает при любом освещении и ракурсе.
116
+
117
+ **Детектор зон** — специализированная YOLO OBB модель для каждого типа документа. Находит поля с точностью mAP@50 = 90%.
118
+
119
+ **OCR-движок** — EasyOCR с кастомным дообучением под русскоязычные документы. Структурированные поля (числа, даты, коды) — Exact Match 85–92%.
120
+
121
+ ### Resolver для аттестата/диплома
122
+
123
+ Аттестат и диплом визуально идентичны, поэтому их различение вынесено в отдельный компонент — `LvlSubtypeResolver`. Он детектирует поле `lvl`, читает его через OCR и с помощью fuzzy matching определяет подтип документа.
124
+
125
+ ---
126
+
127
+ ## Метрики качества
128
+
129
+ ### Классификатор
130
+
131
+ | Класс | Precision | Recall | F1 |
132
+ |-------|-----------|--------|----|
133
+ | passport | 0.968 | 1.000 | 0.984 |
134
+ | snils | 1.000 | 0.903 | 0.949 |
135
+ | attestat | 1.000 | 1.000 | 1.000 |
136
+ | diplom | 1.000 | 1.000 | 1.000 |
137
+ | **Общая точность** | | | **97.5%** |
138
+
139
+ ### Детектор зон
140
+
141
+ | Метрика | Значение |
142
+ |---------|----------|
143
+ | mAP@50 | 90.0% |
144
+ | Лучшая зона (gerb) | F1 = 99.1% |
145
+ | Слабейшая зона (location) | F1 = 82.5% |
146
+
147
+ ### OCR
148
+
149
+ | Метрика | Значение |
150
+ |---------|----------|
151
+ | CER средний | 0.146 |
152
+ | WER средний | 0.276 |
153
+ | Exact Match средний | 58.8% |
154
+ | Exact Match (series_numbers) | 92.3% |
155
+ | Exact Match (fio) | 88.4% |
156
+
157
+ ---
158
+
159
+ ## Кастомизация
160
+
161
+ ### Своя конфигурация
162
+
163
+ ```python
164
+ from docreader import DocReader
165
+ from docreader.config import PipelineConfig
166
+
167
+ config = PipelineConfig(
168
+ device="cuda",
169
+ classifier_confidence=0.5,
170
+ detector_confidence=0.3,
171
+ enable_deskew=True,
172
+ return_crops=False,
173
+ skip_ocr_zones={"stamp", "gerb"},
174
+ )
175
+ reader = DocReader(config=config)
176
+ ```
177
+
178
+ ### Использование отдельных компонентов
179
+
180
+ ```python
181
+ from docreader.factory import create_classifier, create_detector, create_ocr
182
+
183
+ # Только классификатор
184
+ clf = create_classifier()
185
+ docs = clf.classify("photo.jpg")
186
+
187
+ # Только детектор
188
+ det = create_detector()
189
+ zones = det.detect(image, doc_type="passport")
190
+
191
+ # Только OCR
192
+ ocr = create_ocr()
193
+ result = ocr.recognize(crop_image)
194
+ print(result.text, result.confidence)
195
+ ```
196
+
197
+ ### Подключение своего OCR-движка
198
+
199
+ ```python
200
+ from docreader.ocr.base import BaseOcrEngine, OcrResult
201
+ import numpy as np
202
+
203
+ class MyOcrEngine(BaseOcrEngine):
204
+ def recognize(self, image: np.ndarray) -> OcrResult:
205
+ # ваша реализация
206
+ return OcrResult(text="...", confidence=0.95)
207
+
208
+ reader = DocReader(ocr_engine=MyOcrEngine())
209
+ ```
210
+
211
+ ### Добавление нового типа документа
212
+
213
+ ```python
214
+ from docreader.config import PipelineConfig
215
+
216
+ config = PipelineConfig(
217
+ detector_weights={
218
+ "passport": "passport.pt",
219
+ "snils": "snils.pt",
220
+ "attestat": "attestat.pt",
221
+ "diplom": "diplom.pt",
222
+ "inn": "/path/to/your/inn.pt", # ваша модель
223
+ }
224
+ )
225
+ reader = DocReader(config=config)
226
+ ```
227
+
228
+ ---
229
+
230
+ ## Структура результата
231
+
232
+ ```python
233
+ PageResult
234
+ └── documents: list[DocumentResult]
235
+ ├── doc_type: str # "passport", "snils", "attestat", "diplom"
236
+ ├── doc_confidence: float # уверенность классификатора
237
+ ├── doc_bbox: list[float] # координаты документа в исходном изображении
238
+ ├── doc_crop: np.ndarray # вырезанный документ (если return_crops=True)
239
+ ├── fields: dict # {zone_name: text} — удобный доступ к полям
240
+ ├── resolve_meta: dict # диагностика resolver'а (для attestat/diplom)
241
+ └── zones: list[ZoneResult]
242
+ ├── name: str
243
+ ├── text: str
244
+ ├── confidence: float
245
+ ├── bbox: list[float]
246
+ └── crop_image: np.ndarray # если return_crops=True
247
+ ```
248
+
249
+ ---
250
+
251
+ ## Управление моделями
252
+
253
+ ```python
254
+ from docreader.hub import get_model_status, ensure_all_models
255
+
256
+ # Статус всех моделей
257
+ status = get_model_status()
258
+ for name, info in status.items():
259
+ print(f"{name}: {'✓' if info['downloaded'] else '✗'} ({info['size_mb']} MB)")
260
+
261
+ # Скачать все модели заранее
262
+ ensure_all_models()
263
+
264
+ # Кастомная директория кэша
265
+ import os
266
+ os.environ["DOCREADER_CACHE"] = "/path/to/custom/cache"
267
+ ```
268
+
269
+ ---
270
+
271
+ ## Почему библиотека, а не сервис
272
+
273
+ **Данные остаются внутри.** Персональные данные не покидают инфраструктуру организации. Полное соответствие 152-ФЗ. Никаких внешних серверов.
274
+
275
+ **Интеграция без переписывания.** Встраивается в любую существующую систему — 1С, CRM, ERP, мобильное приложение — двумя строками кода.
276
+
277
+ **Полный контроль.** Новые типы документов подключаются через дообучение без участия вендора. IT-отдел контролирует всё: модели, данные, обновления.
278
+
279
+ **Нет операционных затрат.** В отличие от облачных API — никакой абонентской платы и лимитов на количество запросов.
280
+
281
+ ---
282
+
283
+ ## Лицензия
284
+
285
+ MIT License — см. [LICENSE](LICENSE).
286
+
287
+ ---
288
+
289
+ ## Ссылки
290
+
291
+ - [PyPI](https://pypi.org/project/docreader-ocr/)
292
+ - [GitHub](https://github.com/mishanyacorleone/docreader)
@@ -0,0 +1,36 @@
1
+ # docreader-ocr
2
+
3
+ Python-библиотека для автоматического распознавания российских документов.
4
+
5
+ ```python
6
+ from docreader import DocReader
7
+
8
+ result = DocReader().process("passport.jpg")
9
+ print(result.documents[0].fields)
10
+ # {"surname": "Иванов", "firstname": "Иван", "passport_num": "1234 567890", ...}
11
+ ```
12
+
13
+ ## Установка
14
+
15
+ ```bash
16
+ pip install docreader-ocr
17
+ ```
18
+
19
+ Модели скачиваются автоматически при первом запуске.
20
+
21
+ ## Поддерживаемые документы
22
+
23
+ - Паспорт РФ
24
+ - СНИЛС
25
+ - Аттестат об образовании
26
+ - Диплом о высшем образовании
27
+
28
+ ## Как работает
29
+
30
+ Трёхэтапный конвейер: **классификатор** (YOLO OBB, accuracy 97.5%) определяет тип документа → **детектор зон** (YOLO OBB, mAP@50 = 90%) находит поля → **OCR** (EasyOCR, word accuracy 87.3%) распознаёт текст.
31
+
32
+ Данные обрабатываются локально — никаких внешних серверов, полное соответствие 152-ФЗ.
33
+
34
+ ## Документация
35
+
36
+ Полный README, примеры и API — на [GitHub](https://github.com/mishanyacorleone/docreader).
@@ -4,9 +4,9 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "docreader-ocr"
7
- version = "0.2.4"
7
+ version = "0.2.5"
8
8
  description = "Document OCR pipeline: classify → detect fields → recognize text"
9
- readme = "README.md"
9
+ readme = "README_pypi.md"
10
10
  license = {text = "MIT"}
11
11
  requires-python = ">=3.9"
12
12
  authors = [
@@ -1,34 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: docreader-ocr
3
- Version: 0.2.4
4
- Summary: Document OCR pipeline: classify → detect fields → recognize text
5
- Project-URL: Homepage, https://github.com/mishanyacorleone/docreader
6
- Project-URL: Repository, https://github.com/mishanyacorleone/docreader
7
- Project-URL: Issues, https://github.com/mishanyacorleone/docreader/issues
8
- Author-email: Mikhail Kardash <mishutqac@mail.ru>, Ruslan Abzelilov <ruslanr26@mail.ru>, Ekaterina Karmanova <monitor81@mail.ru>
9
- License: MIT
10
- License-File: LICENSE
11
- Keywords: document,ocr,recognition,yolo
12
- Classifier: Development Status :: 3 - Alpha
13
- Classifier: Intended Audience :: Developers
14
- Classifier: License :: OSI Approved :: MIT License
15
- Classifier: Programming Language :: Python :: 3
16
- Classifier: Topic :: Scientific/Engineering :: Image Recognition
17
- Requires-Python: >=3.9
18
- Requires-Dist: easyocr>=1.7
19
- Requires-Dist: numpy>=1.24
20
- Requires-Dist: opencv-python>=4.8
21
- Requires-Dist: rapidfuzz>=3.14.0
22
- Requires-Dist: requests>=2.28
23
- Requires-Dist: torch>=2.0
24
- Requires-Dist: torchvision>=0.15
25
- Requires-Dist: tqdm>=4.65
26
- Requires-Dist: ultralytics>=8.0
27
- Provides-Extra: dev
28
- Requires-Dist: mypy; extra == 'dev'
29
- Requires-Dist: pytest-cov; extra == 'dev'
30
- Requires-Dist: pytest>=7.0; extra == 'dev'
31
- Requires-Dist: ruff; extra == 'dev'
32
- Description-Content-Type: text/markdown
33
-
34
- Заглушка
@@ -1 +0,0 @@
1
- Заглушка
File without changes
File without changes