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

avatar
作者
筋斗云
阅读量:0

文章目录


一、关于 Surya

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


功能特性

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

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

检测OCR
在这里插入图片描述在这里插入图片描述
布局阅读顺序
3在这里插入图片描述

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


例子

NameDetectionOCRLayoutOrder
JapaneseImageImageImageImage
ChineseImageImageImageImage
HindiImageImageImageImage
ArabicImageImageImageImage
Chinese + HindiImageImageImageImage
PresentationImageImageImageImage
Scientific PaperImageImageImageImage
Scanned DocumentImageImageImageImage
New York TimesImageImageImageImage
Scanned FormImageImageImageImage
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版本。有关更多详细信息,请参阅此处

安装:

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。运行它:

pip install streamlit surya_gui 

2、OCR(文本识别)

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

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
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,然后:

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

3、文本行检测

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

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
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文件。

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
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文件。

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
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.620.97
tesseract.450.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)精度召回
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 VRAM使用

方法论

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

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

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

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

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


布局分析

在这里插入图片描述


布局类型精度召回
图像0.970.96
表格0.990.99
文本0.90.97
标题0.940.88

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


方法论

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

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

阅读顺序

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


方法论

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

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


七、运行自己的基准测试

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

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

文本行检测

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

python benchmark/detection.py --max 256 

  • --max控制为基准测试处理多少图像
  • --debug将渲染图像和检测到的bbox
  • --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–将允许您指定要保存结果的目录,而不是默认目录

感谢

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

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


2024-08-02(五)

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!