Surya 是一个文档 OCR 工具包,具备以下功能:
它适用于多种类型的文档(更多详情请参阅使用说明和基准测试)。
如需使用我们的托管 API 或本地部署的文档智能解决方案,请查看我们的平台。
| 文本检测 | OCR |
|---|---|
![]() |
![]() |
| 布局分析 | 阅读顺序 |
|---|---|
![]() |
![]() |
| 表格识别 | LaTeX OCR |
|---|---|
![]() |
![]() |
Surya 以拥有全视之眼的印度太阳神命名。
我们主要在 Discord 讨论未来的开发计划。
| 名称 | 检测 | OCR | 布局 | 顺序 | 表格识别 |
|---|---|---|---|---|---|
| 日语 | 图片 | 图片 | 图片 | 图片 | 图片 |
| 中文 | 图片 | 图片 | 图片 | 图片 | |
| 印地语 | 图片 | 图片 | 图片 | 图片 | |
| 阿拉伯语 | 图片 | 图片 | 图片 | 图片 | |
| 中文 + 印地语 | 图片 | 图片 | 图片 | 图片 | |
| 演示文稿 | 图片 | 图片 | 图片 | 图片 | 图片 |
| 科学论文 | 图片 | 图片 | 图片 | 图片 | 图片 |
| 扫描文档 | 图片 | 图片 | 图片 | 图片 | 图片 |
| 纽约时报 | 图片 | 图片 | 图片 | 图片 | |
| 扫描表单 | 图片 | 图片 | 图片 | 图片 | 图片 |
| 教科书 | 图片 | 图片 | 图片 | 图片 |
我们为所有 Surya 模型提供了托管 API,可访问此处:
我们的模型权重采用修改后的 AI Pubs Open Rail-M 许可证(研究、个人使用以及融资/收入低于 200 万美元的初创公司可免费使用),我们的代码采用 GPL 许可证。如需更广泛的商业许可或移除 GPL 要求,请访问我们的定价页面。
你需要 Python 3.10+ 和 PyTorch。如果你不使用 Mac 或 GPU 机器,可能需要先安装 CPU 版本的 torch。更多详情请参阅此处。
使用以下命令安装:
pip install surya-ocr
模型权重将在首次运行 Surya 时自动下载。
surya/settings.py 中的设置。你可以使用环境变量覆盖任何设置。TORCH_DEVICE=cuda。我们包含了一个 Streamlit 应用,可以让你在图像或 PDF 文件上交互式地尝试 Surya。使用以下命令运行:
pip install streamlit pdftext
surya_gui
此命令将输出一个包含检测到的文本和边界框的 JSON 文件:
surya_ocr DATA_PATH
DATA_PATH 可以是图像、PDF 或图像/PDF 文件夹--task_name 将指定用于预测行的任务。默认是 ocr_with_boxes,它会格式化文本并提供边界框。如果效果不佳,可以尝试 ocr_without_boxes,它可能提供更好的性能但没有边界框。对于公式和段落等块,可以尝试 block_without_boxes。--images 将保存页面和检测到的文本行的图像(可选)--output_dir 指定保存结果的目录,而不是默认目录--page_range 指定要处理的 PDF 页面范围,格式可以是单个数字、逗号分隔的列表、范围或逗号分隔的范围 - 例如:0,5-10,20。--disable_math - 默认情况下,Surya 会识别文本中的数学公式。这可能导致误报 - 你可以使用此标志禁用它。results.json 文件将包含一个 JSON 字典,其中键是去除扩展名的输入文件名。每个值将是一个字典列表,对应输入文档的每一页。每个页面字典包含:
text_lines - 每行检测到的文本和边界框text - 行中的文本confidence - 模型对检测文本的置信度(0-1)polygon - 文本行的多边形坐标,格式为 (x1, y1), (x2, y2), (x3, y3), (x4, y4)。点按顺时针顺序从左上角开始。bbox - 文本行的轴对齐矩形,格式为 (x1, y1, x2, y2)。(x1, y1) 是左上角,(x2, y2) 是右下角。chars - 行中的单个字符text - 字符的文本bbox - 字符边界框(格式同行边界框)polygon - 字符多边形(格式同行多边形)confidence - 模型对检测字符的置信度(0-1)bbox_valid - 如果字符是特殊标记或数学符号,边界框可能无效words - 行中的单词(从字符计算得出)text - 单词的文本bbox - 单词边界框(格式同行边界框)polygon - 单词多边形(格式同行多边形)confidence - 平均字符置信度bbox_valid - 如果单词是特殊标记或数学符号,边界框可能无效page - 文件中的页码image_bbox - 图像的边界框,格式为 (x1, y1, x2, y2)。(x1, y1) 是左上角,(x2, y2) 是右下角。所有行边界框都将包含在此边界框内。性能提示
正确设置 RECOGNITION_BATCH_SIZE 环境变量在使用 GPU 时会带来很大差异。每个批次项将使用 40MB 的 VRAM,因此可以实现非常高的批次大小。默认批次大小为 512,将使用约 20GB 的 VRAM。根据你的 CPU 核心数,也可能有所帮助 - 默认的 CPU 批次大小是 32。
from PIL import Image
from surya.foundation import FoundationPredictor
from surya.recognition import RecognitionPredictor
from surya.detection import DetectionPredictor
image = Image.open(IMAGE_PATH)
foundation_predictor = FoundationPredictor()
recognition_predictor = RecognitionPredictor(foundation_predictor)
detection_predictor = DetectionPredictor()
predictions = recognition_predictor([image], det_predictor=detection_predictor)
此命令将输出一个包含检测到的边界框的 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 - 图像的边界框,格式为 (x1, y1, x2, y2)。(x1, y1) 是左上角,(x2, y2) 是右下角。所有行边界框都将包含在此边界框内。性能提示
正确设置 DETECTOR_BATCH_SIZE 环境变量在使用 GPU 时会带来很大差异。每个批次项将使用 440MB 的 VRAM,因此可以实现非常高的批次大小。默认批次大小为 36,将使用约 16GB 的 VRAM。根据你的 CPU 核心数,也可能有所帮助 - 默认的 CPU 批次大小是 6。
from PIL import Image
from surya.detection import DetectionPredictor
image = Image.open(IMAGE_PATH)
det_predictor = DetectionPredictor()
# predictions 是一个字典列表,每个图像对应一个字典
predictions = det_predictor([image])
此命令将输出一个包含检测到的布局和阅读顺序的 JSON 文件。
surya_layout 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)。点按顺时针顺序从左上角开始。position - 框的阅读顺序。label - 边界框的标签。可选值包括:Caption, Footnote, Formula, List-item, Page-footer, Page-header, Picture, Figure, Section-header, Table, Form, Table-of-contents, Handwriting, Text, Text-inline-math。top_k - 该框的其他潜在标签的 top-k 列表。一个以标签为键、置信度为值的字典。page - 文件中的页码image_bbox - 图像的边界框,格式为 (x1, y1, x2, y2)。(x1, y1) 是左上角,(x2, y2) 是右下角。所有行边界框都将包含在此边界框内。性能提示
正确设置 LAYOUT_BATCH_SIZE 环境变量在使用 GPU 时会带来很大差异。每个批次项将使用 220MB 的 VRAM,因此可以实现非常高的批次大小。默认批次大小为 32,将使用约 7GB 的 VRAM。根据你的 CPU 核心数,也可能有所帮助 - 默认的 CPU 批次大小是 4。
from PIL import Image
from surya.foundation import FoundationPredictor
from surya.layout import LayoutPredictor
from surya.settings import settings
image = Image.open(IMAGE_PATH)
layout_predictor = LayoutPredictor(FoundationPredictor(checkpoint=settings.LAYOUT_MODEL_CHECKPOINT))
# layout_predictions 是一个字典列表,每个图像对应一个字典
layout_predictions = layout_predictor([image])
此命令将输出一个 JSON 文件,其中包含检测到的表格单元格、行/列 ID 以及行/列边界框。如果你想获取单元格位置和文本,并进行良好的格式化,请查看 marker 仓库。你可以使用 TableConverter 来检测和提取图像和 PDF 中的表格。它支持 JSON(带边界框)、Markdown 和 HTML 输出。
surya_table DATA_PATH
DATA_PATH 可以是图像、PDF 或图像/PDF 文件夹--images 将保存页面和检测到的表格单元格 + 行和列的图像(可选)--output_dir 指定保存结果的目录,而不是默认目录--page_range 指定要处理的 PDF 页面范围,格式可以是单个数字、逗号分隔的列表、范围或逗号分隔的范围 - 例如:0,5-10,20。--detect_boxes 指定是否应检测单元格。默认情况下,它们是从 PDF 中提取的,但这并不总是可行。--skip_table_detection 告诉表格识别不要先检测表格。如果你的图像已经裁剪到表格区域,请使用此选项。results.json 文件将包含一个 JSON 字典,其中键是去除扩展名的输入文件名。每个值将是一个字典列表,对应输入文档的每一页。每个页面字典包含:
rows - 检测到的表格行bbox - 表格行的边界框row_id - 行的 IDis_header - 是否为标题行。cols - 检测到的表格列bbox - 表格列的边界框col_id - 列的 IDis_header - 是否为标题列cells - 检测到的表格单元格bbox - 文本行的轴对齐矩形,格式为 (x1, y1, x2, y2)。(x1, y1) 是左上角,(x2, y2) 是右下角。text - 如果可以从 PDF 中提取文本,