PP-OCRv6_Demo/README.md

197 lines
4.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# PP-OCRv6 本地 OCR
本项目使用 PP-OCRv6 实现图片、PDF 和目录批量 OCR。工程结构参考 `../ocr-VL1.6`CPU/GPU 环境隔离,并通过根目录 `ocr.py` 统一调用。
输出 Markdown 的定位是**便于阅读的文字结果**。本项目不实现版面分析、表格结构恢复或富文档还原。
## 功能
- 单图片 PP-OCRv6 识别
- 图片与 PDF 目录批处理
- PDF `hybrid` / `text` / `ocr` 模式
- PDF 文本层质量判断和扫描页自动 OCR
- PDF 页码选择、断点续传与覆盖重做
- TXT、简单 Markdown、归一化 JSON、Benchmark
- 可选 PaddleOCR 原始 JSON 和 OCR 可视化
- CPU/GPU 隔离GPU 失败不回退 CPU
- 模型延迟加载,同一批次复用模型
支持三种成对的检测与识别模型规格:
| 参数 | 检测模型 | 识别模型 |
|---|---|---|
| `tiny` | `PP-OCRv6_tiny_det` | `PP-OCRv6_tiny_rec` |
| `small` | `PP-OCRv6_small_det` | `PP-OCRv6_small_rec` |
| `medium` | `PP-OCRv6_medium_det` | `PP-OCRv6_medium_rec` |
不传参数时默认使用 `medium`
## 安装
### CPU
```bash
uv sync --project cpu
```
### GPU
```bash
python gpu/setup_env.py --cuda cu118 --dry-run
python gpu/setup_env.py --cuda cu118
```
也可按目标机器使用 `cu126`。CUDA、驱动和 PaddlePaddle Wheel 必须相互兼容。
## 使用
### 验证环境
```bash
python ocr.py verify --device cpu
python ocr.py verify --device gpu
```
`verify` 只验证 Paddle 运行环境,不下载和初始化 OCR 模型。
### 单图片
```bash
# 默认 medium
python ocr.py data/images/手写01.png --device cpu
# 选择 small
python ocr.py data/images/手写01.png --device cpu --model-size small
# 选择 tiny--model 是 --model-size 的别名
python ocr.py data/images/手写01.png --device cpu --model tiny
```
保存可视化和原始结果:
```bash
python ocr.py data/images/手写01.png \
--device cpu \
--save-visualization \
--save-raw-result
```
多轮 Benchmark
```bash
python ocr.py data/images/手写01.png --warmup 1 --rounds 3
```
### PDF
```bash
# 默认混合模式:优先文本层,扫描页才 OCR
python ocr.py data/documents/sample.pdf --device cpu
# 强制文本层
python ocr.py sample.pdf --pdf-mode text
# 强制全部页面 OCR
python ocr.py sample.pdf --pdf-mode ocr
# 指定页码
python ocr.py sample.pdf --pages "1-5,8,10-"
# 中断后恢复
python ocr.py sample.pdf --resume
# 删除原任务并重做
python ocr.py sample.pdf --overwrite
```
### 目录
```bash
python ocr.py data/ --device cpu
python ocr.py data/ --recursive --device cpu
```
目录任务串行处理文件,避免无控制并发造成内存占用和界面卡顿。
## 主要 PP-OCRv6 参数
```text
--model-size tiny|small|medium
--model tiny|small|medium # --model-size 的别名
--lang ch
--text-rec-score-thresh 0.0
--text-det-limit-side-len N
--text-det-limit-type min|max
--text-det-thresh FLOAT
--text-det-box-thresh FLOAT
--text-det-unclip-ratio FLOAT
--text-recognition-batch-size 6
--return-word-box
--doc-orientation-classify / --no-doc-orientation-classify
--doc-unwarping / --no-doc-unwarping
--textline-orientation / --no-textline-orientation
```
默认开启文档方向分类和文本行方向分类,默认关闭文档去畸变。
## 输出
```text
outputs/
├── images/
│ └── <图片名_扩展名>/
│ ├── result.txt
│ ├── result.md
│ ├── result.json
│ ├── benchmark.json
│ ├── raw-result.json # 可选
│ └── visualization.jpg # 可选
├── pdfs/
│ └── <PDF名>/
│ ├── manifest.json
│ ├── document.md
│ ├── document.json
│ └── pages/
└── batches/
```
`result.json` 使用项目自有稳定结构,主要包含:
- 文本行
- 识别置信度
- 多边形与矩形坐标
- 模型和语言信息
- 图片尺寸
- 汇总统计
## PDF 混合模式
每页先提取 PDF 文本层:
```text
有效文本层 → 直接保存文本
无效文本层 → 渲染 PNG → PP-OCRv6
```
纯电子 PDF 不加载 PP-OCRv6 模型。Manifest 会记录 PDF 哈希、DPI、文本层阈值和模型配置关键配置变化时必须使用 `--overwrite`,不能错误续传。
## 能力边界
本项目只提供通用文字检测和识别:
- Markdown 是按识别顺序拼接的便读文本;
- 不恢复标题层级;
- 不恢复多栏版面;
- 不恢复表格单元格结构;
- 不提供与 PaddleOCR-VL 等价的富 Markdown。
JSON 中保留坐标,调用方可以按具体业务继续处理。
## 测试
```bash
uv run --project cpu pytest -q
```
测试使用假模型覆盖结果适配、输出路由和 PDF 混合流程,不要求每次测试都下载 OCR 模型。