# PP-OCRv6 可行性分析与实施方案 ## 1. 文档目的 本文评估在当前 `PP-OCRv6` 项目中,参考相邻项目 `../ocr-VL1.6` 的工程结构和功能,建设一套基于 **PP-OCRv6** 的本地 OCR 应用是否可行,并给出推荐架构、改造范围、实施步骤、风险及验收标准。 本文所称“仿照 `../ocr-VL1.6`”主要指复用其以下工程能力: - 根目录统一入口; - CPU/GPU 运行环境隔离; - 图片、PDF、目录自动路由; - PDF 文本层提取与 OCR 混合处理; - 模型延迟加载; - 批量串行处理; - 统一输出目录; - Benchmark、日志、断点续传与测试。 本项目已确认不实现版面分析和表格结构恢复。Markdown 输出仅定位为“便于阅读的文字结果”,按识别顺序拼接文本,不追求原文档版面或表格结构还原。 --- ## 2. 参考项目现状 参考项目 `../ocr-VL1.6` 已具备较完整的本地 OCR 工程框架,其主要结构如下: ```text ocr-VL1.6/ ├── ocr.py # 根目录统一入口 ├── ocr_app/ │ ├── cli.py # 命令行参数 │ ├── commands.py # 图片/PDF/目录路由 │ ├── runtime.py # CPU/GPU 校验和模型延迟加载 │ ├── output.py # 输出归一化 │ ├── pdf.py # PDF 分页、OCR、断点续传 │ ├── pdf_text.py # PDF 文本层提取与质量判断 │ └── logging_utils.py # UTF-8 日志 ├── cpu/ # CPU 独立 uv 项目 ├── gpu/ # GPU 独立 uv 项目 ├── tests/ # 共享逻辑测试 ├── outputs/ ├── benchmarks/ └── logs/ ``` 参考项目当前使用: - `paddleocr[doc-parser]==3.7.0`; - CPU:`paddlepaddle==3.2.1`; - GPU:`paddlepaddle-gpu==3.2.1`; - PDF 渲染:`pypdfium2>=5.11.0`; - Python 环境管理:`uv`。 经本地已安装包源码核验,PaddleOCR 3.7.0 已原生支持: ```python from paddleocr import PaddleOCR ocr = PaddleOCR( ocr_version="PP-OCRv6", lang="ch", device="cpu", ) ``` 当不显式指定模型名称时,PP-OCRv6 默认使用: - 默认文本检测:`PP-OCRv6_medium_det`; - 默认文本识别:`PP-OCRv6_medium_rec`; - 可选规格:`tiny`、`small`、`medium`,检测与识别模型按相同规格成对选择。 因此,参考项目的依赖体系和 CPU/GPU 隔离方案可以继续使用,不需要引入新的 OCR 框架。 --- ## 3. 模型能力差异 ### 3.1 PaddleOCR-VL-1.6 参考项目使用的 PaddleOCR-VL-1.6 属于视觉语言文档解析管线,输出中包含: - 版面区域; - 文档块标签; - 按版面组织的文本内容; - 富 Markdown; - Markdown 图片资源; - `parsing_res_list`、`layout_det_res` 等结构化信息。 它更适合复杂文档解析、版面理解和接近原文档结构的 Markdown 导出。 ### 3.2 PP-OCRv6 PP-OCRv6 是传统检测与识别组合式 OCR 管线,主要输出: - `dt_polys`:检测框多边形; - `rec_texts`:识别文本; - `rec_scores`:识别置信度; - `rec_polys`:保留的识别区域; - `rec_boxes`:矩形坐标; - 可选文字方向和单词级坐标。 其核心优势是文本检测与识别,默认不提供与 PaddleOCR-VL-1.6 等价的: - 标题、正文、表格、图片等版面语义分类; - 复杂阅读顺序恢复; - 表格结构还原; - 公式、图表和文档级语义理解; - 原生富 Markdown。 ### 3.3 能力对比 | 维度 | PaddleOCR-VL-1.6 | PP-OCRv6 | 影响 | |---|---|---|---| | 普通文字识别 | 支持 | 支持,通常更轻量 | 可替换 | | 文本框坐标 | 支持 | 支持 | 可替换 | | 识别置信度 | 结果形态依管线 | 原生支持 | PP-OCRv6 更直接 | | 版面分析 | 强 | 非核心能力 | 不可直接等价替换 | | 表格结构恢复 | 支持文档解析能力 | 默认不支持 | 需要额外模型或降级输出 | | Markdown | 原生富 Markdown | 需要自行拼接 | 必须重写输出适配器 | | 推理资源 | 较高 | 通常较低 | PP-OCRv6 更适合通用 OCR | | 批量吞吐 | 受 VLM 生成影响 | 检测识别管线更适合批量 | 预期更好,需实测 | | PDF 文本层混合路由 | 工程层实现 | 可复用同一工程层 | 可直接复用 | --- ## 4. 可行性结论 ### 4.1 总体结论 **项目可行,推荐实施。** 如果目标是实现“图片/PDF/目录的本地文字识别应用”,并保留 `../ocr-VL1.6` 的统一入口、CPU/GPU 隔离、PDF 混合模式、输出管理、Benchmark 和日志能力,则整体可行性为 **高**。 本项目不要求与 PaddleOCR-VL-1.6 完全一致的版面结构和富 Markdown,也不实现表格结构恢复,因此上述能力不纳入本次实施范围。 ### 4.2 分项可行性 | 项目 | 可行性 | 说明 | |---|---|---| | CPU 本地推理 | 高 | 当前依赖已支持 PP-OCRv6,参考项目 CPU 环境可复用 | | NVIDIA GPU 推理 | 高但需实机验证 | GPU Wheel 安装逻辑可复用,仍需目标 CUDA 机器验证 | | 单图片 OCR | 高 | `PaddleOCR.predict()` 可直接处理图片 | | 批量目录 OCR | 高 | 可复用串行路由和单模型复用机制 | | 扫描 PDF OCR | 高 | 复用 PDF 渲染后逐页调用 PP-OCRv6 | | 电子 PDF 文本直取 | 高 | 与 OCR 模型无关,可直接复用 | | PDF 混合模式 | 高 | 可复用文本层质量判定和按页路由 | | PDF 断点续传 | 高 | 可复用 manifest 机制,调整结果字段即可 | | TXT/JSON 输出 | 高 | PP-OCRv6 原生结果适合导出 | | 简单 Markdown 输出 | 高 | 可按阅读顺序拼接纯文本行 | | 便读 Markdown | 高 | 按识别顺序拼接文字,不恢复原版面 | | 版面/表格结构恢复 | 不实施 | 已明确排除在本项目范围之外 | | 多语言 | 中 | PP-OCRv6 支持范围需按语言确认,不支持的语言应回退 PP-OCRv5 或拒绝启动 | ### 4.3 推荐适用场景 PP-OCRv6 版本适合: - 名片、票据、截图、扫描件的文字提取; - 中文、英文、日文及已支持拉丁语种识别; - 大量普通图片的批处理; - 电子 PDF 与扫描 PDF 混合处理; - 对坐标、置信度和纯文本有明确需求的场景; - CPU 本地部署或资源受限部署。 不建议仅使用 PP-OCRv6 完成: - 高保真合同版面还原; - 表格单元格结构恢复; - 公式语义识别; - 图文混排文档的章节层级恢复; - 与 PaddleOCR-VL 输出完全兼容的富 Markdown 生成。 --- ## 5. 建设目标 建议本项目第一阶段实现以下功能: 1. 根目录统一入口: ```bash python ocr.py <图片|PDF|目录> --device cpu|gpu ``` 2. 自动按输入类型路由: - 图片:PP-OCRv6 检测与识别; - PDF:文本层直取或页面 OCR; - 目录:发现支持的图片和 PDF,串行处理。 3. CPU/GPU 环境完全隔离: - `cpu/.venv`; - `gpu/.venv`; - GPU 不可用时明确失败,不静默回退 CPU。 4. 模型延迟加载: - 纯电子 PDF 不加载 PP-OCRv6; - 首张图片或首个扫描 PDF 页面才初始化模型; - 同一批次复用单个模型实例。 5. 输出格式: - `result.txt`:纯文本; - `result.md`:简单 Markdown; - `result.json`:归一化结构化结果; - `visualization.jpg`:可选识别可视化; - `benchmark.json`:耗时、设备、模型和统计信息。 6. PDF 能力: - `hybrid`、`text`、`ocr` 三种模式; - 页码选择; - PDF 密码; - 断点续传; - 覆盖重做; - 每页独立结果和整文档合并结果。 7. UTF-8 结构化日志、错误处理和自动化测试。 --- ## 6. 推荐目录结构 建议沿用参考项目结构,但将模型相关字段改为 PP-OCRv6: ```text PP-OCRv6/ ├── ocr.py ├── ocr_app/ │ ├── __init__.py │ ├── cli.py │ ├── commands.py │ ├── runtime.py │ ├── result_adapter.py # PP-OCRv6 结果归一化 │ ├── output.py │ ├── pdf.py │ ├── pdf_text.py │ └── logging_utils.py ├── cpu/ │ ├── .python-version │ ├── pyproject.toml │ ├── uv.lock │ ├── README.md │ └── runner.py ├── gpu/ │ ├── .python-version │ ├── pyproject.toml │ ├── README.md │ ├── runner.py │ └── setup_env.py ├── data/ │ ├── images/ │ └── documents/ ├── outputs/ ├── benchmarks/ ├── logs/ ├── tests/ ├── docs/ │ └── 01-可行性分析与实施方案.md ├── .gitignore └── README.md ``` 新增 `result_adapter.py` 的原因是 PP-OCRv6 与 PaddleOCR-VL-1.6 的结果对象差异较大。模型原始结果不应直接扩散到 PDF、输出、Benchmark 和日志模块中,应先转换为稳定的项目内部数据结构。 --- ## 7. 核心架构设计 ### 7.1 分层结构 ```text ocr.py ↓ 选择 CPU/GPU 独立环境 cpu/runner.py 或 gpu/runner.py ↓ ocr_app/cli.py ↓ ocr_app/commands.py ├── 图片路由 ├── PDF 路由 └── 目录路由 ↓ ocr_app/runtime.py ↓ 延迟创建 PaddleOCR(ocr_version="PP-OCRv6") ↓ ocr_app/result_adapter.py ↓ TXT / Markdown / JSON / 可视化 / Benchmark ``` ### 7.2 运行时设计 `PipelineProvider` 继续负责: - 导入 PaddlePaddle; - CPU 线程配置; - CUDA 构建检查; - GPU 数量和设备编号检查; - 模型延迟初始化; - GPU 同步; - 设备和环境元数据收集。 模型初始化建议为: ```python from paddleocr import PaddleOCR self._pipeline = PaddleOCR( ocr_version="PP-OCRv6", lang=self.config.lang, device=self.resolved_device, use_doc_orientation_classify=self.config.use_doc_orientation_classify, use_doc_unwarping=self.config.use_doc_unwarping, use_textline_orientation=self.config.use_textline_orientation, text_recognition_batch_size=self.config.text_recognition_batch_size, ) ``` 建议默认配置: | 参数 | 建议默认值 | 说明 | |---|---:|---| | `ocr_version` | `PP-OCRv6` | 显式锁定版本,避免依赖升级后默认值变化 | | `lang` | `ch` | 主要面向中英文混合文档 | | `use_doc_orientation_classify` | `true` | 处理整页旋转 | | `use_doc_unwarping` | `false` | 默认关闭以降低加载和推理开销,可通过参数开启 | | `use_textline_orientation` | `true` | 处理倒置文本行 | | `text_recognition_batch_size` | `6` | 与默认配置保持一致,后续按设备调优 | | `text_rec_score_thresh` | `0.0` | 保留原始结果,输出层可另设过滤阈值 | 所有模型选项必须记录到 Benchmark 和 PDF manifest 中,以保证结果可追溯并支持安全续传。 ### 7.3 统一内部结果模型 建议将 PaddleOCR 原始结果转换为以下项目内部结构: ```json { "schema_version": 1, "source_type": "image_ocr", "input_path": "data/images/example.jpg", "page_index": 0, "model": { "ocr_version": "PP-OCRv6", "detection_model": "PP-OCRv6_medium_det", "recognition_model": "PP-OCRv6_medium_rec", "language": "ch" }, "image": { "width": 1920, "height": 1080 }, "lines": [ { "index": 1, "text": "示例文本", "score": 0.9876, "polygon": [[10, 20], [200, 20], [200, 50], [10, 50]], "box": [10, 20, 200, 50], "orientation": 0 } ], "summary": { "detected_lines": 1, "non_empty_lines": 1, "mean_score": 0.9876, "min_score": 0.9876 } } ``` 内部结果模型应满足: - 不依赖 PaddleOCR 私有类; - 所有 NumPy 类型转换为标准 Python 类型; - 字段稳定,可用于测试和后续 API 服务; - 保留坐标和置信度; - 原始 PaddleOCR JSON 可选择另存为 `raw-result.json`,但不作为项目主接口。 ### 7.4 文本阅读顺序 PP-OCRv6 已对检测框进行基础排序,但复杂多栏文档的阅读顺序仍可能不符合人类阅读习惯。 第一阶段建议: 1. 使用模型结果顺序; 2. 按顺序写入 TXT 和简单 Markdown; 3. JSON 中完整保留坐标; 4. 不承诺复杂多栏和表格的语义顺序。 如后续需要增强,可增加可选的坐标排序策略: - 单栏:从上到下、从左到右; - 多栏:先聚类列,再逐列排序; - 表格:交由专用表格结构识别模块处理。 --- ## 8. 图片处理方案 ### 8.1 处理流程 ```text 校验图片类型 ↓ 延迟加载 PP-OCRv6 ↓ 可选预热 ↓ 执行 N 轮推理 ↓ 结果适配和统计 ↓ 输出 TXT/MD/JSON/可视化/Benchmark ``` ### 8.2 输出目录 ```text outputs/images/<图片名_扩展名>/ ├── result.txt ├── result.md ├── result.json ├── raw-result.json # 可选 ├── visualization.jpg # 可选 └── benchmark.json ``` ### 8.3 Markdown 输出定义 PP-OCRv6 不提供版面语义,因此 `result.md` 应明确定位为“便于阅读的文字结果”,例如: ```markdown # example.jpg 示例文本第一行 示例文本第二行 ``` 不应伪造标题、表格、图片引用等模型未识别出的结构。 ### 8.4 Benchmark 指标 建议记录: - Paddle 导入时间; - 运行时配置时间; - 模型初始化时间; - 预热时间; - 每轮推理时间; - 结果适配时间; - 导出时间; - 文件总耗时; - 检测文本行数; - 非空文本行数; - 平均、最小、最大置信度; - CPU 线程数; - GPU 显存信息; - 模型名称、语言和预处理开关。 --- ## 9. PDF 处理方案 ### 9.1 复用策略 参考项目的 PDF 文本层提取、质量判断、页码解析、渲染、manifest 和断点续传逻辑与具体 OCR 模型耦合较低,建议保留。 需要重写的部分主要是: - OCR 页结果解析; - OCR 页 Markdown 生成; - OCR 页 JSON 结构; - 页面统计字段; - manifest 中的模型配置和结果摘要。 ### 9.2 混合处理流程 ```text 打开 PDF ↓ 逐页提取文本层并评估质量 ├── 文本层有效:直接保存文本 └── 文本层无效:渲染为 PNG → PP-OCRv6 ↓ 保存逐页 MD/JSON ↓ 更新 manifest ↓ 合并 document.md/document.json ``` ### 9.3 PDF 模式 | 模式 | 行为 | |---|---| | `hybrid` | 默认。优先使用有效文本层,必要时才 OCR | | `text` | 只提取文本层,不加载模型 | | `ocr` | 所有选中页面均渲染并执行 PP-OCRv6 | ### 9.4 PDF 输出目录 ```text outputs/pdfs// ├── manifest.json ├── document.md ├── document.json ├── pages/ │ ├── page-0001.md │ ├── page-0001.json │ └── ... ├── visualizations/ # 可选 └── rendered/ # 仅 --keep-rendered 时保留 ``` ### 9.5 断点续传兼容性 建议为 PP-OCRv6 项目设置独立的 manifest 版本,例如: ```json { "manifest_version": 1, "pipeline": "PP-OCRv6", "model_config": { "language": "ch", "detection_model": "PP-OCRv6_medium_det", "recognition_model": "PP-OCRv6_medium_rec", "use_doc_orientation_classify": true, "use_doc_unwarping": false, "use_textline_orientation": true } } ``` 恢复任务时至少校验: - PDF SHA-256; - PDF 模式; - 页面渲染 DPI; - 文本层质量阈值; - PP-OCRv6 模型名称; - 语言; - 文档方向、去畸变、文本行方向开关; - 识别置信度阈值; - manifest 版本。 任一关键配置变化时,应拒绝直接续传并提示使用 `--overwrite`。 --- ## 10. CLI 设计 ### 10.1 基础命令 ```bash python ocr.py data/images/example.jpg --device cpu python ocr.py data/documents/example.pdf --device cpu python ocr.py data/ --recursive --device cpu python ocr.py verify --device gpu ``` ### 10.2 建议保留的参数 ```text --device cpu|gpu --device-id 0 --threads N --recursive --output PATH --fail-fast --warmup N --rounds N --benchmark-json PATH --pdf-mode hybrid|text|ocr --pages "1-5,8,10-" --dpi 144 --password PASSWORD --resume --overwrite --keep-rendered --log-file PATH --verbose ``` ### 10.3 PP-OCRv6 新参数 ```text --lang ch --text-rec-score-thresh 0.0 --text-det-limit-side-len N --text-det-limit-type min|max --text-det-thresh 0.3 --text-det-box-thresh 0.6 --text-det-unclip-ratio 1.5 --text-recognition-batch-size 6 --return-word-box --use-doc-orientation-classify / --no-doc-orientation-classify --use-doc-unwarping / --no-doc-unwarping --use-textline-orientation / --no-textline-orientation --save-visualization --save-raw-result ``` ### 10.4 应删除的 VLM 专用参数 以下参数属于 PaddleOCR-VL 生成式推理,不适用于 PP-OCRv6,应从新项目中移除: ```text --max-new-tokens --min-pixels --max-pixels ``` --- ## 11. CPU/GPU 环境方案 ### 11.1 CPU 建议首先沿用参考项目已验证组合: ```toml [project] requires-python = ">=3.13" dependencies = [ "paddleocr==3.7.0", "paddlepaddle==3.2.1", "pypdfium2>=5.11.0", "setuptools>=83.0.0", ] ``` 如果可视化功能需要 OpenCV,应通过 PaddleOCR/PaddleX 实际依赖验证后补充对应包,避免同时安装冲突的 OpenCV 变体。 安装: ```bash uv sync --project cpu ``` ### 11.2 GPU GPU 项目继续独立管理: ```toml [project] requires-python = ">=3.11,<3.13" dependencies = [ "paddleocr==3.7.0", "paddlepaddle-gpu==3.2.1", "pypdfium2>=5.11.0", "setuptools>=83.0.0", ] ``` GPU Wheel 不能仅依赖默认 PyPI 解析,应沿用 `gpu/setup_env.py`,按 PaddlePaddle 官方 CUDA 兼容矩阵选择安装源。 安装完成后生成 `gpu/.gpu-ready`,统一入口仅允许调用已完成安装的 GPU 环境。 ### 11.3 模型缓存 首次运行时可能下载多个模型,包括: - PP-OCRv6 检测模型; - PP-OCRv6 识别模型; - 文档方向分类模型; - 文本行方向模型; - 开启去畸变时的去畸变模型。 实施时应: 1. 在 README 中说明首次启动需要网络和下载时间; 2. 记录模型缓存位置; 3. 支持通过模型目录参数加载离线模型; 4. 在正式部署前预下载并执行一次冷启动验证; 5. 不将模型权重提交到 Git。 --- ## 12. 代码复用与改造清单 ### 12.1 可直接或小幅复用 | 参考文件 | 复用程度 | 调整内容 | |---|---|---| | `ocr.py` | 高 | 修改项目提示文字 | | `ocr_app/logging_utils.py` | 高 | 基本可直接复用 | | `ocr_app/pdf_text.py` | 高 | 基本可直接复用 | | `ocr_app/cli.py` | 中 | 替换模型参数 | | `ocr_app/commands.py` | 中 | 替换图片结果统计和推理参数 | | `ocr_app/pdf.py` | 中 | 替换 OCR 页结果解析和导出 | | `cpu/runner.py` | 高 | 基本可直接复用 | | `gpu/runner.py` | 高 | 基本可直接复用 | | `gpu/setup_env.py` | 高 | 修改项目名称并重新验证 | | 测试基础设施 | 高 | 保留假模型和临时目录模式 | ### 12.2 必须重写 | 模块 | 原因 | |---|---| | `ocr_app/runtime.py` 的模型创建部分 | `PaddleOCRVL` 改为 `PaddleOCR` | | 图片结果摘要 | 不再存在 `parsing_res_list` 和 `layout_det_res` | | `ocr_app/output.py` 的 Markdown 导出 | PP-OCRv6 没有 `result.markdown` | | PDF OCR 页导出 | 需基于 `rec_texts/rec_scores/rec_polys` 生成 | | Benchmark 统计 | 从版面块统计改为文本行和置信度统计 | | 模型参数和日志字段 | 删除 VLM 参数,增加检测/识别参数 | ### 12.3 不建议机械复制 不建议直接复制整个 `../ocr-VL1.6` 后仅替换模型类名,原因包括: - 输出代码强依赖 `result.markdown`; - 纯文本生成强依赖 `parsing_res_list`; - Benchmark 强依赖版面框和解析块; - PDF 页面统计强依赖 `layout_det_res`; - VLM 参数会被错误传给 PP-OCRv6; - 断点续传 manifest 未记录 PP-OCRv6 的关键配置。 推荐做法是复用工程骨架,同时新建明确的 PP-OCRv6 结果适配层。 --- ## 13. 实施步骤 ### 阶段一:工程骨架与环境 1. 从参考项目选择性迁移目录结构; 2. 创建根入口、CPU/GPU runner; 3. 建立 CPU/GPU `pyproject.toml`; 4. 迁移日志、PDF 文本层和基础工具; 5. 完成 `verify` 命令; 6. 验证 CPU PaddlePaddle 和 PaddleOCR 版本。 交付物: - CPU 环境可安装; - `python ocr.py verify --device cpu` 成功; - GPU 不可用时有明确提示且不回退 CPU。 ### 阶段二:单图片 OCR 1. 实现 PP-OCRv6 延迟加载; 2. 实现单图片推理; 3. 实现 `result_adapter.py`; 4. 输出 TXT、MD、JSON; 5. 实现 Benchmark; 6. 增加可选可视化输出。 交付物: - 中文、英文、旋转文本样例识别成功; - 坐标和置信度正确写入 JSON; - 多轮 Benchmark 可用。 ### 阶段三:目录批处理 1. 迁移后缀路由; 2. 复用单模型实例; 3. 保持串行处理; 4. 处理递归目录和同名文件; 5. 生成批次汇总 JSON; 6. 验证单文件失败不会污染其他结果。 交付物: - 图片目录可批量处理; - 输出保留相对目录; - 批次结果可追溯。 ### 阶段四:PDF 混合模式 1. 接入文本层质量判断; 2. 实现扫描页渲染与 PP-OCRv6 推理; 3. 实现逐页 TXT/MD/JSON; 4. 实现整文档合并; 5. 实现 manifest 和断点续传; 6. 验证电子 PDF 不加载模型。 交付物: - `hybrid`、`text`、`ocr` 模式可用; - 可选择页码; - 中断后可恢复; - 配置不一致时拒绝错误续传。 ### 阶段五:GPU、性能与文档 1. 在 NVIDIA GPU 机器安装环境; 2. 执行 GPU Smoke Test; 3. 测试冷启动、热启动和批量吞吐; 4. 调整识别 Batch Size; 5. 评估方向分类和去畸变的性能影响; 6. 完善 README、故障排查和部署说明。 交付物: - CPU/GPU Benchmark 对比; - GPU 显存使用记录; - 明确推荐参数。 --- ## 14. 测试方案 ### 14.1 单元测试 建议至少覆盖: - 输入类型识别; - 支持后缀发现; - 页码范围解析; - 文本层质量判断; - PP-OCRv6 原始结果归一化; - 空识别结果处理; - NumPy 类型 JSON 序列化; - TXT/Markdown 生成; - 输出目录命名; - 递归目录相对路径; - manifest 参数一致性校验; - CPU/GPU 根入口路由。 ### 14.2 集成测试 建议准备以下样例: | 样例 | 目的 | |---|---| | 中文印刷体图片 | 基础识别 | | 中英文混合名片 | 多语言和小字号 | | 90°/180° 旋转图片 | 方向分类 | | 透视拍摄文档 | 去畸变开关 | | 手写图片 | 能力边界测试 | | 纯电子 PDF | 验证不加载 OCR 模型 | | 纯扫描 PDF | 验证逐页 OCR | | 混合 PDF | 验证按页路由 | | 加密 PDF | 密码处理 | | 多页大 PDF | 断点续传和稳定性 | | 多栏文档 | 验证阅读顺序限制 | | 表格文档 | 明确非结构化输出边界 | ### 14.3 假模型测试 与参考项目一致,应使用假模型完成大多数工程测试,避免测试过程下载模型或消耗大量推理时间。 假结果至少包含: ```python { "rec_texts": ["第一行", "第二行"], "rec_scores": [0.98, 0.95], "rec_polys": [...], "rec_boxes": [...], } ``` ### 14.4 性能测试 分别记录: - 首次模型下载时间; - 冷启动模型初始化时间; - 单图热推理时间; - 100 张图片串行总耗时; - 10 页扫描 PDF 总耗时; - CPU 不同线程数; - GPU 不同识别 Batch Size; - 开启/关闭文档方向分类; - 开启/关闭去畸变; - 开启/关闭文本行方向分类。 Benchmark 必须标注输入尺寸、DPI、硬件和模型配置,否则不同结果不可直接比较。 --- ## 15. 风险与应对 ### 风险一:输出能力被误认为与 PaddleOCR-VL 等价 **影响:高。** 应对: - README 明确 PP-OCRv6 是文字检测识别管线; - `result.md` 标注为简单文本 Markdown; - 不承诺表格、标题层级和复杂阅读顺序; - 如业务确有结构化需求,另立 PP-Structure/文档解析增强阶段。 ### 风险二:结果对象格式与参考项目不兼容 **影响:高。** 应对: - 新建 `result_adapter.py`; - 业务层只依赖内部结果模型; - 使用假模型固定输出契约; - 原始结果与归一化结果分开保存。 ### 风险三:PP-OCRv6 语言支持有限 **影响:中。** 本地 PaddleOCR 3.7.0 的 PP-OCRv6 映射适用于中文、繁体中文、英文、日文及多数拉丁语种;韩文、阿拉伯文、部分西里尔文和印度语系等不应默认假设支持 PP-OCRv6。 应对: - 默认 `lang=ch`; - 启动时验证 `lang + ocr_version`; - 不支持时给出明确错误; - 如业务允许,可设计显式 `--allow-version-fallback` 回退 PP-OCRv5,但默认不应静默回退。 ### 风险四:首次运行需要下载多个模型 **影响:中。** 应对: - 增加部署前模型预热步骤; - 支持离线模型目录; - 在日志中记录下载和初始化阶段; - 在生产环境提前准备缓存。 ### 风险五:CPU 性能受辅助模型影响 **影响:中。** 默认 OCR 管线可能同时加载方向分类、文本行方向和去畸变模型。 应对: - 默认关闭去畸变; - 对方向正常的批量扫描件提供轻量配置; - 分别 Benchmark 各开关; - 不以单个样例推断整体性能。 ### 风险六:GPU 环境未实机验证 **影响:中。** 应对: - 保留严格的 GPU 就绪标记; - 不允许 GPU 失败后自动回退 CPU; - 在目标机器验证 CUDA、驱动和 Paddle Wheel; - 记录实际显存和吞吐。 ### 风险七:复杂 PDF 阅读顺序不准确 **影响:中。** 应对: - 第一阶段保留坐标并按模型顺序输出; - 对多栏和表格文档在验收中标记能力边界; - 后续按业务需求增加版面排序或结构识别,而非在基础 OCR 中堆叠启发式规则。 --- ## 16. 验收标准 ### 16.1 功能验收 - [ ] `python ocr.py verify --device cpu` 成功; - [ ] 单张图片可输出 TXT、MD、JSON 和 Benchmark; - [ ] JSON 包含文本、置信度和坐标; - [ ] 目录模式可处理图片和 PDF; - [ ] 递归目录输出不会因同名文件互相覆盖; - [ ] PDF `hybrid` 模式能区分电子文本页和扫描页; - [ ] 纯电子 PDF 不初始化 PP-OCRv6; - [ ] PDF 可按页处理并支持断点续传; - [ ] `--overwrite` 可安全重做; - [ ] GPU 环境不可用时明确失败且不回退 CPU; - [ ] 日志、JSON 和中文路径均使用 UTF-8; - [ ] 中断或单文件失败后已有结果保持完整。 ### 16.2 质量验收 - [ ] 内部结果模型有固定 `schema_version`; - [ ] 模型原始结果不直接泄漏到业务层; - [ ] 关键文件写入采用原子替换; - [ ] manifest 记录完整模型配置; - [ ] 配置变化时不能错误续传; - [ ] 单元测试覆盖核心路由、输出、PDF 和恢复逻辑; - [ ] 文档明确说明 PP-OCRv6 与 PaddleOCR-VL 的能力差异。 ### 16.3 性能验收 性能目标不应在缺少目标硬件数据时设置绝对秒数。第一版建议以参考基线方式验收: - [ ] 同一批次只初始化一次模型; - [ ] 纯电子 PDF 不产生模型初始化耗时; - [ ] 批量任务默认串行,不出现无控制的多进程; - [ ] Benchmark 可分离模型初始化、推理和导出耗时; - [ ] CPU/GPU 结果均记录完整硬件与参数信息; - [ ] 连续处理大批量文件时内存无持续明显增长。 --- ## 17. 工作量预估 在复用参考项目工程逻辑、且第一阶段不增加表格结构识别和复杂版面分析的前提下,建议工作量如下: | 阶段 | 预估 | |---|---:| | 工程骨架和 CPU/GPU 环境 | 0.5~1 人日 | | PP-OCRv6 运行时和单图结果适配 | 1~1.5 人日 | | 图片输出、Benchmark、批处理 | 0.5~1 人日 | | PDF 混合模式和断点续传适配 | 1~1.5 人日 | | 自动化测试 | 1~1.5 人日 | | GPU 实机验证、性能调优和文档 | 0.5~1 人日 | | **合计** | **4.5~7.5 人日** | 如果增加以下能力,需单独评估: - 表格结构识别; - 多栏阅读顺序恢复; - PP-Structure 集成; - HTTP API/队列服务; - 多 GPU 调度; - TensorRT/HPI 加速; - 离线模型打包和安装程序。 --- ## 18. 推荐决策 推荐采用以下决策: 1. **确认立项**:PP-OCRv6 可满足通用本地文字识别需求; 2. **复用工程骨架,不机械复制模型输出代码**; 3. **新增统一结果适配层**,隔离 PaddleOCR 原始结果; 4. **第一阶段聚焦 TXT、简单 Markdown、JSON、坐标和置信度**; 5. **保留 PDF 混合模式**,这是参考项目中最有价值且与模型无关的能力; 6. **支持 `tiny`、`small`、`medium` 三种模型规格,默认使用 `PP-OCRv6_medium_det + PP-OCRv6_medium_rec`**; 7. **默认中文模式、开启方向分类、关闭文档去畸变**,后续根据 Benchmark 调整; 8. **GPU 必须实机验收,不声明未经验证的性能结论**; 9. **将版面分析和表格结构识别作为独立增强阶段**,避免基础 OCR 项目范围失控。 最终判断: > 以 `../ocr-VL1.6` 为工程参考,建设 PP-OCRv6 图片、PDF 和批量本地 OCR 项目,在技术和工程上均可行;主要改造点集中在模型初始化、结果适配、输出生成和统计指标。只要接受 PP-OCRv6 不等价于 PaddleOCR-VL 文档解析能力这一边界,方案风险可控,且预期具有更低资源消耗和更好的通用 OCR 吞吐能力。