hiroi-sora / PaddleOCR-json

OCR离线图片文字识别命令行windows程序,以JSON字符串形式输出结果,方便别的程序调用。提供各种语言API。由 PaddleOCR C++ 编译。
Apache License 2.0
915 stars 124 forks source link
json-api ocr paddleocr paddlepaddle

离线OCR组件 系列项目:

PaddleOCR-json RapidOCR-json
CPU要求 CPU必须具有AVX指令集。不支持以下CPU: 无特殊要求 👍
凌动Atom,安腾Itanium,赛扬Celeron,奔腾Pentium
推理加速库 mkldnn 👍
识别速度 快(启用mkldnn加速)👍 中等
初始化耗时 约0.6s 0.1s内,快 👍
组件体积(压缩) 100MB 70MB 👍
组件体积(部署) 369MB 80MB 👍
CPU占用 较高 较低,对低配机器友好
建议预留内存 2000MB 800MB 👍

PaddleOCR-json

支持: Win7 x64Linux x64Docker

这是一个基于 PaddleOCR v2.6v2.8 cpp_infer 的离线图片OCR文字识别程序,可快速让你的程序拥有OCR能力。它可以作为一个子进程被上层程序调用,也可以作为一个单独的进程通过TCP调用。本项目提供了Python等语言的API,你可以无视技术细节,通过两行代码使用它。

本项目旨在提供一个封装好的OCR引擎组件,使得没有C++编程基础的开发者也可以用别的语言来简单地调用OCR,享受到更快的运行效率、更便捷的打包&部署手段。

应用:Umi-OCR 批量图片转文字工具

兼容性

准备工作

下载可执行文件包:

简单试用

PaddleOCR-json.exe -image_path="test.jpg"

通过API调用

调用流程大体分为如下几步。不同API的具体接口可能有细微差别。

API列表

资源目录下有更详细的使用说明及demo。

1. Python API

资源目录

使用示例 ```python from PPOCR_api import GetOcrApi # 初始化识别器对象,传入 PaddleOCR_json.exe 的路径 ocr = GetOcrApi("……\PaddleOCR-json.exe") # 识别图片,传入图片路径 getObj = ocr.run(r'………\测试.png') print(f'图片识别完毕,状态码:{getObj["code"]} 结果:\n{getObj["data"]}\n') ``` Python API 有丰富的附加模块:便于开发者调试观察的可视化模块;和[Umi-OCR](https://github.com/hiroi-sora/Umi-OCR)带来的文本块后处理(段落合并)技术。详细使用方法见 [资源目录](api/python)

2. Node.js API

资源目录

使用示例 ``` npm install paddleocrjson ``` ```js const OCR = require('paddleocrjson'); // const OCR = require('paddleocrjson/es5'); // ES5 const ocr = new OCR('PaddleOCR-json.exe', [/* '-port=9985', '-addr=loopback' */], { cwd: './PaddleOCR-json', }, false); ocr.flush({ image_path: 'path/to/test/img' }) .then((data) => console.log(data)); .then(() => ocr.terminate()); ```

3. PowerShell API

资源目录

4. Java API

资源目录

5. .NET API

资源目录

6. Rust API

资源目录

7. Go API

资源目录

更多语言API

欢迎补充!请参考 详细使用指南

常用配置参数说明

键名称 默认值 值说明
ensure_ascii true 启用ascii编码转换,以ascii编码(纯英文数字)输出unicode字符,如 你好\u4f60\u597d
一般情况下,json解码器会自动将ascii码翻译回原字符。此选项建议开启,以提高编码兼容性。
config_path "" 可以指定不同语言的配置文件路径,识别多国语言。详情见下节
models_path "" 可以指定语言库 models 文件夹的路径。详情见下节
det true 启用det目标识别。如果你的图片中只含一行文本,且没有空白区域,那么可以关闭det以加快速度。
cls false 启用cls方向分类,识别方向不是正朝上的图片。
use_angle_cls false 启用方向分类,必须与cls同时设置。
enable_mkldnn true 启用CPU推理加速,关掉可以减少内存占用,但会降低速度。
limit_side_len 960 对图像边长进行限制,降低分辨率,加快速度。如果对大图/长图的识别率低,可增大此选项的值。
建议为 32 & 48 的公倍数,如 960, 2880, 4320

更多参数详见 args.cpp 。(不支持其中GPU相关、表格识别相关的参数。-)

语言库与切换识别语言:

Release压缩包中,默认附带了 简中,繁中,英,日,韩 的语言库与配置文件,在 models 目录下。

models 目录中,每一个 config_xxx.txt 是一组语言配置文件(如英文是congfig_en.txt)。只需将这个文件的路径传入 config_path 参数,即可切换为对应的语言。以 Python API 为例:

enginePath = "D:/Test/PaddleOCR_json.exe"  # 引擎路径
argument = {"config_path": "models/config_en.txt"}  # 指定使用英文库
ocr = GetOcrApi(enginePath, argument)

如果 config_path 留空,则 PaddleOCR-json 默认加载并使用简体中文识别库。

但是,当使用默认路径或单独设置 config_path 时,PaddleOCR-json可执行文件必须与语言库在同一目录下。比如:

.
├─ PaddleOCR-json.exe
└─ models
    ├─ ...

如果语言库在另外一个文件夹下,PaddleOCR-json就无法找到语言库。

在这种情况下,你可以使用 models_path 参数来设置语言库的位置。PaddleOCR-json会使用用户设置的语言库位置为基准来加载其他文件。

这样一来,即使 PaddleOCR-json 与语言库不在同一目录下也能正常使用。以 Python API 为例:

enginePath = "D:/Test/PaddleOCR_json.exe"  # 引擎路径
modelsPath = "D:/Hello/models"             # 语言库路径路径
# 这里的参数顺序不影响结果
argument = {
  # 指定语言库位置
  "models_path": "D:/Hello/models",
  # 指定使用英文库
  "config_path": "D:/Hello/models/config_en.txt",
}
ocr = GetOcrApi(enginePath, argument)

本项目支持 PP-OCR 系列官方 V2~V4 模型,或自己训练的符合PP规范的模型。更多 PP-OCR 系列官方模型下载: https://github.com/PaddlePaddle/PaddleOCR/blob/main/doc/doc_ch/models_list.md

删除语言库:

若你希望删除吃灰的语言库文件以便减少软件体积,可以删除 models 目录中含有对应语言前缀和 rec_infer 后缀的文件夹。比如你希望删除日语japan相关的库,只需删除该文件夹:
japan_PP-OCRv3_rec_infer

一组语言的rec库大约占用10MB空间(未压缩)。若删除到仅剩1组语言,可以节省约60MB空间。

请不要删除cls_infer及det_infer后缀的文件夹,这是所有语言公用的检测/方向分类库。

返回值说明

通过API调用一次OCR,无论成功与否,都会返回一个字典。

字典中,根含两个元素:状态码code和内容data

状态码code为整数,每种状态码对应一种情况:

100 识别到文字
101 未识别到文字
200 图片路径不存在
201 图片路径string无法转换到wstring
202 图片路径存在,但无法打开文件
203 图片打开成功,但读取到的内容无法被opencv解码
剪贴板相关接口已弃用,不建议使用 ##### `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,会报这个错。
300 base64字符串解析为string失败
301 base64字符串解析成功,但读取到的内容无法被opencv解码
400 json对象 转字符串失败
401 json字符串 转对象失败
402 json对象 解析某个键时失败
403 未发现有效任务

详细使用指南

👆当你需要修改或开发新API时欢迎参考。

项目构建指南

稳定版,基于 PP-OCR v2.6

开发版,基于 PP-OCR v2.8

注:此版本基于 Paddle Inference 3.0.0 推理后端,使用带 AVX512 指令集的高端 CPU 时性能更好。普通家用 CPU 则有性能劣化,建议使用上面的稳定版。

感谢

本项目中使用了 ReneNyffenegger/cpp-base64

“base64 encoding and decoding with c++”

本项目中使用了 nlohmann/json

“JSON for Modern C++”

感谢 PaddlePaddle/PaddleOCR ,没有它就没有本项目:

“Awesome multilingual OCR toolkits based on PaddlePaddle”

感谢各位为本项目开发API及贡献代码的朋友!

更新日志

版本号链接可前往对应备份分支。

v1.4.1 2024.8.28

测试: v1.4.1 dev 1 2024.7.31

v1.4.0 2024.7.22

v1.4.0 beta 2 2024.7.9

v1.4.0 beta 2024.7.5

v1.3.1 2023.10.10

v1.3.0 2023.6.19

v1.3.0 alpha 2023.5.26

v1.2.1 2022.9.28

v1.2.0 2022.8.29

v1.2.0 beta 2022.8.26

v1.1.1 2022.4.16

v1.1.0 2022.4.2

v1.0 2022.3.28