Surya 是一个文档 OCR 工具包,其功能如下:
- 支持 90 多种语言的 OCR,与云服务相比具有优势
- 任何语言的行级文本检测
- 布局分析(表格、图像、标题等检测)
- 阅读顺序检测
它适用于一系列文档(有关更多详细信息,请参阅使用情况和基准)。
检测 | 光学字符识别 (OCR) |
---|---|
![]() |
![]() |
布局 | 阅读顺序 |
---|---|
![]() |
![]() |
苏利耶(Surya)以印度教太阳神的名字命名,他具有宇宙视野。
Discord是我们讨论未来发展的地方。
姓名 | 检测 | 光学字符识别 (OCR) | 布局 | 命令 |
---|---|---|---|---|
日本人 | 图像 | 图像 | 图像 | 图像 |
中国人 | 图像 | 图像 | 图像 | 图像 |
印地语 | 图像 | 图像 | 图像 | 图像 |
阿拉伯 | 图像 | 图像 | 图像 | 图像 |
中文 + 印地语 | 图像 | 图像 | 图像 | 图像 |
推介会 | 图像 | 图像 | 图像 | 图像 |
科学论文 | 图像 | 图像 | 图像 | 图像 |
扫描文件 | 图像 | 图像 | 图像 | 图像 |
纽约时报 | 图像 | 图像 | 图像 | 图像 |
扫描表格 | 图像 | 图像 | 图像 | 图像 |
教科书 | 图像 | 图像 | 图像 | 图像 |
我希望 surya 能够尽可能广泛地普及,同时仍能为我的开发/培训费用提供资金。研究和个人使用始终是可以的,但商业使用会受到一些限制。
这些模型的权重是经过授权的cc-by-nc-sa-4.0
,但对于最近 12 个月内总收入低于 500 万美元且一生中筹集的 VC/天使资金低于 500 万美元的任何组织,我将免除该授权。如果您想删除 GPL 许可要求(双重许可)和/或在收入限制之外将权重用于商业用途,请查看此处的选项。
您需要 Python 3.9+ 和 PyTorch。如果您使用的不是 Mac 或 GPU 机器,则可能需要先安装 CPU 版本的 torch。请参阅此处了解更多详细信息。
安装方式:
pip install surya-ocr
首次运行 surya 时,模型权重将自动下载。请注意,此功能尚不适用于最新版本的 transformers 4.37+
,因此您需要保留4.36.2
随 surya 一起安装的。
- 检查中的设置
surya/settings.py
。您可以使用环境变量覆盖任何设置。 - 您的 Torch 设备将被自动检测,但您可以覆盖此设置。例如,
TORCH_DEVICE=cuda
。对于文本检测,该mps
设备有一个错误(在Apple 方面),可能会阻止其正常工作。
我提供了一个 streamlit 应用程序,可让您以交互方式在图像或 PDF 文件上试用 Surya。使用以下命令运行它:
pip install streamlit surya_gui
传递--math
命令行参数以使用数学文本检测模型而不是默认模型。这将更好地检测数学,但其他方面会更差。
此命令将写出包含检测到的文本和 bbox 的 json 文件:
surya_ocr DATA_PATH --images --langs hi,en
DATA_PATH
可以是图像、pdf 或图像/pdf 文件夹--langs
指定用于 OCR 的语言。您可以用逗号分隔多种语言(我不建议使用超过)。使用此处的4
语言名称或两个字母的 ISO 代码。Surya 支持 中的 90 多种语言。surya/languages.py
--lang_file
如果您想对不同的 PDF/图像使用不同的语言,您可以在此处指定语言。格式为 JSON 字典,键为文件名,值是列表,例如{"file1.pdf": ["en", "hi"], "file2.pdf": ["en"]}
。--images
将保存页面图像和检测到的文本行(可选)--results_dir
指定保存结果的目录,而不是默认目录--max
如果您不想处理所有内容,请指定要处理的最大页数--start_page
指定开始处理的页码
该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)是右下角。
languages
- 页面指定的语言page
- 文件中的页码image_bbox
- 图像的 bbox 格式为 (x1, y1, x2, y2)。(x1, y1) 是左上角,(x2, y2) 是右下角。所有线 bbox 都将包含在此 bbox 内。
性能提示
正确设置RECOGNITION_BATCH_SIZE
环境变量在使用 GPU 时会产生很大的不同。每个批次项目都将使用50MB
VRAM,因此批次大小可能非常大。默认批次大小为256
,将使用大约 12.8GB 的 VRAM。根据您的 CPU 核心数,它也可能有帮助 - 默认 CPU 批次大小为32
。
from PIL import Image from surya.ocr import run_ocr from surya.model.detection import segformer from surya.model.recognition.model import load_model from surya.model.recognition.processor import load_processorimage = Image.open(IMAGE_PATH) langs = ["en"] # Replace with your languages det_processor, det_model = segformer.load_processor(), segformer.load_model() rec_model, rec_processor = load_model(), load_processor()
predictions = run_ocr([image], [langs], det_model, det_processor, rec_model, rec_processor)
此命令将写出包含检测到的 bbox 的 json 文件。
surya_detect DATA_PATH --images
DATA_PATH
可以是图像、pdf 或图像/pdf 文件夹--images
将保存页面图像和检测到的文本行(可选)--max
如果您不想处理所有内容,请指定要处理的最大页数--results_dir
指定保存结果的目录,而不是默认目录--math
使用专门的数学检测模型,而不是默认模型。这在数学方面会更好,但在其他方面会更差。
该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) 是右下角。所有线 bbox 都将包含在此 bbox 内。
性能提示
正确设置DETECTOR_BATCH_SIZE
环境变量在使用 GPU 时会产生很大的不同。每个批次项目都将使用280MB
VRAM,因此批次大小可能非常大。默认批次大小为32
,将使用大约 9GB 的 VRAM。根据您的 CPU 核心数量,它也可能有帮助 - 默认 CPU 批次大小为2
。
from PIL import Image from surya.detection import batch_text_detection from surya.model.detection.segformer import load_model, load_processorimage = Image.open(IMAGE_PATH) model, processor = load_model(), load_processor()
# predictions is a list of dicts, one per image predictions = batch_text_detection([image], model, processor)
此命令将写出包含检测到的布局的 json 文件。
surya_layout DATA_PATH --images
DATA_PATH
可以是图像、pdf 或图像/pdf 文件夹--images
将保存页面图像和检测到的文本行(可选)--max
如果您不想处理所有内容,请指定要处理的最大页数--results_dir
指定保存结果的目录,而不是默认目录
该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)。目前这不是很可靠。label
-边界框的标签。以下之一Caption
:,,,,,,,,,,,,。Footnote
Formula
List-item
Page-footer
Page-header
Picture
Figure
Section-header
Table
Text
Title
page
- 文件中的页码image_bbox
- 图像的 bbox 格式为 (x1, y1, x2, y2)。(x1, y1) 是左上角,(x2, y2) 是右下角。所有线 bbox 都将包含在此 bbox 内。
性能提示
正确设置DETECTOR_BATCH_SIZE
环境变量在使用 GPU 时会产生很大的不同。每个批次项目都将使用280MB
VRAM,因此批次大小可能非常大。默认批次大小为32
,将使用大约 9GB 的 VRAM。根据您的 CPU 核心数量,它也可能有帮助 - 默认 CPU 批次大小为2
。
from PIL import Image from surya.detection import batch_text_detection from surya.layout import batch_layout_detection from surya.model.detection.segformer import load_model, load_processor from surya.settings import settingsimage = Image.open(IMAGE_PATH) model = load_model(checkpoint=settings.LAYOUT_MODEL_CHECKPOINT) processor = load_processor(checkpoint=settings.LAYOUT_MODEL_CHECKPOINT) det_model = load_model() det_processor = load_processor()
# layout_predictions is a list of dicts, one per image line_predictions = batch_text_detection([image], det_model, det_processor) layout_predictions = batch_layout_detection([image], model, processor, line_predictions)
此命令将写出一个具有检测到的阅读顺序和布局的 json 文件。
surya_order DATA_PATH --images
DATA_PATH
可以是图像、pdf 或图像/pdf 文件夹--images
将保存页面图像和检测到的文本行(可选)--max
如果您不想处理所有内容,请指定要处理的最大页数--results_dir
指定保存结果的目录,而不是默认目录
该results.json
文件将包含一个 JSON 字典,其中的键是输入文件名(不带扩展名)。每个值都是一个字典列表,输入文档的每个页面对应一个字典。每个页面字典包含:
bboxes
- 检测文本的边界框bbox
- (x1,y1,x2,y2)格式的文本行的轴对齐矩形。(x1,y1)是左上角,(x2,y2)是右下角。position
- bbox 的阅读顺序中的位置,从 0 开始。label
- bbox 的标签。请参阅文档的布局部分以获取潜在标签的列表。
page
- 文件中的页码image_bbox
- 图像的 bbox 格式为 (x1, y1, x2, y2)。(x1, y1) 是左上角,(x2, y2) 是右下角。所有线 bbox 都将包含在此 bbox 内。
性能提示
正确设置ORDER_BATCH_SIZE
环境变量在使用 GPU 时会产生很大的不同。每个批次项目都将使用360MB
VRAM,因此批次大小可能非常大。默认批次大小为32
,将使用大约 11GB 的 VRAM。根据您的 CPU 核心数量,它也可能有帮助 - 默认 CPU 批次大小为4
。
from PIL import Image from surya.ordering import batch_ordering from surya.model.ordering.processor import load_processor from surya.model.ordering.model import load_modelimage = Image.open(IMAGE_PATH) # bboxes should be a list of lists with layout bboxes for the image in [x1,y1,x2,y2] format # You can get this from the layout model, see above for usage bboxes = [bbox1, bbox2, ...]
model = load_model() processor = load_processor()
# order_predictions will be a list of dicts, one per image order_predictions = batch_ordering([image], [bboxes], model, processor)
- 这是专门用于文档 OCR 的。它可能不适用于照片或其他图像。
- 它适用于印刷文本,而不是手写文本(尽管它可能适用于某些手写文本)。
- 文本检测模型已经训练自己忽略广告。
- 您可以在 中找到 OCR 的语言支持
surya/languages.py
。文本检测、布局分析和阅读顺序适用于任何语言。
如果 OCR 无法正常工作:
- 尝试增加图像的分辨率,使文本更大。如果分辨率已经很高,请尝试将其降低到不超过宽度
2048px
。 - 对图像进行预处理(二值化、去倾斜等)可以帮助修复非常旧/模糊的图像。
- 如果结果不佳, 您可以调整
DETECTOR_BLANK_THRESHOLD
和。控制行之间的空间 - 任何低于此数字的预测都将被视为空白。 控制文本的连接方式 - 任何高于此数字的数字都将被视为文本。 应始终高于,并且两者都应在 0-1 范围内。查看检测器调试输出中的热图可以告诉您如何调整这些(如果您看到看起来像盒子的微弱的东西,请降低阈值,如果您看到 bbox 连接在一起,请提高阈值)。DETECTOR_TEXT_THRESHOLD
DETECTOR_BLANK_THRESHOLD
DETECTOR_TEXT_THRESHOLD
DETECTOR_TEXT_THRESHOLD
DETECTOR_BLANK_THRESHOLD
如果要开发surya,可以手动安装:
git clone https://github.com/VikParuchuri/surya.git
cd surya
poetry install
- 安装主要和开发依赖项poetry shell
- 激活虚拟环境
模型 | 每页时间(秒) | 平均相似度 (⬆) |
---|---|---|
苏里亚 | .62 | 0.97 |
立方体 | .45 | 0.88 |
Tesseract 基于 CPU,而 surya 是 CPU 或 GPU。我尝试匹配所使用的资源成本,因此我为 surya 使用了 1xA6000(48GB VRAM),为 Tesseract 使用了 28 个 CPU 核心(Lambda Labs/DigitalOcean 上的价格相同)。
我将 OCR 与 Google Cloud Vision 进行了对比测试,因为它的语言覆盖范围与 Surya 相似。
方法
我根据一组真实世界和合成 PDF 测量了标准化句子相似度(0-1,越高越好)。我从常见的抓取中抽样 PDF,然后过滤掉 OCR 效果较差的 PDF。我找不到某些语言的 PDF,因此我还为这些语言生成了简单的合成 PDF。
我使用了 tesseract 和 surya 的 PDF 中的参考线 bbox 来评估 OCR 质量。
对于 Google Cloud,我将 Google Cloud 的输出与基本事实进行了对齐。我不得不跳过 RTL 语言,因为它们对齐效果不佳。
模型 | 时间(秒) | 每页时间(秒) | 精确 | 记起 |
---|---|---|---|---|
苏里亚 | 52.6892 | 0.205817 | 0.844426 | 0.937818 |
立方体 | 74.4546 | 0.290838 | 0.631498 | 0.997694 |
Tesseract 基于 CPU,而 surya 是 CPU 或 GPU。我在具有 A6000 GPU 和 32 核 CPU 的系统上运行了基准测试。这是资源使用情况:
- tesseract - 32 个 CPU 核心,或 8 个工作器,每个工作器使用 4 个核心
- surya - 批处理大小为 32,用于 9GB VRAM 使用
方法
Surya 预测行级边界框,而 tesseract 和其他预测词级或字符级边界框。很难找到 100% 正确的带有行级注释的数据集。合并边界框可能会产生噪音,因此我选择不使用 IoU 作为评估指标。
我改用覆盖率,其计算结果为:
- 精度 - 预测的边界框与真实边界框的覆盖程度
- 召回率 - 真实边界框与预测边界框的覆盖程度
首先计算每个 bbox 的覆盖率,然后对双重覆盖率添加一个小惩罚,因为我们希望检测具有不重叠的 bbox。覆盖率为 0.5 或更高的任何内容都被视为匹配。
然后我们计算整个数据集的精度和召回率。
布局类型 | 精确 | 记起 |
---|---|---|
图像 | 0.95 | 0.99 |
桌子 | 0.95 | 0.96 |
文本 | 0.89 | 0.95 |
标题 | 0.92 | 0.89 |
每张图像的时间 - GPU(A6000)上为 0.79 秒。
方法
我对Publaynet的布局分析进行了基准测试,而训练数据中没有这个功能。我必须将 publaynet 标签与 surya 布局标签对齐。然后我就能找到每种布局类型的覆盖范围:
- 精度 - 预测的边界框与真实边界框的覆盖程度
- 召回率 - 真实边界框与预测边界框的覆盖程度
在 A6000 GPU 上,平均准确率 75%,每张图像耗时 0.14 秒。请参阅方法论中的注释 - 此基准并非准确率的完美衡量标准,更适合用作健全性检查。
方法
我对此处的布局数据集进行了基准测试,该数据集不在训练数据中。不幸的是,这个数据集相当嘈杂,并非所有标签都是正确的。很难找到一个带有阅读顺序和布局信息注释的数据集。我想避免使用云服务来获取基本事实。
准确度的计算方法是:检查每对布局框的顺序是否正确,然后取正确的百分比。
您可以在您的机器上对 surya 的性能进行基准测试。
- 按照上面的手动安装说明进行操作。
poetry install --group dev
- 安装开发依赖项
文本行检测
这将评估 tesseract 和 surya 在从doclaynet随机采样的一组图像中进行文本行检测的能力。
python benchmark/detection.py --max 256
--max
控制基准测试需要处理的图像数量--debug
将渲染图像并检测到的框--pdf_path
将允许您指定 pdf 来作为基准,而不是默认数据--results_dir
将允许您指定保存结果的目录,而不是默认目录
文本识别
这将评估来自常见抓取的多语言 PDF 上的 surya 和可选的 tesseract(使用缺失语言的合成数据)。
python benchmark/recognition.py --tesseract
--max
控制基准测试需要处理的图像数量--debug 2
将呈现检测到的文本的图像--results_dir
将允许您指定保存结果的目录,而不是默认目录--tesseract
将使用 tesseract 运行基准测试。您必须运行sudo apt-get install tesseract-ocr-all
以安装所有 tesseract 数据,并设置TESSDATA_PREFIX
为 tesseract 数据文件夹的路径。- 设置
RECOGNITION_BATCH_SIZE=864
为使用与基准相同的批次大小。
布局分析
这将在 publaynet 数据集上评估 surya。
python benchmark/layout.py
--max
控制基准测试需要处理的图像数量--debug
将呈现检测到的文本的图像--results_dir
将允许您指定保存结果的目录,而不是默认目录
阅读顺序
python benchmark/ordering.py
--max
控制基准测试需要处理的图像数量--debug
将呈现检测到的文本的图像--results_dir
将允许您指定保存结果的目录,而不是默认目录
文本检测在 4 台 A6000 上训练了 3 天。它使用一组不同的图像作为训练数据。它是使用经过修改的 segformer 架构从头开始训练的,该架构可降低推理 RAM 要求。
文本识别在 4x A6000 上训练了 2 周。使用修改后的甜甜圈模型(GQA、MoE 层、UTF-16 解码、层配置更改)进行训练。
如果没有出色的开源 AI 工作,这项工作就不可能实现:
感谢所有使开源 AI 成为可能的人。