Surya - OCR、布局分析、阅读顺序、语言检测

文章目录


一、关于 Surya

Surya 实现 OCR、布局分析、阅读顺序、90多种语言的行检测。


功能特性

  • 90多种语言的OCR,与云服务相比具有良好的基准测试
  • 任何语言的行级文本检测
  • 布局分析(表格、图像、标题等检测)
  • 读取顺序检测

它适用于一系列文档(有关详细信息,请参阅 用法 和 基准测试)。

检测 OCR
布局 阅读顺序

Surya 是以印度教太阳神命名的,他有普遍的视野。


例子

Name Detection OCR Layout Order
Japanese Image Image Image Image
Chinese Image Image Image Image
Hindi Image Image Image Image
Arabic Image Image Image Image
Chinese + Hindi Image Image Image Image
Presentation Image Image Image Image
Scientific Paper Image Image Image Image
Scanned Document Image Image Image Image
New York Times Image Image Image Image
Scanned Form Image Image Image Image
Textbook

训练

文本检测在4x A6000s上训练了3天。它使用一组不同的图像作为训练数据。它是使用改进的高效架构从头开始训练的,用于语义分割。

文本识别在4x A6000s上训练了2周。它使用修改后的甜甜圈模型(GQA、MoE层、UTF-16解码、层配置更改)进行训练。


托管API

有一个适用于所有 Surya模型的托管API在这里

  • 适用于PDF、图像、word文档和幻灯片
  • 一致的速度,没有延迟峰值
  • 高可靠性和正常运行时间

商业用途

我希望surya尽可能广泛地访问,同时仍然资助我的开发/培训费用。研究和个人使用总是可以的,但是商业使用有一些限制。

模型的权重是cc-by-nc-sa-4.0许可的,但是对于最近12个月总收入低于500万美元和终身风险投资/天使基金筹集不到500万美元的任何组织,我将放弃这一点。如果你想取消GPL许可要求(双许可)和/或在商业上使用超过收入限制的权重,请查看此处的选项。


二、安装

您需要python 3.9+和PyTorch。如果您不使用Mac或GPU机器,您可能需要先安装torch的CPU版本。有关更多详细信息,请参阅此处

安装:

shell 复制代码
pip install surya-ocr

模型权重将在您第一次运行surya时自动下载。


手动安装

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

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

三、用法

  • 检查surya/settings.py中的设置。您可以使用环境变量覆盖任何设置。
  • 您的 torch device 将被自动检测到,但您可以覆盖它。例如,TORCH_DEVICE=cuda

1、交互应用

我包含了一个 streamlit 应用程序,可让您在图像或PDF文件上以交互方式尝试Surya。运行它:

shell 复制代码
pip install streamlit
surya_gui

2、OCR(文本识别)

此命令将写出一个包含检测到的文本和bbox的json文件:

shell 复制代码
surya_ocr DATA_PATH --images --langs hi,en

  • DATA_PATH可以是图像、pdf或图像/pdf文件夹
  • --langs指定用于OCR的语言。您可以用逗号分隔多种语言(我不建议使用超过4种)。使用此处的语言名称或双字母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 - (x1, y1, x2, y2) 格式的图像的bbox。 (x1, y1) 是左上角,(x2, y2) 是右下角。所有行bbox都将包含在此bbox中。


性能提示

使用GPU时,正确设置RECOGNITION_BATCH_SIZEenv var会有很大的不同。

每个批处理项目将使用50MB的VRAM,因此可以使用非常高的批处理大小。

默认的批处理大小是256,将使用大约12.8GB的VRAM。

根据您的CPU内核数量,它也可能会有所帮助------默认的CPU批处理大小是32


来自 python
python 复制代码
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_processor

image = 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)

编译

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

python 复制代码
import torch

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

3、文本行检测

此命令将写出一个包含检测到的bbox的json文件。

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

性能提示

使用GPU时,正确设置DETECTOR_BATCH_SIZEenv var会有很大的不同。每个批处理项目将使用440MB的VRAM,因此可以使用非常高的批处理大小。默认的批处理大小是36,将使用大约16GB的VRAM。根据您的CPU内核数量,它也可能会有所帮助------默认的CPU批处理大小是6


From python
shell 复制代码
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 is a list of dicts, one per image
predictions = batch_text_detection([image], model, processor)

4、布局分析

此命令将写出具有检测到的布局的json文件。

shell 复制代码
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-bbox的标签。CaptionFootnoteFormulaList-itemPage-footerPage-headerPictureFigureSection-headerTableTextTitle之一。
  • page-文件中的页码
  • image_bbox-(x1, y1,x2,y2)格式的图像的bbox。(x1,y1)是左上角,(x2,y2)是右下角。所有行bbox都将包含在此bbox中。

性能提示

使用GPU时,正确设置DETECTOR_BATCH_SIZEenv var会有很大的不同。每个批处理项目将使用400MB的VRAM,因此可以使用非常高的批处理大小。默认的批处理大小是36,将使用大约16GB的VRAM。根据您的CPU内核数量,它也可能会有所帮助------默认的CPU批处理大小是6


From python
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 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)

5、阅读顺序

此命令将写出具有检测到的读取顺序和布局的json文件。

shell 复制代码
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-(x1, y1,x2,y2)格式的图像的bbox。(x1,y1)是左上角,(x2,y2)是右下角。所有行bbox都将包含在此bbox中。

性能提示

使用GPU时,正确设置ORDER_BATCH_SIZEenv var会有很大的不同。每个批处理项目将使用360MB的VRAM,因此可以使用非常高的批处理大小。默认的批处理大小是32,将使用大约11GB的VRAM。根据您的CPU内核数量,它也可能会有所帮助------默认的CPU批处理大小是4


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

五、故障排除

如果OCR无法正常工作:

  • 试着提高图像的分辨率,这样文本就会更大。如果分辨率已经很高,试着把它降低到不超过2048px的宽度。
  • 预处理图像(二值化、去偏斜等)可以帮助处理非常旧/模糊的图像。
  • 如果你没有得到好的结果,你可以调整DETECTOR_BLANK_THRESHOLDDETECTOR_TEXT_THRESHOLDDETECTOR_BLANK_THRESHOLD控制行之间的空格------低于这个数字的任何预测都将被视为空格。DETECTOR_TEXT_THRESHOLD控制文本的连接方式------高于这个数字的任何数字都被认为是文本。DETECTOR_TEXT_THRESHOLD应该始终高于DETECTOR_BLANK_THRESHOLD,并且两者都应该在0-1范围内。从检测器的调试输出中查看热图可以告诉你如何调整这些(如果你看到看起来像盒子的微弱东西,降低阈值,如果你看到bbox连接在一起,提高阈值)。

六、基准测试


OCR

模型 每页时间 平均相似度(⬆)
surya .62 0.97
tesseract .45 0.88

全语言成绩

Tesseract是基于CPU的,surya是CPU或GPU。我试图匹配所使用的资源,所以我为surya使用了1xA6000(48GB VRAM),为Tesseract使用了28个CPU内核(Lambda Labs/DigitalOcean价格相同)。


Google Cloud Vision

我将OCR与Google Cloud vision进行了基准测试,因为它的语言覆盖范围与Surya相似。

全语言成绩


方法论

我基于一组真实世界和合成pdf测量了归一化句子相似度(0-1,越高越好)。我从常见的爬网中采样PDF,然后过滤掉OCR不好的PDF。我找不到某些语言的PDF,所以我也为这些语言生成了简单的合成PDF。

我使用来自tesseract和surya的PDF的参考线bbox来评估OCR质量。

对于谷歌云,我将谷歌云的输出与地面实况对齐。我不得不跳过RTL语言,因为它们对齐不好。


文本行检测

型号 时间(s) 每页时间(s) 精度 召回
surya 50.2099 0.196133 0.821061 0.956556
tesseract 74.4546 0.290838 0.631498 0.997694

Tesseract是基于CPU的,surya是CPU或GPU。我在具有A10 GPU和32核CPU的系统上运行了基准测试。这是资源使用情况:

  • tesseract-32个CPU内核,或8个工作人员,每个使用4个内核
  • Surya-36批量大小,用于16GB VRAM使用

方法论

Surya预测行级bbox,而tesseract和其他公司预测单词级或字符级。很难找到100%正确的带有行级注释的数据集。合并bbox可能会很嘈杂,所以我选择不使用IoU作为评估指标。

相反,我使用了覆盖率,它计算:

  • 精度-预测的bbox覆盖地面实况bbox的程度
  • 回想一下-地面实况bbox覆盖预测bbox的程度

首先计算每个bbox的覆盖率,然后为双重覆盖率添加一个小惩罚,因为我们希望检测具有不重叠的bbox。覆盖率为0.5或更高的任何内容都被视为匹配。

然后我们计算整个数据集的准召。


布局分析


布局类型 精度 召回
图像 0.97 0.96
表格 0.99 0.99
文本 0.9 0.97
标题 0.94 0.88

每张图像的时间-GPU(A10)上为0.4秒。


方法论

我在Publaynet上对布局分析进行了基准测试,这不在训练数据中。我必须将Publaynet标签与surya布局标签对齐。然后我能够找到每种布局类型的覆盖率:

  • 精度-预测的bbox覆盖地面实况bbox的程度
  • 回想一下-地面实况bbox覆盖预测bbox的程度

阅读顺序

在A6000图形处理器上,平均准确度为75%,每张图像为0.14秒。请参阅笔记方法论------这个基准并不是准确的完美衡量标准,作为理智检查更有用。


方法论

我从这里对布局数据集进行了布局分析基准测试,这不在训练数据中。不幸的是,这个数据集相当嘈杂,并非所有标签都是正确的。很难找到一个带有阅读顺序和布局信息注释的数据集。我想避免使用云服务来处理实况。

准确度的计算方法是:确定每对布局框的顺序是否正确,然后取正确的百分比。


七、运行自己的基准测试

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

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

文本行检测

这将评估tesseract和surya对来自doclaynet的随机采样图像集的文本行检测。

shell 复制代码
python benchmark/detection.py --max 256

  • --max控制为基准测试处理多少图像
  • --debug将渲染图像和检测到的bbox
  • --pdf_path--将允许您指定pdf来进行基准测试,而不是默认数据
  • --results_dir--将允许您指定要保存结果的目录,而不是默认目录

文本识别

这将在通用爬网的多语言pdf上评估surya和可选的tesseract(使用缺失语言的合成数据)。

shell 复制代码
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。

shell 复制代码
python benchmark/layout.py

  • --max控制为基准测试处理多少图像
  • --debug将呈现带有检测到的文本的图像
  • --results_dir--将允许您指定要保存结果的目录,而不是默认目录

阅读顺序

shell 复制代码
python benchmark/ordering.py

  • --max控制为基准测试处理多少图像
  • --debug将呈现带有检测到的文本的图像
  • --results_dir--将允许您指定要保存结果的目录,而不是默认目录

感谢

如果没有惊人的开源AI工作,这项工作是不可能的:

感谢所有使开源AI成为可能的人。


2024-08-02(五)

相关推荐
穆友航8 小时前
PDF内容提取,MinerU使用
数据分析·pdf
拾荒的小海螺1 天前
JAVA:探索 PDF 文字提取的技术指南
java·开发语言·pdf
村东头老张1 天前
Java 实现PDF添加水印
java·开发语言·pdf
好美啊啊啊啊!1 天前
Thymeleaf模板引擎生成的html字符串转换成pdf
pdf·html
zhentiya2 天前
曼昆《经济学原理》第八版课后答案及英文版PDF
大数据·pdf
三天不学习2 天前
如何解决pdf.js跨域从url动态加载pdf文档
javascript·pdf
吾店云建站2 天前
9个最佳WordPress PDF插件(查看器、嵌入和下载)
程序人生·pdf·创业创新·流量运营·程序员创富·教育电商
007php0072 天前
基于企业微信客户端设计一个文件下载与预览系统
开发语言·python·docker·golang·pdf·php·企业微信
慧都小妮子2 天前
Spire.PDF for .NET【页面设置】演示:更改 PDF 页面大小
前端·pdf·.net