datalab-to/surya

GitHub: datalab-to/surya

Surya是一款多语言OCR工具,用于文档分析和安全评估。

Stars: 20676 | Forks: 1469

# Surya Surya 是一个具有以下特性的 650M 参数 OCR 模型: - 准确性 - 在 [olmOCR-bench](https://huggingface.co/datasets/allenai/olmOCR-bench) 上得分 83.3%(3B 参数以下最佳) - 速度 - 在 RTX 5090 上每秒处理 5 页 - 多语言 - 在包含 91 种语言的内部基准测试中得分 87.2%(更多信息[这里](#multilingual)) - 布局分析(表格、图像、标题等)和阅读顺序 - 表格识别(行 + 列) 我们还提供更小的模型,用于行级文本检测和 OCR 错误检测。它适用于各种文档(请参阅 [用法](#usage) 和 [基准测试](#benchmarks))。 ## 模型信息 | 检测 | OCR | |:----------------------------------------------------------------:|:-----------------------------------------------------------------------:| | | | | 布局 | 表格识别 | |:------------------------------------------------------------------:|:-------------------------------------------------------------:| | | | Surya 以 [印度太阳神](https://en.wikipedia.org/wiki/Surya) 命名,他拥有普世之眼。 ## 示例 每一行都链接到同一页面的五个注释视图:文本行检测、OCR、布局、阅读顺序和(如有)表格识别。 | 名称 | 检测 | OCR | 布局 | 阅读顺序 | 表格识别 | |-------------------|:-----------------------------------:|------------------------------------------:|---------------------------------------------:|------------------------------------------------:|------------------------------------------------:| | 报纸 | [图像](static/images/newspaper.png) | [图像](static/images/newspaper_text.png) | [图像](static/images/newspaper_layout.png) | [图像](static/images/newspaper_reading.png) | | | 教科书 | [图像](static/images/textbook.png) | [图像](static/images/textbook_text.png) | [图像](static/images/textbook_layout.png) | [图像](static/images/textbook_reading.png) | | | 税表 | [图像](static/images/form.png) | [图像](static/images/form_text.png) | [图像](static/images/form_layout.png) | [图像](static/images/form_reading.png) | [图像](static/images/form_tablerec.png) | | 手写笔记 | [图像](static/images/handwritten.png) | [图像](static/images/handwritten_text.png) | [图像](static/images/handwritten_layout.png) | [图像](static/images/handwritten_reading.png) | [图像](static/images/handwritten_tablerec.png) | | 企业文档 | [图像](static/images/corporate.png) | [图像](static/images/corporate_text.png) | [图像](static/images/corporate_layout.png) | [图像](static/images/corporate_reading.png) | [图像](static/images/corporate_tablerec.png) | # 商业用途 Surya 代码采用 Apache 2.0 许可。模型权重使用修改后的 AI Pubs Open Rail-M 许可(免费用于研究、个人用途和融资/收入低于 500 万美元的初创公司)。如需更广泛的模型权重商业许可,请访问我们的定价页面[这里](https://www.datalab.to/pricing?utm_source=gh-surya)。 # 安装 使用以下命令安装: ``` pip install surya-ocr ``` ## 推理后端先决条件 Surya 首次使用时自动启动服务器,您需要 `vllm`(NVIDIA GPU)或 `llama.cpp`(CPU / Apple Silicon): - **NVIDIA GPU:** [Docker](https://docs.docker.com/get-docker/) 加上 [NVIDIA 容器工具包](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html)。 - **CPU / Apple Silicon:** 从 llama.cpp 获取 `llama-server` 二进制文件: brew install llama.cpp # macOS # 或从 https://github.com/ggml-org/llama.cpp/releases 获取发布版本 ## 从 Surya v1 升级 如果您有 v1 代码,可以迁移到以下版本: ``` # v2 from surya.inference import SuryaInferenceManager from surya.recognition import RecognitionPredictor manager = SuryaInferenceManager() # auto-spawns vllm or llama-server rec = RecognitionPredictor(manager) predictions = rec([image]) ``` 不同之处: - `SuryaInferenceManager` 替换 `FoundationPredictor`。同一管理器实例在 `LayoutPredictor`、`RecognitionPredictor`、`TableRecPredictor` 之间共享。 - 输出模式已更改:请参阅以下每个部分的 JSON 表格。亮点 - `text_lines` → `blocks`(带有 `html`);布局删除 `top_k`,添加 `count`;表格识别从单元格中删除 `is_header` / `colspan` / `rowspan`。 # 使用 Surya 2 通过单个 VLM 运行布局、OCR 和表格识别。推理管理器将在首次使用时为您启动一个;您也可以通过 `SURYA_INFERENCE_URL=http://host:port/v1` 指向现有的服务器。 - 检查 `surya/settings.py` 中的设置。您可以通过环境变量覆盖任何设置(例如 `SURYA_INFERENCE_BACKEND=vllm`)。 - 文本检测和 OCR 错误是单独的模型。 ### 服务器生命周期 (`--keep_server`) 默认情况下,每个命令在启动时启动 VLM 服务器并在退出时关闭它——因此连续运行多个命令每次都会支付启动(以及在 GPU 上,模型加载)成本。传递 `--keep_server` 以保持服务器运行,以便后续命令附加到它而不是重新启动: ``` surya_ocr DATA_PATH --keep_server # spawns the server and leaves it up surya_layout DATA_PATH # attaches to the running server surya_table DATA_PATH # ...and so on, no re-spawn ``` `--keep_server` 在每个命令上均有效。完成操作后停止服务器(使用 `docker stop` 停止 `surya-vllm-*` 容器,或终止 `llama-server` 进程),或设置 `SURYA_INFERENCE_KEEP_ALIVE=1` 以使 keep-alive 成为默认设置。 ## 交互式应用程序 我包含了一个 streamlit 应用程序,允许您交互式地在图像或 PDF 文件上尝试 Surya。使用以下命令运行它: ``` pip install streamlit pdftext surya_gui ``` ## OCR(文本识别) 此命令将输出包含检测到的文本和 bboxes 的 json 文件: ``` surya_ocr DATA_PATH ``` - `DATA_PATH` 可以是图像、pdf 或图像/ pdf 文件的文件夹 - `--images` 将保存页面和检测到的块的图像(可选) - `--output_dir` 指定要保存结果的目录,而不是默认目录 - `--page_range` 指定 PDF 中要处理的页面范围,指定为单个数字、逗号分隔的列表、范围或逗号分隔的范围 - 示例:`0,5-10,20`。 - `--keep_server` 在命令退出后保持推理服务器运行,以便后续命令重用它(请参阅 [服务器生命周期](#server-lifecycle---keep_server))。在所有命令上均可用。 `results.json` 文件包含一个以输入文件名(无扩展名)为键的字典。每个值都是一个包含页面字典的列表。每个页面字典包含: - `blocks` - 按阅读顺序的每个块的 OCR 结果 - `label` - 规范化布局标签(例如 `Text`、`SectionHeader`、`Table`、`Equation`、`Picture`、`Form`、`PageHeader`、...)。有关完整的规范名称集,请参阅 `surya/layout/label.py:LAYOUT_PRED_RELABEL`。 - `raw_label` - 模型在规范化之前发出的原始标签 - `reading_order` - 布局输出中的 0 索引位置 - `html` - 块内容作为 HTML(数学用 `...` 包装,表格用 `...
` 包装等)。如果块被跳过,则为 `""` - `polygon` - 按顺序 `[[x0,y0],[x1,y0],[x1,y1],[x0,y1]]` 的 4 个角的多边形 - `bbox` - 从多边形派生的轴对齐 `[x0, y0, x1, y1]` - `confidence` - 块解码的每个标记的平均概率(0-1) - `skipped` - 如果块是视觉标签(例如 Picture)且未进行 OCR,则为 true - `error` - 如果块 OCR 调用失败,则为 true - `image_bbox` - 页面图像的 `[0, 0, width, height]` **性能提示** - 吞吐量由推理后端控制。使用 `vllm` 时,请提高 `--max-num-seqs` / `--max-num-batched-tokens`(或客户端侧的 `SURYA_INFERENCE_PARALLEL`)以保持更多页面在飞行中。使用 `llama.cpp` 时,将 `SURYA_INFERENCE_PARALLEL` 设置为与 `llama-server` 上的 `--parallel` 相匹配。 - DPI 也会显着影响吞吐量 - 您可以调整 DPI 设置以在吞吐量/准确性之间进行权衡。尝试从 192 到 96 以提高吞吐量。 - MTP 也会影响延迟/吞吐量 - 您可以调整 vllm mtp 配置设置。 ### 从 python ``` from PIL import Image from surya.inference import SuryaInferenceManager from surya.recognition import RecognitionPredictor manager = SuryaInferenceManager() recognition_predictor = RecognitionPredictor(manager) # Default: full-page OCR. One VLM call per page. Returns one PageOCRResult per # image: `.blocks` (each with label, html, polygon, bbox, confidence, ...) and # `.image_bbox` — the same schema as block mode. predictions = recognition_predictor([Image.open(IMAGE_PATH)]) # Block mode: pre-run layout, then per-block OCR. Same return schema as above. # Auto-selected when `layout_results` is passed. from surya.layout import LayoutPredictor layout = LayoutPredictor(manager) layouts = layout([Image.open(IMAGE_PATH)]) predictions = recognition_predictor([Image.open(IMAGE_PATH)], layouts) ``` ## 文本行检测 此命令将输出包含检测到的 bboxes 的 json 文件。 ``` surya_detect DATA_PATH ``` - `DATA_PATH` 可以是图像、pdf 或图像/ pdf 文件的文件夹 - `--images` 将保存页面和检测到的文本行的图像(可选) - `--output_dir` 指定要保存结果的目录,而不是默认目录 - `--page_range` 指定 PDF 中要处理的页面范围,指定为单个数字、逗号分隔的列表、范围或逗号分隔的范围 - 示例:`0,5-10,20`。 `results.json` 文件将包含一个以输入文件名(无扩展名)为键的 JSON 字典。每个值将是一个包含字典的列表,每个字典对应于输入文档的一页。每个页面字典包含: - `bboxes` - 文本检测到的边界框 - `bbox` - 文本行在 (x1, y1, x2, y2) 格式中的轴对齐矩形。 (x1, y1) 是左上角,(x2, y2) 是右下角。 - `polygon` - 文本行在 (x1, y1),(x2, y2),(x3, y3),(x4, y4) 格式中的多边形。点按顺时针顺序从左上角开始。 - `confidence` - 模型在检测到的文本中的置信度(0-1) - `vertical_lines` - 在文档中检测到的垂直线 - `bbox` - 轴对齐线的坐标。 - `page` - 文件中的页码 - `image_bbox` - 图像的 bbox 在 (x1, y1, x2, y2) 格式中。 (x1, y1) 是左上角,(x2, y2) 是右下角。所有行边界框都将包含在此边界框内。 **性能提示** 检测是一个 torch 模型。`DETECTOR_BATCH_SIZE` 默认在运行时自动选择值;覆盖环境变量以控制 GPU 上的 VRAM 使用情况,并在较大卡上提高它。 ### 从 python ``` from PIL import Image from surya.detection import DetectionPredictor det_predictor = DetectionPredictor() predictions = det_predictor([Image.open(IMAGE_PATH)]) ``` ## 布局和阅读顺序 此命令将输出包含检测到的布局和阅读顺序的 json 文件。 ``` surya_layout DATA_PATH ``` - `DATA_PATH` 可以是图像、pdf 或图像/ pdf 文件的文件夹 - `--images` 将保存页面和检测到的文本行的图像(可选) - `--output_dir` 指定要保存结果的目录,而不是默认目录 - `--page_range` 指定 PDF 中要处理的页面范围,指定为单个数字、逗号分隔的列表、范围或逗号分隔的范围 - 示例:`0,5-10,20`。 `results.json` 文件包含一个以输入文件名(无扩展名)为键的字典。每个值是一个包含页面字典的列表。每个页面字典包含: - `bboxes` - 按阅读顺序的布局框 - `polygon` - 4 个角的多边形 `[[x0,y0],[x1,y0],[x1,y1],[x0,y1]]` - `bbox` - 从多边形派生的轴对齐 `[x0, y0, x1, y1]` - `label` - 规范化标签。以下之一:`Caption`、`Footnote`、`Equation`、`ListGroup`、`PageHeader`、`PageFooter`、`Picture`、`SectionHeader`、`Table`、`Text`、`Figure`、`Code`、`Form`、`TableOfContents`、`ChemicalBlock`、`Diagram`、`Bibliography`、`BlankPage` - `raw_label` - 模型发出的原始标签 - `position` - 0 索引的阅读顺序 - `count` - 模型对 OCR 此块进行 OCR 的令牌估计(四舍五入到 50 的倍数;用于调整每个块的解码预算) - `confidence` - 布局解码的每个标记的平均概率(0-1) - `image_bbox` - `[0, 0, width, height]` - `raw` - 布局模型发出的原始 JSON,用于调试 - `error - 如果布局调用失败,则为 true **性能提示** 布局通过共享的推理后端运行。吞吐量调整与 OCR 相同——请参阅性能提示。 ### 从 python ``` from PIL import Image from surya.inference import SuryaInferenceManager from surya.layout import LayoutPredictor layout_predictor = LayoutPredictor(SuryaInferenceManager()) layout_predictions = layout_predictor([Image.open(IMAGE_PATH)]) ``` ## 表格识别 此命令将输出包含检测到的表格单元格和行/列 ID 以及行/列边界框的 json 文件。如果您想获取单元格位置和文本以及良好的格式,请查看 [marker](https://github.com/datalab-to/marker) 仓库。您可以使用 `TableConverter` 在图像和 PDF 中检测和提取表格。它支持以 json(带有 bboxes)、markdown 和 html 格式输出。 ``` surya_table DATA_PATH ``` - `DATA_PATH` 可以是图像、pdf 或图像/ pdf 文件的文件夹 - `--images` 将保存与 json 一起保存的注释行 + 列覆盖(可选) - `--output_dir` 指定要保存结果的目录,而不是默认目录 - `--page_range` 指定 PDF 中要处理的页面范围,指定为单个数字、逗号分隔的列表、范围或逗号分隔的范围 - 示例:`0,5-10,20`。 - `--skip_table_detection` 告诉表格识别不要首先检测表格。如果您的图像已经裁剪到表格,请使用此选项。 `results.json` 文件包含一个以输入文件名(无扩展名)为键的字典。每个值是一个包含每个表格字典的列表。每个表格字典包含: - `rows` - 按阅读顺序检测到的表格行 - `polygon` / `bbox` - 行几何形状(与其他地方相同的约定) - `row_id` - 0 索引的行 ID - `cols` - 检测到的表格列 - `polygon` / `bbox` - 列几何形状 - `col_id` - 0 索引的列 ID - `cells` - 简单模式中的几何行 × 列交叉(简单模式) - `polygon` / `bbox` - 单元格几何形状 - `row_id`、`col_id`、`cell_id` - `html` - 完整的 `...
` HTML(仅在 `predict_full` 使用时填充;处理跨越单元格/标题行)。简单模式中为 `null`。 - `mode` - `"simple"` 或 `"full"` - `image_bbox` - 表格裁剪的 bbox - `error` - 如果表格识别调用失败,则为 true - `raw` - 用于调试的原始模型输出 **性能提示** 表格识别通过共享的 VLM 路由。吞吐量调整与 OCR 相同。 ### 从 python ``` from PIL import Image from surya.inference import SuryaInferenceManager from surya.table_rec import TableRecPredictor table_rec_predictor = TableRecPredictor(SuryaInferenceManager()) # Default: rows + columns only, cells derived from intersections. table_predictions = table_rec_predictor([Image.open(IMAGE_PATH)]) # Or full HTML output (better for spanning cells / headers): # table_predictions = table_rec_predictor.predict_full([image]) ``` ## 数学/方程式 Surya 2 将数学作为全页 OCR 的一部分处理——识别到的方程式以与周围散文相同的 HTML 输出返回,在 KaTeX 兼容的 LaTeX 中,无需单独的 LaTeX OCR 过程。 # 推理后端 布局、OCR 和表格识别都共享一个 VLM,由 `vllm`(GPU)或 `llama.cpp`(CPU / Apple Silicon)提供。`SuryaInferenceManager` 将自动启动一个;您也可以指向一个正在运行的预启动服务器: ``` # Attach to an existing vllm export SURYA_INFERENCE_BACKEND=vllm export SURYA_INFERENCE_URL=http://localhost:8000/v1 ``` | 设置 | 默认 | 备注 | |-----------------------------------|-----------------------------------|--------------------------------------------------------| | `SURYA_INFERENCE_BACKEND` | auto (NVIDIA 有 vllm,否则 llamacpp) | `vllm` \| `llamacpp` \| unset (auto) | | `SURYA_INFERENCE_URL` | (自动启动) | 连接到正在运行的 OpenAI 兼容服务器 | | `SURYA_INFERENCE_PARALLEL` | 8 | 后端客户端并发 | | `SURYA_INFERENCE_KEEP_ALIVE` | false | 退出后保持启动的服务器运行(请参阅 `--keep_server`) | | `SURYA_GUIDED_LAYOUT` | true | JSON-schema 限制的布局解码 | # 局限性 - 这专门用于文档 OCR。在照片或自然场景上的性能不是目标。 - 布局、OCR 和表格识别都需要一个正在运行的推理后端(vllm 或 llama.cpp)。检测完全在 torch 上运行,无需它。 ## 故障排除 如果 OCR 未能正常工作: - 尝试提高图像的分辨率,以便文本更大。如果分辨率已经非常高,请尝试将其降低到不超过 `2048px` 宽度。 - 对图像进行预处理(二值化、倾斜校正等)可以帮助非常旧的/模糊的图像。 - 如果您
标签:OCR 模型, 光学字符识别, 图像识别, 多语言支持, 安全测试框架, 布局分析, 技术基准, 文本检测, 文本识别, 文档处理, 机器学习模型, 模型优化, 模型创新, 模型参数, 模型命名, 模型大小, 模型应用, 模型性能, 模型扩展, 模型效率, 模型比较, 模型精度, 模型评估, 模型速度, 模型部署, 深度学习, 表格识别, 逆向工具, 阅读顺序