Awesome
离线OCR组件 系列项目:
- PaddleOCR-json
- RapidOCR-json
PaddleOCR-json | RapidOCR-json | |
---|---|---|
CPU要求 | CPU必须具有AVX指令集。不支持以下CPU: | 无特殊要求 👍 |
凌动Atom,安腾Itanium,赛扬Celeron,奔腾Pentium | ||
推理加速库 | mkldnn 👍 | 无 |
识别速度 | 快(启用mkldnn加速)👍 | 中等 |
极慢(不启用mkldnn) | ||
初始化耗时 | 约2s,慢 | 0.1s内,快 👍 |
组件体积(压缩) | 52MB | 15MB 👍 |
组件体积(部署) | 250MB | 30MB 👍 |
CPU占用 | 高,榨干硬件性能 | 较低,对低配机器友好 |
内存占用峰值 | >2000MB(启用mkldnn) | ~500MB 👍 |
~600MB(不启用mkldnn) |
RapidOCR-json
这是一个基于 RapidOcrOnnx 的离线图片OCR文字识别程序。通过管道等方式输入本地图片路径,输出识别结果json字符串。适用于 Win7 x64
及以上的系统。
本项目旨在提供一个封装好的OCR引擎组件,使得没有C++编程基础的用户也可以用别的语言来简单地调用OCR,享受到更快的运行效率、更便捷的打包&部署手段。
准备工作
下载 RapidOCR-json v0.2.0 并解压,即可。
简单试用
方式一:
打开控制台,输入 path/RapidOCR-json.exe --image_path=path/test1.png
。
方式二:
直接双击打开 RapidOCR_json.exe
。等程序初始化完毕输出OCR init completed.
。
使用json字符串输入图片路径,建议使用ascii转义。如:
{"image_path":"D:/\u6d4b\u8bd5\u56fe\u7247.png"}
也支持传入图片base64编码的字符串。如:
{"image_base64":"……"}
还可以直接使用 Python API 。
指令说明
键名称 | 值说明 | 默认值 |
---|---|---|
ensureAscii | 启用(1)/禁用(0) ASCII转义输出 | 0 |
models | 模型目录地址,可绝对or相对路径 | "models" |
det | det库名称 | "ch_PP-OCRv3_det_infer.onnx" |
cls | cls库名称 | "ch_ppocr_mobile_v2.0_cls_infer.onnx" |
rec | rec库名称 | "ch_PP-OCRv3_rec_infer.onnx" |
keys | rec字典名称 | "ppocr_keys_v1.txt" |
doAngle | 启用(1)/禁用(0) 文字方向检测 | 1 |
mostAngle | 启用(1)/禁用(0) 角度投票 | 1 |
numThread | 线程数 | 4 |
padding | 预处理白边宽度,可优化窄边图片识别率 | 50 |
maxSideLen | 图片长边缩小值,可提高大图速度 | 1024 |
boxScoreThresh | 文字框置信度门限值 | 0.5 |
boxThresh | 0.3 | |
unClipRatio | 单个文字框大小倍率 | 1.6 |
image_path | 初始图片路径 | "" |
例1:(启动时传入图片路径,执行一次识别,然后关闭程序)
RapidOCR_json.exe --image_path="D:/images/test(1).png"
输出: 识别结果
例2:(启动时不传入图片路径,进入无限循环,不断接受json输入)
RapidOCR_json.exe --ensureAscii=1
输出: OCR init completed.
{"image_path": "D:/images/test(1).png"}
输出: 识别结果
例3:(手动指定参数)
RapidOCR_json.exe --doAngle=0 --mostAngle=0 --numThread=12 --padding=100 --image_path="D:/images/test(1).png"
返回值说明
通过API调用一次OCR,无论成功与否,都会返回一个字典。
字典中,根含两个元素:状态码code
和内容data
。
状态码code
为整数,每种状态码对应一种情况:
100
识别到文字
- data内容为数组。数组每一项为字典,含三个元素:
text
:文本内容,字符串。box
:文本包围盒,长度为4的数组,分别为左上角、右上角、右下角、左下角的[x,y]
。整数。score
:识别置信度,浮点数。
- 例:
{'code':100,'data':[{'box':[[13,5],[161,5],[161,27],[13,27]],'score':0.9996442794799805,'text':'飞舞的因果交流'}]}
101
未识别到文字
- data为字符串:
No text found in image. Path:"图片路径"
- 例:
{'code':101,'data':'No text found in image. Path: "D:\\空白.png"'}
- 这是正常现象,识别没有文字的空白图片时会出现这种结果。
200
图片路径不存在
- data为字符串:
Image path dose not exist. Path:"图片路径".
- 例:
{'code':200,'data':'Image path dose not exist. Path: "D:\\不存在.png"'}
- 注意,在系统未开启utf-8支持(
使用 Unicode UTF-8 提供全球语言支持"
)时,不能读入含emoji等特殊字符的路径(如😀.png
)。但一般的中文及其他 Unicode 字符路径是没问题的,不受系统区域及默认编码影响。
201
图片路径string无法转换到wstring
- data为字符串:
Image path failed to convert to utf-16 wstring. Path: "图片路径".
- 使用API时,理论上不会报这个错。
- 开发API时,若传入字符串的编码不合法,有可能报这个错。
202
图片路径存在,但无法打开文件
- data为字符串:
Image open failed. Path: "图片路径".
- 可能由系统权限等原因引起。
203
图片打开成功,但读取到的内容无法被opencv解码
- data为字符串:
Image decode failed. Path: "图片路径".
- 注意,引擎不以文件后缀来区分各种图片,而是对存在的路径,均读入字节尝试解码。若传入的文件路径不是图片,或图片已损坏,则会报这个错。
- 反之,将正常图片的后缀改为别的(如
.png
改成.jpg或.exe
),也可以被正常识别。
210
剪贴板打开失败
- data为字符串:
Clipboard open failed.
- 可能由别的程序正在占用剪贴板等原因引起。
211
剪贴板为空
- data为字符串:
Clipboard is empty.
212
剪贴板的格式不支持
- data为字符串:
Clipboard format is not valid.
- 引擎只能识别剪贴板中的位图或文件。若不是这两种格式(如复制了一段文本),则会报这个错。
213
剪贴板获取内容句柄失败
- data为字符串:
Getting clipboard data handle failed.
- 可能由别的程序正在占用剪贴板等原因引起。
214
剪贴板查询到的文件的数量不为1
- data为字符串:
Clipboard number of query files is not valid. Number: 文件数量
- 只允许一次复制一个文件。一次复制多个文件再调用OCR会得到此报错。
215
剪贴板检索图形对象信息失败
- data为字符串:
Clipboard get bitmap object failed.
- 剪贴板中是位图,但获取位图信息失败。可能由别的程序正在占用剪贴板等原因引起。
216
剪贴板获取位图数据失败
- data为字符串:
Getting clipboard bitmap bits failed.
- 剪贴板中是位图,获取位图信息成功,但读入缓冲区失败。可能由别的程序正在占用剪贴板等原因引起。
217
剪贴板中位图的通道数不支持
- data为字符串:
Clipboard number of image channels is not valid. Number: 通道数
- 引擎只允许读入通道为1(黑白)、3(RGB)、4(RGBA)的图片。位图通道数不是1、3或4,会报这个错。
299
未知异常
- data为字符串:
An unknown error has occurred.
- 正常情况下不应该出现此状态码。请提issue。
300
返回数据无法转换为json字符串
- data为字符串:
JSON dump failed. Coding error.
- 通过启动参数-image_dir传入非法编码的路径(含中文)时引起。(中文路径应该先启动程序再输入)
通过API调用
1. Python API
使用示例:
import os
import sys
from RapidOCR_api import OcrAPI
ocrPath = '引擎路径/RapidOCR_json.exe'
ocr = OcrAPI(ocrPath)
res = ocr.run('样例.png')
print('OCR识别结果:\n', res)
ocr.stop()
其他待填坑……
项目构建指南
👆当你需要修改项目源码时欢迎参考。
感谢
感谢 RapidAI/RapidOcrOnnx ,没有它就没有本项目。
本项目中使用了 nlohmann/json :
“JSON for Modern C++”
更新日志
v0.2.0 2023.9.25
- 路径识图的key由
imagePath
改为image_path
- 新功能:base64识图,key为
image_base64