Skip to content

90 多种语言的 OCR、布局分析、阅读顺序、线条检测

License

Notifications You must be signed in to change notification settings

yuanzhongqiao/surya

 
 

Repository files navigation

苏里亚

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命令行参数以使用数学文本检测模型而不是默认模型。这将更好地检测数学,但其他方面会更差。

OCR(文本识别)

此命令将写出包含检测到的文本和 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 时会产生很大的不同。每个批次项目都将使用50MBVRAM,因此批次大小可能非常大。默认批次大小为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)

文本行检测

此命令将写出包含检测到的 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 时会产生很大的不同。每个批次项目都将使用280MBVRAM,因此批次大小可能非常大。默认批次大小为32,将使用大约 9GB 的 VRAM。根据您的 CPU 核心数量,它也可能有帮助 - 默认 CPU 批次大小为2

来自 python

from PIL import Image
from surya.detection import batch_text_detection
from surya.model.detection.segformer 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)

布局分析

此命令将写出包含检测到的布局的 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:,,,,,,,,,,,,。​​FootnoteFormulaList-itemPage-footerPage-headerPictureFigureSection-headerTableTextTitle
  • page- 文件中的页码
  • image_bbox- 图像的 bbox 格式为 (x1, y1, x2, y2)。(x1, y1) 是左上角,(x2, y2) 是右下角。所有线 bbox 都将包含在此 bbox 内。

性能提示

正确设置DETECTOR_BATCH_SIZE环境变量在使用 GPU 时会产生很大的不同。每个批次项目都将使用280MBVRAM,因此批次大小可能非常大。默认批次大小为32,将使用大约 9GB 的 VRAM。根据您的 CPU 核心数量,它也可能有帮助 - 默认 CPU 批次大小为2

来自 python

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

阅读顺序

此命令将写出一个具有检测到的阅读顺序和布局的 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 时会产生很大的不同。每个批次项目都将使用360MBVRAM,因此批次大小可能非常大。默认批次大小为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 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_THRESHOLDDETECTOR_BLANK_THRESHOLDDETECTOR_TEXT_THRESHOLDDETECTOR_TEXT_THRESHOLDDETECTOR_BLANK_THRESHOLD

手动安装

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

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

基准

光学字符识别 (OCR)

基准图表 tesseract

模型 每页时间(秒) 平均相似度 (⬆)
苏里亚 .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 成为可能的人。

About

90 多种语言的 OCR、布局分析、阅读顺序、线条检测

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 99.9%
  • Shell 0.1%