当前位置:首页 > 技术 > 正文内容

Surya-OCR 0.3.0 离线部署与文本检测实战

访客 技术 2026年8月28日 1

一、项目概述

Surya-OCR 是一个面向文档理解的多语言OCR工具,支持超过90种语言的文本识别、行级文本定位与文档布局分析(如表格、标题、图像区域等)。其核心优势在于无需预设语言即可自动识别混合文本,并输出结构化结果。本文基于 v0.3.0 版本,详细介绍如何在无外网环境下完成模型部署与文本检测。

二、环境准备与依赖安装

1. 创建Python虚拟环境

推荐使用 Conda 管理环境,确保 Python 版本 ≥ 3.9:

conda create -n surya python=3.9
conda activate surya

2. 安装 PyTorch(离线模式)

由于部署环境可能受限于网络,推荐通过离线 Whl 包安装。需确保 torchtorchvisiontorchaudio 版本严格匹配。

从官方仓库下载对应版本(如 CUDA 11.7):

  • https://download.pytorch.org/whl/cu117

下载以下三个包(示例为 Python 3.9 + Windows):

  • torch-1.13.0+cu117-cp39-cp39-win_amd64.whl
  • torchvision-0.14.0+cu117-cp39-cp39-win_amd64.whl
  • torchaudio-0.13.0+cu117-cp39-cp39-win_amd64.whl

将文件复制至虚拟环境的 Scripts 目录,执行安装:

cd E:\anaconda3\envs\surya\Scripts
pip install torch-1.13.0+cu117-cp39-cp39-win_amd64.whl
pip install torchvision-0.14.0+cu117-cp39-cp39-win_amd64.whl
pip install torchaudio-0.13.0+cu117-cp39-cp39-win_amd64.whl

验证安装:

python -c "import torch; print(torch.__version__); print(torch.cuda.is_available())"

3. 安装 Surya-OCR v0.3.0

指定版本安装,避免兼容性问题:

pip install surya-ocr==0.3.0

若出现依赖缺失(如 transformers),降级至兼容版本:

pip install transformers==4.36.2

4. 获取源码与模型权重

克隆官方仓库以获取配置与示例代码:

git clone https://github.com/VikParuchuri/surya

模型权重需手动下载(因模型托管于 Hugging Face):

  • 文本检测模型: vikp/surya_det2
  • 布局分析模型: vikp/surya_layout

可使用百度网盘离线获取(提取码:jqbx):

https://pan.baidu.com/s/1NlOD8Naq8g9xt9oCcd_7ag

将下载的模型文件夹(含 config.jsonpytorch_model.bin 等)存放于本地路径,如:

D:\surya_models\surya_det2
D:\surya_models\surya_layout

三、文本检测实现

1. 文本识别(OCR)——单图处理

以下代码实现离线加载模型并执行OCR,仅支持单张图片输入:

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_PATH = r"D:\test\document.jpg"
LANGUAGES = ["zh"]  # 支持: zh, en, de, fr, ru 等
MODEL_DET_PATH = r"D:\surya_models\surya_det2"
MODEL_REC_PATH = r"D:\surya_models\surya_recognition"

# 加载模型(离线)
image = Image.open(IMAGE_PATH)
det_processor = segformer.load_processor(MODEL_DET_PATH)
det_model = segformer.load_model(MODEL_DET_PATH)
rec_model = load_model(MODEL_REC_PATH)
rec_processor = load_processor(MODEL_REC_PATH)

# 执行识别
predictions = run_ocr(
    images=[image],
    langs=LANGUAGES,
    det_model=det_model,
    det_processor=det_processor,
    rec_model=rec_model,
    rec_processor=rec_processor
)

# 输出结果结构(含文本、坐标、置信度)
for pred in predictions:
    for text_line in pred.text_lines:
        print(f"Text: {text_line.text}, Bbox: {text_line.bbox}")

2. 文本行检测(Text Line Detection)

仅检测文本行位置,不进行文字识别,适用于快速定位:

from PIL import Image
from surya.detection import batch_text_detection
from surya.model.detection.segformer import load_model, load_processor

IMAGE_PATH = r"D:\test\document.jpg"
MODEL_PATH = r"D:\surya_models\surya_det2"

image = Image.open(IMAGE_PATH)
model = load_model(MODEL_PATH)
processor = load_processor(MODEL_PATH)

predictions = batch_text_detection([image], model, processor)

# 遍历检测框
for pred in predictions:
    for bbox in pred.bboxes:
        print(f"Detected line at: {bbox}")

3. 布局分析(Layout Analysis)

识别文档结构,包括标题、表格、图像区域等:

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

IMAGE_PATH = r"D:\test\document.jpg"
MODEL_DET_PATH = r"D:\surya_models\surya_det2"
MODEL_LAYOUT_PATH = r"D:\surya_models\surya_layout"

image = Image.open(IMAGE_PATH)

# 先检测文本行
det_model = load_model(MODEL_DET_PATH)
det_processor = load_processor(MODEL_DET_PATH)
line_preds = batch_text_detection([image], det_model, det_processor)

# 再进行布局分析
layout_model = load_model(MODEL_LAYOUT_PATH)
layout_processor = load_processor(MODEL_LAYOUT_PATH)
layout_preds = batch_layout_detection([image], layout_model, layout_processor, line_preds)

# 输出区域类型与坐标
for pred in layout_preds:
    for region in pred.bboxes:
        print(f"Region: {region.label}, Bbox: {region.bbox}")

四、关键注意事项

  • 路径规范:所有模型路径必须为绝对路径,避免相对路径导致加载失败。
  • 模型版本匹配:确保 surya-ocr==0.3.0 与模型权重版本一致,否则会报 RuntimeError: "linspace_cpu" not implemented for 'Half',需修改源码中 dtype 强制转为 float32
  • 单图输入:当前接口仅支持单张图片,批量处理需封装循环逻辑。
  • GPU加速:若需指定GPU,可在加载模型前添加:torch.cuda.set_device(0)

模型输出为自定义类对象,包含 text_linesbboxesconfidences 等字段,建议封装为 JSON 或 CSV 便于下游处理。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。