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

ops/2024/9/22 22:51:06/

文章目录

    • 一、关于 Surya
      • 功能特性
      • 例子
      • 训练
      • 托管API
      • 商业用途
    • 二、安装
      • 手动安装
    • 三、用法
      • 1、交互应用
      • 2、OCR(文本识别)
        • 来自 python
        • 编译
      • 3、文本行检测
        • From python
      • 4、布局分析
        • From python
      • 5、阅读顺序
        • From python
    • 四、限制
    • 五、故障排除
    • 六、基准测试
      • OCR
      • Google Cloud Vision
      • 文本行检测
      • 布局分析
      • 阅读顺序
    • 七、运行自己的基准测试
    • 感谢


Surya_2">一、关于 Surya

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

  • github : https://github.com/VikParuchuri/surya
  • discord : https://discord.gg//KuZwXNGnfH
  • 公司主页:https://www.datalab.to/

功能特性

  • 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_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)

编译

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

import torchrec_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_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)

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

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_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的。它可能不适用于照片或其他图像。
  • 它适用于印刷文本,而不是手写(尽管它可能适用于某些手写)。
  • 文本检测模型已经训练自己忽略广告。
  • 您可以在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工作,这项工作是不可能的:

  • 来自NVIDIASegform
  • MIT 的 EfficientViT
  • 来自 Ross Wightman 的 Timm
  • 来自Naver 的Donut
  • huggingface 的 transformers
  • CRAFT,一个很棒的场景文本检测模型

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


2024-08-02(五)


http://www.ppmy.cn/ops/89216.html

相关文章

【Unity引擎技术整合】 Unity学习路线 | 知识汇总 | 持续更新 | 保持乐趣 | 共同成长

前言 本文对Unity引擎的知识进行了一个整理总结,基本包含了Unity中大部分的知识介绍。网上也有很多Unity相关的学习资料,但大多数都不成体系,学起来的时候难免会东奔西走的摸不着头脑。本文整理的多数文章都是有对应的系列性文章专栏&#x…

第三关:Git 基础知识

一、Git是什么 Git是一种开源的分布式版本控制系统,广泛应用于软件开发领域,尤其是在协同工作环境中。它为程序员提供了一套必备的工具,使得团队成员能够有效地管理和跟踪代码的历史变更。下面是 Git 的主要功能和作用的规范描述&#xff1a…

java基础5-面向对象的三大特征

1.封装 1.1广义封装和狭义封装(java) 封装,单词Encapsulation。 广义的封装:将一块经常要使用的代码片段,定义到方法中,是封装。将多个方法和多个状态数据定义到类体中,也是一种封装。 1.2 …

机器学习练手(二):基于KMeans的股票分类

总结:本文为和鲸python 可视化探索训练营资料整理而来,加入了自己的理解(by GPT4o) 原活动链接 在前一关我们学习了逻辑回归,学会如何训练模型、数据基础性分析、如何处理空值等操作,下面我们开始新的一关…

CSS3中动画的制作案例

直接上代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>-webkit-keyframes expand {0% {border-width: 4px;}50% {border-width: 12px;}100% {border-width: 4px;height: 130px;width: 15…

计算机网络-PIM-DM密集模式工作原理

一、PIM-DM基础概念 PIM-DM主要用在组成员较少且相对密集的网络中&#xff0c;通过"扩散-剪枝"的方式形成组播转发树&#xff08;SPT&#xff09;。 PIM-DM在形成SPT的过程中&#xff0c;除了扩散&#xff08;Flooding&#xff09;&#xff0c;剪枝&#xff08;Prune…

mysql高级语句的查询语句

一、排序语法&#xff0c;关键字排序 升序和降序 默认的排序方式就是升序 升序&#xff1a;ASC 降序&#xff1a;DESC 配合语法&#xff1a;order by 语法 1、升序 select * from info order by name; 根据名字升序排序&#xff0c;不需要加ASC select * from info order…

15.2 zookeeper java client之Zookeeper官方使用(❤❤❤❤)

15.2 zookeeper java client 1. Zookeeper官方1.1 依赖1.2 Zookeeper客户端连接测试1.3 Zookeeper节点操作1.3.1 zooKeeper.create创建节点1.3.2 zooKeeper.exists获取节点详情1.3.3 zooKeeper.getData获取节点数据1.3.4 zooKeeper.getChildren获取节点下所有子节点名称1.3.5 …