离线环境python调用文字识别,先安装的是tesseract,安装和使用都很方便,但缺点是中文识别率略低,对图片质量要求较高,离线办公环境的截图信息质量一般,因此识别率偏低,而且由于不同图片的背景相差较大,需要设定不同的图片预处理参数,非常麻烦。 昨天在网上发现一个OCR文字识别软件,Umi-OCR,环境部署都是打包做好的,可以说是开箱即用。这里记录一下安装使用过程。
1. 系统需求: #
Windows7 x64 及以上
2. 版本选择 #
目前直接下载的有两个版本:Paddle版和RapidOCR版,安装后可以发现这个版本的最终形式是Paddle或Rapid引擎是在插件文件夹内:UmiOCR-data/plugins。因为Umi-OCR (v2 以上)支持以插件的形式导入 OCR 引擎等组件,不过不同的插件对硬件有不同的需求,识别速度、识别率以及系统占用情况都不一样,可以根据硬件情况和需求下载不同插件,下载后解压即可,具体内容参见:GitHub - hiroi-sora/Umi-OCR_plugins: Umi-OCR 插件库。截止至:2024-03-28版本号为:Umi-OCR v2.1.0
3. 下载地址 #
- 蓝奏云 https://hiroi-sora.lanzoul.com/s/umi-ocr
- GitHub https://github.com/hiroi-sora/Umi-OCR/releases/latest
- Source Forge https://sourceforge.net/projects/umi-ocr
4. 安装使用 #
软件发布包下载为 .7z 压缩包或 .7z.exe 自解压包。自解压包可在没有安装压缩软件的电脑上,解压文件。
本软件无需安装。解压后,点击 Umi-OCR.exe 即可启动程序,或者点击主文件包中的bat运行也可。
5. 界面介绍 #
这里就略过,作者作了详细的介绍。具体参看:Umi-OCR: Umi-OCR 是一款免费、开源、可批量的离线 OCR 软件,基于 PaddleOCR,适用于 Windows10/11 平台 - Gitee.com
6. 调用 #
我这里使用python调用,取代tesseractOCR,不想折腾开发,因此直接使用了HTTP接口方式调用。
6.1 HTTP接口的前提条件 #
在全局设置里,必须允许HTTP服务才能使用HTTP接口(默认开启)。如果需要允许被局域网访问,请将主机切换到任何可用地址。 在全局设置页中勾选高级才会显示。 缺点:由于目前的一些缺陷,如果Umi-OCR关闭时仍有用户未断开HTTP接口连接,可能导致Umi-OCR关闭不完全(UI线程结束了,但负责网络的子线程未被关闭)。这时只能等待所有用户关闭连接,或者进任务管理器强制结束进程。当前此缺陷版本:Umi-OCR v2.1.0
6.2 调用代码 #
首先需要将图片转换为base64,再用HTTP接口调用文字识别。
import requests
import json
import base64
# 图片转base64
with open(r"d:\文档\Desktop\auto\my_screenshot1.png", "rb") as f:
base64_data = base64.b64encode(f.read()).decode()
# print(base64_data)
url = "http://127.0.0.1:1224/api/ocr"
data = {
"base64": base64_data,
# 可选参数
"options": {
# 通用参数
"tbpu.parser": "single_code",
"data.format": "text",
# 引擎参数
"ocr.cls": False,
"ocr.language": "models/config_chinese.txt",
"ocr.maxSideLen": 1024
} # type: ignore
# Paddle引擎模式
# "options": {
# "ocr.language": "models/config_chinese.txt",
# "ocr.cls": False,
# "ocr.limit_side_len": 960,
# "tbpu.parser": "multi_para",
# "data.format": "text",
# }
# Rapid引擎模式
# "options": {
# "ocr.language": "简体中文",
# "ocr.angle": False,
# "ocr.maxSideLen": 1024,
# "tbpu.parser": "multi_para",
# "data.format": "text",
# }
}
headers = {"Content-Type": "application/json"}
data_str = json.dumps(data)
response = requests.post(url, data=data_str, headers=headers)
if response.status_code == 200:
res_dict = json.loads(response.text)
#若"data.format": "txet",返回识别结果,表示去掉位置信息,仅输出识别结果
print("返回值字典\n", res_dict["data"])
#若"data.format": "dict",返回全部识别结果,为字典,包含位置信息,匹配度等信息,循环输出识别结果
# for i in res_dict["data"]:
# print(i["text"])
#以下为转化为excel表格并写入excel
import pandas as pd
import numpy as np
data=res_dict
data=data['data'].split('\n')
data=pd.Series(data)
#data每行按空格分割,并删除空行
data=data[data!='']
data=data.str.split(pat=None, n=-1, expand=True)
print(data)
#data转为dataframe
df=pd.DataFrame(data)
df.to_excel('data.xlsx',index=False,header=False)
6.3 代码的解释: #
options 中有两部分参数:通用参数 和 引擎参数 。 通用参数 :是在任何情况下都适用的,选项:
- data.format :数据返回格式。返回值字典中,[“data”] 按什么格式表示OCR结果数据。可选值(字符串):
- dict:含有位置等信息的原始字典(默认)
- text:纯文本
- tbpu.parser :排版解析方案。可选值(字符串):
- multi_para:多栏-按自然段换行(默认)
- multi_line:多栏-总是换行
- multi_none:多栏-无换行
- single_para:单栏-按自然段换行
- single_line:单栏-总是换行
- single_none:单栏-无换行
- single_code:单栏-保留缩进,适用于解析代码截图
- none:不做处理 引擎参数 :对于加载不同引擎插件时,可能有所不同。完整参数说明请通过 get_options 接口查询。以下是一些示例(自用的是paddle引擎因此只介绍此):
PaddleOCR 引擎参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
ocr.language | string | models/config_chinese.txt | 识别语言。可选值请通过 get_options 接口查询 |
ocr.cls | boolean | false | 是否进行图像旋转校正。true/false |
ocr.limit_side_len | int | 960 | 图像压缩边长。允许 960/2880/4320/999999 |
Base64 响应格式 | |||
json |
字段名 | 类型 | 描述 |
---|---|---|
code | int | 任务状态。100为成功,101为无文本,其余为失败 |
data | list/string | 识别结果,格式见下 |
time | double | 识别耗时(秒) |
timestamp | double | 任务开始时间戳(秒) |
data 格式 | ||
图片中无文本(code==101),或识别失败(code!=100 and code!=101)时: |
- [“data”]为string,内容为错误原因。例: {“code”: 902, “data”: “向识别器进程传入指令失败,疑似子进程已崩溃”} 识别成功(code==100)时,如果options中data.format为dict(默认值):
- [“data”]为list,每一项元素为dict,包含以下子元素:
参数名 | 类型 | 描述 |
---|---|---|
text | string | 文本 |
score | double | 置信度 (0~1) |
box | list | 文本框顺时针四个角的xy坐标:[左上,右上,右下,左下] |
end | string | 表示本行文字结尾的结束符,根据排版解析得出。可能为空、空格、换行。 |
识别成功(code==100)时,如果options中data.format为text: |
- [“data”]为string,即所有OCR结果的拼接。
7. 优缺点 #
优点是安装使用方便,识别效率高。 缺点就是系统占用太大,但可以通过全局设置里对软件的占用做一定限制:线程数限和内存占用设置上限,避免系统开销过大。