surya

surya

开源多语言文档识别与分析工具

Surya是一个开源文档OCR工具包,支持90多种语言的文本识别,性能可与云服务媲美。它提供行级文本检测、布局分析和阅读顺序检测等功能,适用于多种文档类型。Surya不仅识别文本,还能分析文档结构,为文档解析提供全面解决方案。该工具适合研究和个人使用,商业使用需注意相关许可条件。

SuryaOCR文档处理布局分析多语言识别Github开源项目

Surya

Surya是一个文档OCR工具包,具有以下功能:

  • 支持90多种语言的OCR,性能与云服务相当
  • 任何语言的行级文本检测
  • 布局分析(表格、图像、标题等检测)
  • 阅读顺序检测

它适用于各种文档(详见用法基准测试)。

检测OCR
纽约时报文章检测纽约时报文章识别
布局阅读顺序
纽约时报文章布局纽约时报文章阅读顺序

Surya以印度太阳神命名,象征全视之能。

社区

我们在Discord讨论未来发展。

示例

名称检测OCR布局顺序
日语图片图片图片图片
中文图片图片图片图片
印地语图片图片图片图片
阿拉伯语图片图片图片图片
中文+印地语图片图片图片图片
演示文稿图片图片图片图片
科学论文图片图片图片图片
扫描文档图片图片图片图片
纽约时报图片图片图片图片
扫描表格图片图片图片图片
教科书图片图片图片图片

托管API

所有Surya模型的托管API可在这里获取:

  • 支持PDF、图像、Word文档和PowerPoint
  • 稳定的速度,无延迟波动
  • 高可靠性和高可用性

商业使用

我希望Surya能尽可能广泛地使用,同时仍能支付我的开发和训练成本。研究和个人使用始终是允许的,但商业使用有一些限制。

模型权重采用cc-by-nc-sa-4.0许可,但对于最近12个月总收入不超过500万美元且累计风险投资/天使投资不超过500万美元的组织,我将豁免此限制。此外,您不得与Datalab API存在竞争关系。如果您想解除GPL许可要求(双重许可)和/或在超过收入限制的情况下商业使用权重,请查看这里的选项。

安装

您需要Python 3.9+和PyTorch。如果您不使用Mac或GPU机器,可能需要先安装CPU版本的torch。详情请参见此处

通过以下命令安装:

pip install surya-ocr

首次运行Surya时,模型权重将自动下载。

使用方法

  • 检查surya/settings.py中的设置。您可以使用环境变量覆盖任何设置。
  • 系统会自动检测您的torch设备,但您可以手动覆盖。例如,TORCH_DEVICE=cuda

交互式应用

我提供了一个Streamlit应用,让您可以在图像或PDF文件上交互式地试用Surya。使用以下命令运行:

pip install streamlit surya_gui

OCR(文本识别)

以下命令将输出一个包含检测到的文本和边界框的JSON文件:

surya_ocr DATA_PATH
  • DATA_PATH可以是图像、PDF或包含图像/PDF的文件夹
  • --langs是一个可选(但推荐使用)的参数,用于指定OCR使用的语言。可以用逗号分隔多种语言。使用此处的语言名称或两字母ISO代码。Surya支持surya/languages.py中的90多种语言。
  • --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时会产生很大影响。每个批次项目将使用40MB的VRAM,因此可以使用非常大的批次大小。默认批次大小为512,这将使用约20GB的VRAM。根据您的CPU核心数,它也可能有帮助 - 默认CPU批次大小为32

从Python使用

from PIL import Image from surya.ocr import run_ocr from surya.model.detection.model import load_model as load_det_model, load_processor as load_det_processor from surya.model.recognition.model import load_model as load_rec_model from surya.model.recognition.processor import load_processor as load_rec_processor image = Image.open(IMAGE_PATH) langs = ["en"] # 替换为您的语言 - 可选但推荐 det_processor, det_model = load_det_processor(), load_det_model() rec_model, rec_processor = load_rec_model(), load_rec_processor() predictions = run_ocr([image], [langs], det_model, det_processor, rec_model, rec_processor)

编译

OCR模型可以编译以获得约15%的总推理时间加速。第一次运行时会比较慢,因为它在编译。首先设置RECOGNITION_STATIC_CACHE=true,然后:

import torch rec_model.decoder.model = torch.compile(rec_model.decoder.model)

文本行检测

此命令将输出一个包含检测到的边界框的JSON文件。

surya_detect DATA_PATH
  • 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)
  • vertical_lines - 文档中检测到的垂直线
    • bbox - 轴对齐的线坐标。
  • page - 文件中的页码
  • image_bbox - 图像的bbox,格式为(x1, y1, x2, y2)。(x1, y1)是左上角,(x2, y2)是右下角。所有行的bbox都将包含在这个bbox内。

性能提示

正确设置DETECTOR_BATCH_SIZE环境变量在使用GPU时会产生很大影响。每个批次项目将使用440MB的VRAM,因此可以使用非常大的批次大小。默认批次大小为36,这将使用约16GB的VRAM。根据您的CPU核心数,它也可能有帮助 - 默认CPU批次大小为6

从Python使用

from PIL import Image from surya.detection import batch_text_detection from surya.model.detection.model import load_model, load_processor image = Image.open(IMAGE_PATH) model, processor = load_model(), load_processor() # predictions是一个字典列表,每个图像对应一个 predictions = batch_text_detection([image], model, processor)

布局分析

此命令将输出一个包含检测到的布局的JSON文件。

surya_layout DATA_PATH
  • 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 - 图像的边界框,格式为(x1, y1, x2, y2)。(x1, y1)是左上角,(x2, y2)是右下角。所有行的边界框都将包含在这个边界框内。

性能提示

正确设置DETECTOR_BATCH_SIZE环境变量在使用GPU时会产生很大差异。每个批处理项目将使用400MB的VRAM,所以可以使用非常大的批处理大小。默认批处理大小为36,将使用约16GB的VRAM。根据您的CPU核心数,这也可能有帮助 - 默认CPU批处理大小是6

Python示例

from PIL import Image from surya.detection import batch_text_detection from surya.layout import batch_layout_detection from surya.model.detection.model import load_model, load_processor from surya.settings import settings image = 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是一个字典列表,每个图像对应一个 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
  • DATA_PATH可以是图像、PDF或图像/PDF文件夹
  • --images将保存页面和检测到的文本行的图像(可选)
  • --max指定要处理的最大页数(如果您不想处理全部内容)
  • --results_dir指定保存结果的目录(而不是默认目录)

results.json文件将包含一个JSON字典,其中键是不带扩展名的输入文件名。每个值将是一个字典列表,输入文档的每页对应一个。每页字典包含:

  • bboxes - 检测到的文本边界框
    • bbox - 文本行的轴对齐矩形,格式为(x1, y1, x2, y2)。(x1, y1)是左上角,(x2, y2)是右下角。
    • position - 边界框在阅读顺序中的位置,从0开始。
    • label - 边界框的标签。有关可能标签的列表,请参阅文档的布局部分。
  • page - 文件中的页码
  • image_bbox - 图像的边界框,格式为(x1, y1, x2, y2)。(x1, y1)是左上角,(x2, y2)是右下角。所有行的边界框都将包含在这个边界框内。

性能提示

正确设置ORDER_BATCH_SIZE环境变量在使用GPU时会产生很大差异。每个批处理项目将使用360MB的VRAM,所以可以使用非常大的批处理大小。默认批处理大小为32,将使用约11GB的VRAM。根据您的CPU核心数,这也可能有帮助 - 默认CPU批处理大小是4

Python示例

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_model image = Image.open(IMAGE_PATH) # bboxes应该是一个列表的列表,包含图像的布局边界框,格式为[x1,y1,x2,y2] # 您可以从布局模型获取此信息,请参阅上面的用法 bboxes = [bbox1, bbox2, ...] model = load_model() processor = load_processor() # order_predictions将是一个字典列表,每个图像对应一个 order_predictions = batch_ordering([image], [bboxes], model, processor)

局限性

  • 这是专门用于文档OCR的。它可能不适用于照片或其他图像。
  • 它适用于印刷文本,不适用于手写文字(尽管它可能适用于某些手写文字)。
  • 文本检测模型已经训练自己忽略广告。
  • 您可以在surya/languages.py中找到OCR的语言支持。文本检测、布局分析和阅读顺序适用于任何语言。

故障排除

如果OCR无法正常工作:

  • 尝试增加图像分辨率,使文本更大。如果分辨率已经很高,请尝试将其降低到不超过2048px宽。
  • 对非常旧/模糊的图像进行预处理(二值化、倾斜校正等)可能会有帮助。
  • 如果您无法获得良好的结果,可以调整DETECTOR_BLANK_THRESHOLDDETECTOR_TEXT_THRESHOLDDETECTOR_BLANK_THRESHOLD控制行间距 - 任何低于这个数字的预测都将被视为空白空间。DETECTOR_TEXT_THRESHOLD控制文本如何连接 - 任何高于这个数字的都被认为是文本。DETECTOR_TEXT_THRESHOLD应始终高于DETECTOR_BLANK_THRESHOLD,两者都应在0-1范围内。查看检测器调试输出的热图可以告诉你如何调整这些参数(如果你看到看起来像盒子的微弱东西,降低阈值,如果你看到边界框被连接在一起,提高阈值)。

手动安装

如果您想开发surya,可以手动安装:

  • git clone https://github.com/VikParuchuri/surya.git
  • cd surya
  • poetry install - 安装主要和开发依赖项
  • poetry shell - 激活虚拟环境

基准测试

OCR

Benchmark chart tesseract

模型每页时间(秒)平均相似度 (⬆)
surya.620.97
tesseract.450.88

完整语言结果 Tesseract基于CPU运行,而surya可以在CPU或GPU上运行。我尝试匹配使用的资源成本,所以我为surya使用了1个A6000 GPU(48GB显存),为Tesseract使用了28个CPU核心(在Lambda Labs/DigitalOcean上价格相同)。

Google Cloud Vision

我对比了OCR与Google Cloud Vision的性能,因为它的语言覆盖范围与Surya类似。

Google Cloud基准测试图表

完整语言结果

方法

我基于一组真实和合成的PDF文件测量了归一化的句子相似度(0-1,越高越好)。我从通用网络爬虫中抽样PDF,然后过滤掉OCR效果不佳的文件。有些语言找不到PDF,所以我还为这些语言生成了简单的合成PDF。

我对Tesseract和surya都使用了PDF中的参考行边界框,只评估OCR质量。

对于Google Cloud,我将其输出与标准答案对齐。由于无法很好地对齐从右到左的语言,我不得不跳过这些语言。

文本行检测

基准测试图表

模型总时间(秒)每页时间(秒)精确度召回率
surya50.20990.1961330.8210610.956556
tesseract74.45460.2908380.6314980.997694

Tesseract基于CPU,而surya可以在CPU或GPU上运行。我在一个配备A10 GPU和32核CPU的系统上运行基准测试。资源使用情况如下:

  • tesseract - 32个CPU核心,或8个工作进程,每个使用4个核心
  • surya - 批处理大小为36,使用16GB显存

方法

Surya预测行级边界框,而tesseract和其他工具预测词级或字符级。很难找到100%正确的数据集,且带有行级标注。合并边界框可能会产生噪声,所以我选择不使用IoU作为评估指标。

我改用覆盖率,计算方法如下:

  • 精确度 - 预测的边界框覆盖标准答案边界框的程度
  • 召回率 - 标准答案边界框覆盖预测边界框的程度

首先计算每个边界框的覆盖率,然后对重复覆盖添加小惩罚,因为我们希望检测结果的边界框不重叠。覆盖率0.5或更高被视为匹配。

然后我们计算整个数据集的精确度和召回率。

版面分析

基准测试图表

版面类型精确度召回率
图像0.970.96
表格0.990.99
文本0.90.97
标题0.940.88

每张图像处理时间 - GPU(A10)上0.4秒。

方法

我在Publaynet上对版面分析进行基准测试,该数据集不在训练数据中。我需要将Publaynet标签与surya版面标签对齐。然后我能够找到每种版面类型的覆盖率:

  • 精确度 - 预测的边界框覆盖标准答案边界框的程度
  • 召回率 - 标准答案边界框覆盖预测边界框的程度

阅读顺序

平均准确率75%,在A6000 GPU上每张图像处理时间0.14秒。请参阅方法说明 - 这个基准测试并不是完美的准确性度量,更多是作为一种合理性检查。

方法

我在这里的版面数据集上对版面分析进行基准测试,该数据集不在训练数据中。不幸的是,这个数据集相当嘈杂,并非所有标签都是正确的。找到一个同时标注了阅读顺序和版面信息的数据集非常困难。我想避免使用云服务作为标准答案。

准确率的计算方法是判断每对版面框是否按正确顺序排列,然后取正确排序的百分比。

运行您自己的基准测试

您可以在自己的机器上对surya的性能进行基准测试。

  • 按照上面的手动安装说明进行操作。
  • poetry install --group dev - 安装开发依赖

文本行检测

这将评估tesseract和surya在从doclaynet随机抽样的一组图像上的文本行检测性能。

python benchmark/detection.py --max 256
  • --max 控制基准测试处理的图像数量
  • --debug 将渲染图像和检测到的边界框
  • --pdf_path 允许您指定要进行基准测试的PDF,而不是使用默认数据
  • --results_dir 允许您指定保存结果的目录,而不是使用默认目录

文本识别

这将评估surya和可选的tesseract在来自通用网络爬虫的多语言PDF上的性能(对缺失的语言使用合成数据)。

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 以使用与基准测试相同的批处理大小。

  • 设置 RECOGNITION_BENCH_DATASET_NAME=vikp/rec_bench_hist 以使用历史文档数据进行基准测试。这些数据来自tapuscorpus

版面分析

这将在publaynet数据集上评估surya的性能。

python benchmark/layout.py
  • --max 控制基准测试处理的图像数量
  • --debug 将渲染带有检测文本的图像
  • --results_dir 允许您指定保存结果的目录,而不是使用默认目录

阅读顺序

python benchmark/ordering.py
  • --max 控制基准测试处理的图像数量
  • --debug 将渲染带有检测文本的图像
  • --results_dir 允许您指定保存结果的目录,而不是使用默认目录

训练

文本检测在4块A6000显卡上训练了3天。它使用了多样化的图像作为训练数据。从头开始使用经过修改的efficientvit架构进行语义分割训练。

文本识别在4块A6000显卡上训练了2周。它使用了经过修改的donut模型进行训练(包括GQA、MoE层、UTF-16解码、层配置更改)。

致谢

没有这些杰出的开源人工智能项目,本工作将无法完成:

感谢所有为开源人工智能做出贡献的人。

编辑推荐精选

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

Trae

Trae

字节跳动发布的AI编程神器IDE

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

openai-agents-python

openai-agents-python

OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。

openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。

Hunyuan3D-2

Hunyuan3D-2

高分辨率纹理 3D 资产生成

Hunyuan3D-2 是腾讯开发的用于 3D 资产生成的强大工具,支持从文本描述、单张图片或多视角图片生成 3D 模型,具备快速形状生成能力,可生成带纹理的高质量 3D 模型,适用于多个领域,为 3D 创作提供了高效解决方案。

3FS

3FS

一个具备存储、管理和客户端操作等多种功能的分布式文件系统相关项目。

3FS 是一个功能强大的分布式文件系统项目,涵盖了存储引擎、元数据管理、客户端工具等多个模块。它支持多种文件操作,如创建文件和目录、设置布局等,同时具备高效的事件循环、节点选择和协程池管理等特性。适用于需要大规模数据存储和管理的场景,能够提高系统的性能和可靠性,是分布式存储领域的优质解决方案。

下拉加载更多