Skip to content
Lym308758Public

About

离线 OCR 图片转文字|纯 CPU|批量/拖拽/导出

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

离线 OCR 图片转文字 · LocalOCR v2.0.0

基于 PP-OCR 的本地离线 OCR:文字检测 → 方向分类 → 文字识别。 纯离线、纯 CPU、不联网、图片不出本机。

版本:v2.0.0(首个公开发行版,纯 CPU)

提供三种形态:GUI 演示(exe) / CLI 工具 / Agent Skill。


1. 能力与流水线

输入图片
   │
   ▼
[1] DB 文本检测    textbox_detect_v2   ── 找出所有文本行的四边形框
   │
   ▼
[2] 方向分类       textbox_cls_v1      ── 判断文本行是否倒置(0°/180°),转正
   │
   ▼
[3] CRNN 文字识别  textbox_rec_v2      ── 逐行识别成文字(CTC 解码)
   │
   ▼
纯文本 + 带框标注图
  • 中文/英文混排,自动检测、方向矫正、逐行识别。
  • 超长竖图(长宽比 > 3)自动纵向分片,重叠去重后拼接。
  • 单张普通图约 0.3 s(CPU),长图按行数线性增长。

2. 目录结构

LocalOCR/
├── models/                     # PP-OCR 通用权重(使用前请阅读 NOTICE.md)
│   ├── det/  textbox_detect_v2.xml/.bin
│   ├── cls/  textbox_cls_v1.xml/.bin
│   ├── rec/  textbox_rec_v2.xml/.bin + ppocr_keys_v1.txt
│   ├── optional/ dewarp_coarse/fine、doc_detect
│   └── NOTICE.md               # 模型来源与使用限制
├── demo/
│   ├── ppocr_pipeline.py       # 三段推理 + DB 后处理 + CTC 解码
│   ├── batch_io.py             # 文件采集 / 相对路径 / 安全命名
│   ├── export_ocr.py           # 逐图 .txt / 合并 .md
│   ├── ocr_demo.py             # 单图 CLI
│   ├── ocr_tall.py             # 超长竖图分片 CLI
│   └── make_sample.py          # 生成测试图
├── app/
│   └── gui_ocr.py              # GUI(拖拽/批量/任务列表/进度/导出)
├── cli/
│   └── ocr_cli.py              # Agent/脚本调用(多图/文件夹/导出/--json)
├── tools/
│   ├── slim_dist.py            # 打包瘦身
│   └── regress.py              # 兼容性回归
├── RELEASE_NOTES.md / CHANGELOG.md
├── build_exe.bat               # 一键打包
└── requirements.txt

3. 三种使用方式

形态 入口 适用
GUI 演示 dist\LocalOCR\LocalOCR.exe 人手动操作
CLI 工具 cli\ocr_cli.py --image X --json 脚本 / Agent
Agent Skill ~/.workbuddy/skills/local-ocr/ Agent 自动识别

GUI 特性

  • 拖拽:把图片或文件夹直接拖进窗口即可(支持多图/文件夹递归)。
  • 批量:添加图片(多选)/ 添加文件夹,左侧任务列表显示状态、行数、耗时;带进度条与取消。
  • 左侧可滚动预览:长图按宽度自适应,支持滚动条 + 鼠标滚轮 + 缩放滑块(20%–300%)。
  • 右侧上下分栏:上为逐行结果(序号 / 置信度 / 文本),下为可编辑纯文本框。
  • 导出:当前文本 / 当前标注图 / 每图一个 .txt / 合并 .md(## 文件名 分段)。

CLI 示例

# 单图
.venv\Scripts\python.exe cli\ocr_cli.py --image demo\sample.png

# 多图 / 整个文件夹(递归),并导出
.venv\Scripts\python.exe cli\ocr_cli.py --image a.png b.png --json
.venv\Scripts\python.exe cli\ocr_cli.py --dir pics --out-dir out --merge-file out\all.md

⛔ Agent 硬性规定:必须传图片真实文件路径,禁止传聊天窗口剪贴板 / blobs 图片——粘贴管线会按长边 1920 压缩,识别必然失败。CLI 已内置拦截(退出码 4)。


4. 快速开始

# 直接跑(环境已就绪)
.venv\Scripts\python.exe demo\ocr_demo.py --image demo\sample.png

# 从零搭建
python -m venv --system-site-packages .venv
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple openvino opencv-python numpy Pillow tkinterdnd2

打包 exe

build_exe.bat          # -> dist\LocalOCR(约 286MB,纯 CPU)

手动构建(必须用干净环境,避免无关包干扰 PyInstaller):

.venv-build\Scripts\python.exe -m PyInstaller --noconfirm --clean --onedir --windowed ^
  --name LocalOCR --paths demo ^
  --add-data "models;models" --add-data "demo/sample.png;demo" ^
  --collect-binaries openvino --collect-data openvino ^
  --collect-all tkinterdnd2 ^
  app\gui_ocr.py
.venv-build\Scripts\python.exe tools\slim_dist.py --dist "dist\LocalOCR\_internal"

自检:dist\LocalOCR\LocalOCR.exe --selftest,结果写入 dist\LocalOCR\selftest.log。


5. 模型与张量规格(实测)

阶段 输入 输出
检测 x : [?,3,?,?] sigmoid : [?,1,?,?]
方向 x : [?,3,?,?] softmax : [?,2]
识别 x : [?,3,48,?] softmax : [?,?,6625]
  • 识别类别 6625 = 1(blank) + 6623(字典) + 1(空格)。
  • 输入为动态尺寸:检测/方向对 H、W 无约束(建议 32 的倍数),识别固定高 48、宽自由。

6. 技术实现

  • 推理:OpenVINO Runtime(CPU),IR 格式。
  • 图像:OpenCV(透视裁剪、DB 后处理)。
  • 解码:纯 Python CTC 贪心解码(合并重复 + 去 blank)。
  • 路径兼容:cv2.imread 在 Windows 下不支持非 ASCII 路径,已用 np.fromfile + cv2.imdecode 封装替代。

7. 调参速查

参数 位置 默认 调大效果
limit_side_len detect() 960/1280 小字更准,更慢
thresh detect() 0.3 减少误检,可能漏检
box_thresh detect() 0.6 过滤低质量框
unclip_ratio detect() 1.6 框更松,适合密排文字
tile 长图模式 1200 分片更高,重叠更少

8. 性能优化(实测)

测试图:1080×25070 长截图(约 316 行),纯 CPU,仅计推理时间(不含模型编译)。

配置 耗时 相对基线
基线(逐行识别、limit 1280) 8.30 s 1.00×
+ 批量识别(默认,batch=32) 4.76 s 1.74×
+ 检测限 960(--limit 960) 4.01 s 2.07×
+ 跳过方向分类(--no-cls) 3.52 s 2.36×
  • 批量识别已默认开启:多行按最大宽度 padding 成 [N,3,48,Wmax] 一次推理,无精度损失。
  • 小图(5 行)同样受益:0.063 s → 0.049 s。
  • THROUGHPUT 性能提示在本机反而更慢(0.10 s vs 0.06 s),故未启用。
  • FP16 量化在本机提升 < 5%,未采用。
  • 更大的分片(1800/2400)可再快 ~20%,但会增加行合并误差,默认仍用 1200。

建议:

  • 默认配置已优化(批量),一般无需改动。
  • 追求速度:--limit 960 --no-cls --batch 32(端正文档可用;GUI 勾选「快速模式」)。
  • 追求质量:保持 limit 1280 并开启方向分类。
  • 批量处理多图:复用同一进程,避免每次重复编译模型(单次省约 1 s)。

9. 常见问题

现象 原因 / 处理
打开图片不显示 已修复(ImageTk 导入缺失);当前版本改用可滚动 Canvas
长图只能看到一条 已修复:按宽度自适应 + 滚动条/滑块
识别全是碎片 图片被降采样(宽 < 300px),换原图
中文路径读不到 已用 imread_unicode 修复
文字正确但缺空格 中文 OCR 模型特性
首次识别慢 1–2 s 首次编译模型,正常

10. 合规与使用边界

  • 本仓库的代码用于学习与研究;模型为通用 PP-OCR 权重。
  • 模型权重版权归其原权利人所有,本仓库仅作个人学习与研究用途,禁止商用或再分发。
  • 如权利人认为本仓库的使用方式不当,请联系维护者,我们将立即移除相关权重。
  • 如需商用,请使用 PaddleOCR(Apache-2.0),本项目的管线代码可直接复用。
  • 请遵守你所在地区及软件许可协议的相关规定。

About

离线 OCR 图片转文字|纯 CPU|批量/拖拽/导出

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages