# ocra
**ocra** — Python-библиотека для анализа изображений текста (сканы, вырезки и т.п.).
Два основных инструмента:
- **`OrientationPredictor`** — определение ориентации (вертикальная/горизонтальная)
- **`HandwrittenPredictor`** — классификация типа текста (рукописный/печатный)
## Установка
```bash
# С CPU поддержкой
pip install ocra[cpu]
# С GPU поддержкой (требует CUDA + cuDNN)
pip install ocra[gpu]
```
---
## Быстрый старт
```python
from src.ocra.orientation import OrientationPredictor
from src.ocra.ishandwritten import HandwrittenPredictor
def main():
# Инициализация
orient_pred = OrientationPredictor(verbose=0)
text_pred = HandwrittenPredictor(verbose=False)
image = "examples/hrk_463.png"
# Определение ориентации
orient_res = orient_pred.predict_single(image)
orientation = "VERT" if orient_res['pred_class'] == 1 else "HORZ"
# Определение типа текста
text_res = text_pred.predict_single(image)
text_type = text_res['prediction'] # 'handwritten' или 'printed'
print(f"Ориентация: {orientation} ({orient_res['confidence']:.3f})")
print(f"Тип текста: {text_type} ({text_res['confidence']:.3f})")
if __name__ == "__main__":
main()
```
**Пример вывода:**
```
Ориентация: HORZ (1.000)
Тип текста: handwritten (0.982)
```
---
## OrientationPredictor
Определяет ориентацию изображения как горизонтальную (HORZ) или вертикальную (VERT).

```python
from src.ocra.orientation import OrientationPredictor
predictor = OrientationPredictor()
result = predictor.predict_single("examples/hrk_463.png")
print(f"Класс: {result['pred_class']}") # 0=HORZ, 1=VERT
print(f"Предсказание: {result['prediction']}") # 'horizontal' или 'vertical'
print(f"Уверенность: {result['confidence']:.4f}")
```
## HandwrittenPredictor
Классифицирует тип текста на изображении: рукописный или печатный.
```python
from src.ocra.ishandwritten import HandwrittenPredictor
predictor = HandwrittenPredictor()
result = predictor.predict_single("examples/hrk_463.png")
print(f"Класс: {result['pred_class']}") # 0=printed, 1=handwritten
print(f"Предсказание: {result['prediction']}") # 'handwritten' или 'printed'
print(f"Уверенность: {result['confidence']:.4f}")
print(f"Высокая уверенность: {result['high_confidence']}")
```
Raw data
{
"_id": null,
"home_page": null,
"name": "ocra",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": null,
"keywords": "computer-vision, image-processing, orientation, rotation, onnx, pytorch",
"author": "sherstpasha",
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/31/f9/9a932ec23fedd0522ac64a6d8ed4b3b84604ad84c0de273088338844773a/ocra-0.2.1.tar.gz",
"platform": null,
"description": "# ocra\r\n\r\n**ocra** \u2014 Python-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0442\u0435\u043a\u0441\u0442\u0430 (\u0441\u043a\u0430\u043d\u044b, \u0432\u044b\u0440\u0435\u0437\u043a\u0438 \u0438 \u0442.\u043f.).\r\n\r\n\u0414\u0432\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430:\r\n- **`OrientationPredictor`** \u2014 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u0438 (\u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0430\u044f/\u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f)\r\n- **`HandwrittenPredictor`** \u2014 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0442\u0438\u043f\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 (\u0440\u0443\u043a\u043e\u043f\u0438\u0441\u043d\u044b\u0439/\u043f\u0435\u0447\u0430\u0442\u043d\u044b\u0439)\r\n\r\n## \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\r\n\r\n```bash\r\n# \u0421 CPU \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439\r\npip install ocra[cpu] \r\n\r\n# \u0421 GPU \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 (\u0442\u0440\u0435\u0431\u0443\u0435\u0442 CUDA + cuDNN)\r\npip install ocra[gpu]\r\n```\r\n\r\n---\r\n\r\n## \u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u0442\u0430\u0440\u0442\r\n\r\n```python\r\nfrom src.ocra.orientation import OrientationPredictor\r\nfrom src.ocra.ishandwritten import HandwrittenPredictor\r\n\r\ndef main():\r\n # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\r\n orient_pred = OrientationPredictor(verbose=0)\r\n text_pred = HandwrittenPredictor(verbose=False)\r\n \r\n image = \"examples/hrk_463.png\"\r\n \r\n # \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u0438\r\n orient_res = orient_pred.predict_single(image)\r\n orientation = \"VERT\" if orient_res['pred_class'] == 1 else \"HORZ\"\r\n \r\n # \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 \u0442\u0435\u043a\u0441\u0442\u0430\r\n text_res = text_pred.predict_single(image)\r\n text_type = text_res['prediction'] # 'handwritten' \u0438\u043b\u0438 'printed'\r\n \r\n print(f\"\u041e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044f: {orientation} ({orient_res['confidence']:.3f})\")\r\n print(f\"\u0422\u0438\u043f \u0442\u0435\u043a\u0441\u0442\u0430: {text_type} ({text_res['confidence']:.3f})\")\r\n\r\nif __name__ == \"__main__\":\r\n main()\r\n```\r\n\r\n**\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0432\u043e\u0434\u0430:**\r\n```\r\n\u041e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044f: HORZ (1.000)\r\n\u0422\u0438\u043f \u0442\u0435\u043a\u0441\u0442\u0430: handwritten (0.982)\r\n```\r\n\r\n---\r\n\r\n## OrientationPredictor \r\n\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043a\u0430\u043a \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0443\u044e (HORZ) \u0438\u043b\u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e (VERT).\r\n\r\n\r\n\r\n```python\r\nfrom src.ocra.orientation import OrientationPredictor\r\n\r\npredictor = OrientationPredictor()\r\nresult = predictor.predict_single(\"examples/hrk_463.png\")\r\n\r\nprint(f\"\u041a\u043b\u0430\u0441\u0441: {result['pred_class']}\") # 0=HORZ, 1=VERT\r\nprint(f\"\u041f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0435: {result['prediction']}\") # 'horizontal' \u0438\u043b\u0438 'vertical'\r\nprint(f\"\u0423\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044c: {result['confidence']:.4f}\")\r\n```\r\n\r\n## HandwrittenPredictor\r\n\u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442 \u0442\u0438\u043f \u0442\u0435\u043a\u0441\u0442\u0430 \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438: \u0440\u0443\u043a\u043e\u043f\u0438\u0441\u043d\u044b\u0439 \u0438\u043b\u0438 \u043f\u0435\u0447\u0430\u0442\u043d\u044b\u0439.\r\n\r\n```python\r\nfrom src.ocra.ishandwritten import HandwrittenPredictor\r\n\r\npredictor = HandwrittenPredictor()\r\nresult = predictor.predict_single(\"examples/hrk_463.png\")\r\n\r\nprint(f\"\u041a\u043b\u0430\u0441\u0441: {result['pred_class']}\") # 0=printed, 1=handwritten\r\nprint(f\"\u041f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0435: {result['prediction']}\") # 'handwritten' \u0438\u043b\u0438 'printed'\r\nprint(f\"\u0423\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044c: {result['confidence']:.4f}\")\r\nprint(f\"\u0412\u044b\u0441\u043e\u043a\u0430\u044f \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044c: {result['high_confidence']}\")\r\n```\r\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "ocra",
"version": "0.2.1",
"project_urls": {
"Homepage": "https://github.com/sherstpasha/Ocra",
"Issues": "https://github.com/sherstpasha/Ocra/issues",
"Repository": "https://github.com/sherstpasha/Ocra"
},
"split_keywords": [
"computer-vision",
" image-processing",
" orientation",
" rotation",
" onnx",
" pytorch"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "fd844488bcd182c36d0cccb3f18d7f0c5f4ac9926761817632fd4da0e53beecd",
"md5": "c84e4e979c1e656152ac462d171ad38a",
"sha256": "84d6c74daa102ae2ccf7924a7b9e93d874c40abb5e9449838f9f09aab77cf39e"
},
"downloads": -1,
"filename": "ocra-0.2.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "c84e4e979c1e656152ac462d171ad38a",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 5021171,
"upload_time": "2025-10-06T12:43:46",
"upload_time_iso_8601": "2025-10-06T12:43:46.701577Z",
"url": "https://files.pythonhosted.org/packages/fd/84/4488bcd182c36d0cccb3f18d7f0c5f4ac9926761817632fd4da0e53beecd/ocra-0.2.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "31f99a932ec23fedd0522ac64a6d8ed4b3b84604ad84c0de273088338844773a",
"md5": "61ff49e4e1d66798f269a74dd5805aa9",
"sha256": "c2d71de0b5950b9711dce2426e5b9dc859eaa5cdc3c99a6234245765fd658d0a"
},
"downloads": -1,
"filename": "ocra-0.2.1.tar.gz",
"has_sig": false,
"md5_digest": "61ff49e4e1d66798f269a74dd5805aa9",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 5021521,
"upload_time": "2025-10-06T12:43:52",
"upload_time_iso_8601": "2025-10-06T12:43:52.389570Z",
"url": "https://files.pythonhosted.org/packages/31/f9/9a932ec23fedd0522ac64a6d8ed4b3b84604ad84c0de273088338844773a/ocra-0.2.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-10-06 12:43:52",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "sherstpasha",
"github_project": "Ocra",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"requirements": [
{
"name": "numpy",
"specs": [
[
"<",
"2.0"
],
[
">=",
"1.19.0"
]
]
},
{
"name": "torchvision",
"specs": [
[
"==",
"0.15.2+cu118"
]
]
},
{
"name": "torchaudio",
"specs": [
[
"==",
"2.0.2+cu118"
]
]
},
{
"name": "numpy",
"specs": [
[
">=",
"1.19.0"
]
]
},
{
"name": "Pillow",
"specs": [
[
">=",
"8.0.0"
]
]
},
{
"name": "tensorboard",
"specs": [
[
">=",
"2.4.0"
]
]
},
{
"name": "tqdm",
"specs": []
},
{
"name": "onnxruntime-gpu",
"specs": [
[
">=",
"1.16.0"
]
]
}
],
"lcname": "ocra"
}