Home

Awesome

离线OCR组件 系列项目:

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

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

资源目录

<details> <summary>使用示例</summary>
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带来的文本块后处理(段落合并)技术。详细使用方法见 资源目录

</details>

2. Node.js API

资源目录

<details> <summary>使用示例</summary>
npm install paddleocrjson
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());
</details>

3. PowerShell API

资源目录

4. Java API

资源目录

5. .NET API

资源目录

6. Rust API

资源目录

7. Go API

资源目录

更多语言API

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

常用配置参数说明

键名称默认值值说明
config_path""可以指定不同语言的配置文件路径,识别多国语言。详情见下节
models_path""可以指定语言库 models 文件夹的路径。详情见下节
dettrue启用det目标识别。如果你的图片中只含一行文本,且没有空白区域,那么可以关闭det以加快速度。
clsfalse启用cls方向分类,识别方向不是正朝上的图片。
use_angle_clsfalse启用方向分类,必须与cls同时设置。
enable_mkldnntrue启用CPU推理加速,关掉可以减少内存占用,但会降低速度。
limit_side_len960对图像边长进行限制,降低分辨率,加快速度。
如果对大图/长图的识别率低,可增大 limit_side_len 的值。
建议为 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解码
<details> <summary> <strong>剪贴板相关接口已弃用,不建议使用</strong> </summary>
210 剪贴板打开失败
211 剪贴板为空
212 剪贴板的格式不支持
213 剪贴板获取内容句柄失败
214 剪贴板查询到的文件的数量不为1
215 剪贴板检索图形对象信息失败
216 剪贴板获取位图数据失败
217 剪贴板中位图的通道数不支持
</details>
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