文章目录
一、关于 Surya
Surya 实现 OCR、布局分析、阅读顺序、90多种语言的行检测。
- github : https://github.com/VikParuchuri/surya
- discord : https://discord.gg//KuZwXNGnfH
- 公司主页:https://www.datalab.to/
功能特性
- 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_SIZE
env 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_SIZE
env 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的标签。Caption
、Footnote
、Formula
、List-item
、Page-footer
、Page-header
、Picture
、Figure
、Section-header
、Table
、Text
、Title
之一。
page
-文件中的页码image_bbox
-(x1, y1,x2,y2)格式的图像的bbox。(x1,y1)是左上角,(x2,y2)是右下角。所有行bbox都将包含在此bbox中。
性能提示
使用GPU时,正确设置DETECTOR_BATCH_SIZE
env 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_SIZE
env 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_THRESHOLD
和DETECTOR_TEXT_THRESHOLD
。DETECTOR_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工作,这项工作是不可能的:
- 来自NVIDIASegform
- MIT 的 EfficientViT
- 来自 Ross Wightman 的 Timm
- 来自Naver 的Donut
- huggingface 的 transformers
- CRAFT,一个很棒的场景文本检测模型
感谢所有使开源AI成为可能的人。
2024-08-02(五)