从零开始使用Surya-OCR版本0.3.0——文本目标检测模型的安装与部署
本文完整详细记录了从安装到调试到部署一个开源Github文本检测项目的全过程
目录
一、Surya-OCR项目简介
(追加)本文使用的是的surya版本是0.3.0。请确保安装版本一致,更新版本使用将发生改动。最新版本使用见后续文章。
(最新)最新版本0.6使用方法和更新安装环境教程,详见博文链接如下:
https://blog.csdn.net/qq_58718853/article/details/142817344
Surya项目源码Github地址:https://github.com/VikParuchuri/surya
根据官方文档介绍:
Surya 是一个文档 OCR 工具包,可以支持:
- 90+ 种语言的准确 OCR
- 任何语言的行级文本检测
- 任何语言的布局分析(表格、图像、页眉等检测)
下面是官方给出的一些检测示例图。
Surya-OCR 支持三种形式的文本识别,分别是文本提取、文本行检测和文本区域检测,并支持多种语言的识别任务,下面分布展示其官方效果图示。
文本提取效果:
文本行检测效果:
文本区域检测效果:
二、Surya-OCR模型安装
1.conda虚拟环境创建
进入conda的Anaconda Prompt环境,输入以下指令生成虚拟环境。Surya要求Python版本在3.9以上。
conda create -n surya python=3.9
检验安装成功与否,并激活虚拟环境。
conda activate surya
2.Pytorch环境安装
①官网直接命令安装
在虚拟环境surya激活的条件下,条件好的(网络连接稳定),直接使用官网pip命令安装。
根据电脑安装的cuda版本安装对应的pytorch版本。可以在官网中选择以往的版本安装,本机服务器使用的是cu101版本。将下述指令复制到,已经激活虚拟环境的Anaconda Prompt中,即可安装pytorch环境。(下述忽略图中选择,按代码版本为准,选择比示例图更高版本的torch安装!!)
pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 torchaudio==0.12.1 --extra-index-url https://download.pytorch.org/whl/cu113
安装完成后,pip list看一下当前环境下安装的所有包,验证是否安装成功。
②使用whl包离线安装
对于网络环境不稳定,使用命令指令安装出现下面红字报错的时候,推荐使用whl包先下载到本地,再在本地离线安装 torch 环境。
whl包下载地址:https://download.pytorch.org/whl/cu117
首先还是要去官网查看需要下载的torch相关包版本号,torch、torchvision、torchaudio版本需一一对应,不然会报错。然后进入whl包下载地址,下载相应版本的 torch、torchvision 和 torchaudio。
选择与本机对应的版本下载,cu113对应cuda版本号(也有cpu版本),cp是环境中python版本,选择win的版本。(尽量选择 torch 1.10.0以上的版本)
下载完成后,将下载的包移动到指定的虚拟环境下的文件夹中——在你安装的conda地址下的env/surya/Scripts 中。
注意此处torch版本和之前不同,是因为服务器(cuda10.1)上已安装好环境,现在是使用个人电脑(cuda11.7)作为实验。
在此处备注一下,不要选用过低版本的 torch 安装!在服务器安装的torch 1.8.1版本,在离线部署时,因为torch版本低,有些库函数不存在报错!后续重新将torch重装更新到了1.12.1。下述在本机安装的1.13.0版本部署过程中就不存在报错。
现在再打开Anaconda Prompt,激活虚拟环境,并且cd到whl包的地址目录下。本机conda安装在E盘。
# 激活虚拟环境
conda activate surya
# cd到包下载地址
E:
cd E:\conda3\envs\surya\Scripts
# pip安装whl包
pip install torch-1.13.0+cu117-cp39-cp39-win_amd64.whl
同样的方式,安装torchvision和torchaudio另外两个torch包,torchvision会有一些其他依赖包会在安装whl的时候自行安装。安装完成后,使用pip list检查一下。
3.Surya-ocr安装
根据官方指令直接安装。成功后可以看所安装的包,对于一些因为网络问题无法安装的库,可以对应去找whl或者tar文件下载离线安装。
# 确保安装老版本0.3.0
pip install surya-ocr==0.3.0
4.surya项目代码克隆
Surya下载Github地址:https://github.com/VikParuchuri/surya
进入上述 github 源代码地址,下载surya包到本地并解压,方便本地部署surya项目。
5.报错处理
如果后续运行出现报错RuntimeError: “linspace_cpu“ not implemented for ‘Half’,说明安装包的源码需要修改,具体参加下面的博文,已解决该问题https://blog.csdn.net/qq_58718853/article/details/137770263
使用时如果报以下错误,是transformers版本太高了,降低版本可以解决。
# 降低transformers的版本
pip install transformers==4.36.2
# 降低surya-ocr版本
pip install surya-ocr==0.3.0
三、Surya-OCR模型使用——文本检测
Surya官方文档中提供了两种使用模型的方法,一种是命令行指令,另一种是提供了Python模型接口。第一种需要稳定的访问外网的权限,第二种可以借助接口实现模型的离线部署。
1.命令行指令版——(需要“科学上网”)
官方文档中,对于模型源代码项目的命令行指令操作给出了具体的解释,这种使用模型的方式更加便利,下面将其提供的指令功能翻译并记录在下面。下述指令代码直接在 Pycharm终端Terminal 中运行。
Surya提供了三种文本检测的模式,分别是:文本提取(Text Recognition)、文本行检测(Text Line Detection)、文本区域检测(Layout Analysis)。
①文本提取指令(Text Recognition)
文本提取指令如下,其支持图片、pdf 和图片文件的输入,输出是一个带有检测到的文本和框的 json 文件,并可选地保存重建页面的图像。
指令中有一些参数是可以调整和选择的:
--langs:用于指定检测文本的语言,多种语言用逗号间隔,支持主要几种语言的缩写如下。
# 文本语言
{'zh': 'Chinese', 'en': 'English', 'de': 'German', 'fr': 'French', 'ru': 'Russian'}
## 具体参见surya源代码/surya/languages.py
--image:可选参数,选上将保存重建页面的图片,即页面和检测到的文本行的图像。
--result_dir:指定将结果保存到的目录,而不是默认目录
一个完整的示例指令代码如下,其中 DATA_PATH 代表需要检测的图片位置,SAVE_PATH代表结果保存位置。
# 文本提取指令
surya_ocr "DATA_PATH" --langs zh --image --result_dir "SAVE_PATH"
②文本行检测(Text Line Detection)
文本行检测和文本提取类似,此处不再赘述。文本行只是多了一个对数学公式的检测参数。
--math:可选参数,选上使用专门的数学检测模型。这在数学方面好,但在其他方面会差。
一个完整的示例代码如下:
# 文本行检测命令
surya_detect "DATA_PATH" --image --result_dir "SAVE_PATH" --math
③文本区域检测 (Layout Analysis)
无特殊参数增加,使用同上述内容。
一个完整的示例代码如下:
# 文本区域检测指令
surya_layout "DATA_PATH" --image --result_dir "SAVE_PATH"
2.Python接口版——(离线下载部署)
由于对服务器安全性考虑,无法实时“科学上网”,使用指令部署常常会遇到互联网拒绝访问的报错。此时需要下载好 surya 模型训练好的参数,离线部署检测文本。下面给出操作流程。
①模型参数下载
- 如果在别的设备中可以使用科学连接上网的话,访问以下地址,下载对应的模型,需要用的模型主要是两个——“vikp/surya_det2” & "vikp/surya_layout"
所有模型参数下载地址:https://huggingface.co/vikp
- 本人将部分模型的参数数据放在下方百度云地址,需要自取。
百度网盘链接:https://pan.baidu.com/s/1NlOD8Naq8g9xt9oCcd_7ag?pwd=jqbx
提取码:jqbx
②报错调试
具体参考这篇博文:https://blog.csdn.net/qq_58718853/article/details/137770263
③Python接口使用
Surya官方文档中给出了对应使用的Python使用接口,但是需要对代码一些细节进行修改,如默认代码还是在线加载模型,需将加载地址修改为本地;指令一些功能的实现也需在源码内进行调整。下面分别给出三个模型的接口代码修改版。
注意:以下代码中图片地址 IMAGE_PATH 只能是单个图片文件,即以 .jpg 结尾的详细图片地址,不支持图片文件夹的输入。
文本提取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
langs = ["language"] ## 选择你的文本语言
IMAGE_PATH = 'image_path' ## 需检测图片地址
MODEL_PATH = 'model_path' ## 模型参数保存地址
#####################(分界线)上述是需根据情况修改的参数,以下函数不需修改
# 加载离线模型
image = Image.open(IMAGE_PATH)
det_processor, det_model = segformer.load_processor(MODEL_PATH), segformer.load_model(MODEL_PATH)
rec_model, rec_processor = load_model(MODEL_PATH), load_processor(MODEL_PATH)
# 检测结果
predictions = run_ocr([image], [langs], det_model, det_processor, rec_model, rec_processor)
文本行检测 Text Line
# 文本行检测
from PIL import Image
from surya.detection import batch_text_detection
from surya.model.detection.segformer import load_model, load_processor
IMAGE_PATH = 'image_path' ## 需检测图片地址
MODEL_PATH = 'model_path' ## 模型参数保存地址
#####################(分界线)上述是需根据情况修改的参数,以下函数不需修改
# 加载离线模型
image = Image.open(IMAGE_PATH)
model, processor = load_model(MODEL_PATH), load_processor(MODEL_PATH)
# 检测结果
predictions = batch_text_detection([image], model, processor)
文本区域检测 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 = 'image_path' ## 需检测图片地址
MODEL_PATH = 'model_path' ## 文本行检测模型参数保存地址
MODEL_LAYOUT_PATH = "model_layout_path" ## 区域检测模型
#####################(分界线)上述是需根据情况修改的参数,以下函数不需修改
image = Image.open(IMAGE_PATH)
model = load_model(MODEL_LAYOUT_PATH)
processor = load_processor(MODEL_LAYOUT_PATH)
det_model = load_model(MODEL_PATH)
det_processor = load_processor(MODEL_PATH)
# 检测结果
## 文本行检测结果
line_predictions = batch_text_detection([image], det_model, det_processor)
## 文本区域检测
layout_predictions = batch_layout_detection([image], model, processor, line_predictions)
上述代码中模型预测结果在 predictions 中,Surya 的输出是一个 Class 类形式,具体详细的解析以及如何转为想要的数据格式,见写在结尾的第一篇文章链接。
四、写在结尾:Surya深度扩展应用
上述模型的Python接口使用仅仅只是验证我们模型是否安装成功,模型参数是否加载成功,能否正确运行模型检测。Python接口处函数只实现了单个图片的检测结果。
①如何调用离线模型本地批量检测图片;模型部署中更进一步的源码拆解和参数修改(如选择第几号GPU);模型预测结果的解析与转化为我们想要的格式......
以上内容详见文章地址:https://blog.csdn.net/qq_58718853/article/details/137815688
②预测效果不佳?有两种解决思路:一是微调训练官方模型参数;二是对官方参数预测的结果做精细化调整。先介绍如何精细化调整预测的框信息,使其更加精确匹配到我们检测一些特定文本。此思路分为多个步骤,下面按顺序分别介绍其文章。
精调1——空白框的处理:https://blog.csdn.net/qq_58718853/article/details/139768563
③检测不佳,考虑换模型微调实现任务要求?对于目标检测任务还可以尝试大名鼎鼎的YOLO进行模型训练微调部署,详细参见下面博文地址。
从零开始使用YOLO系列开篇文章:从零开始使用YOLOv8和v11(最新版本使用环境已更新)——环境配置与极简指令(CLI)操作:1篇文章解决—直接使用:模型部署 and 自建数据集:训练微调-CSDN博客
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)