PaddleOCR全版本完整指南:从入门到精通,全面解析安装部署与高级应用
@TOC
OCR 的全称是光学字符识别,是一种将图像中的文字(无论是打印体、手写体还是场景文字)自动识别并转换为可编辑、可搜索的文本数据(如TXT、Word、Excel格式)的技术。
第一部分:安装与环境配置
1. 环境准备
推荐使用Python 3.11。你可以使用Anaconda或Miniconda创建一个独立的虚拟环境,这能有效避免不同项目间的包冲突。
1 | |
2. 安装PaddlePaddle深度学习框架
这是PaddleOCR运行的基础。你需要根据电脑是否有NVIDIA显卡,选择安装CPU版本或GPU版本。
CPU版本(通用,适合所有电脑):
1
python -m pip install paddlepaddle==3.2.2 -i https://www.paddlepaddle.org.cn/packages/stable/cpu/GPU版本(速度快,需要有NVIDIA显卡和CUDA工具包):
安装命令会根据你的CUDA版本有所不同。例如,对于CUDA 12.6,你可以使用:1
python -m pip install paddlepaddle-gpu==3.2.2 -i https://www.paddlepaddle.org.cn/packages/stable/cu126/更详细的版本匹配信息,建议查阅PaddlePaddle官方安装文档。
3. 安装PaddleOCR库
安装好框架后,就可以安装PaddleOCR了。
1 | |
除了上面演示的 all 依赖组以外,PaddleOCR 也支持通过指定其它依赖组,安装部分可选功能。PaddleOCR 提供的所有依赖组如下:
| 依赖组名称 | 对应的功能 |
|---|---|
doc-parser |
文档解析,可用于提取文档中的表格、公式、印章、图片等版面元素,包含 PP-StructureV3 等模型方案 |
ie |
信息抽取,可用于从文档中提取关键信息,如姓名、日期、地址、金额等,包含 PP-ChatOCRv4 等模型方案 |
trans |
文档翻译,可用于将文档从一种语言翻译为另一种语言,包含 PP-DocTranslation 等模型方案 |
all |
完整功能 |
更详细的版本匹配信息,建议查阅安装 - PaddleOCR 文档。
4. 验证安装与初步使用
1 | |
如果程序没有报错,并打印出了识别出的文字及其在图片中的位置坐标和置信度,说明安装成功!
1 | |
5. 常见问题
Windows系统用户名为中文时,下载模型会报错,需要用户名为英文
1 | |
手动下载模型
在一些生产环境或无法自动下载的情况下,您可以手动准备模型:
- 获取模型文件:从PaddleOCR的官方渠道下载所需的推理模型文件。这些文件通常是压缩包。
- 解压模型:将下载的压缩包解压到一个您选定的文件夹中。
- 配置路径:在自定义的YAML配置文件中,将对应模型的
model_dir设置指向这个解压后的文件夹路径。
第二部分:PPStructureV3文档解析
PP-StructureV3 能够将文档图像和 PDF 文件高效转换为结构化内容(如 Markdown 格式),并具备版面区域检测、表格识别、公式识别、图表理解以及多栏阅读顺序恢复等强大功能。
1. PPStructureV3快速开始
1 | |
2. PPStructureV3参数详解
| 参数分类 | 参数名称 | 功能与默认值 | 什么时候需要调整 |
|---|---|---|---|
| 核心功能开关 | use_doc_orientation_classify |
是否启用整图方向分类。默认值:False。自动检测并纠正0/90/180/270度旋转的文档。 |
处理手机拍摄或扫描仪产生的方向不正确的文档图片时,设为 True。 |
use_doc_unwarping |
是否启用文档曲面展平。默认值:False。对弯曲的书页、卷曲的纸张进行平整化处理。 |
需要处理弯曲书页或纸张时开启;对于屏幕截图或平整的发票等文档,保持 False 以避免不必要的性能开销。 |
|
use_textline_orientation |
是否启用文本行方向分类。默认值:True。检测并纠正单行文本中上下颠倒的文字。 |
如果确认处理的图片中基本没有上下颠倒的文字,可设为 False 以提升约10%的处理速度。 |
|
| 模型与配置路径 | paddlex_config |
指定自定义配置文件的路径。默认值:无。 使用你自己导出并修改的YAML配置文件来初始化模型。 |
当你进行了自定义模型训练或需要完全离线部署,希望加载本地模型时使用。 |
text_detection_model_dirtext_recognition_model_dir |
指定文字检测/识别模型的本地目录路径。默认值:None。 |
离线部署或使用自己训练的模型时,必须指定为包含模型文件(如 model.pdmodel)的目录路径。 |
|
| 性能与精度调优 | text_det_limit_side_len |
设置检测阶段输入图像长边的最大尺寸(像素)。默认值:960。 |
速度优先:可降低至 640;精度优先(尤其对大图或小字):可提高到 1316 或更高。 |
text_recognition_batch_size |
识别阶段的批处理大小。默认值:6。 |
GPU显存充足(如RTX3060以上)可增大至 16 以提升吞吐量;使用CPU推理时建议设为 1-4。 |
|
text_det_threshtext_det_box_thresh |
控制文本检测的敏感度。前者是热力图阈值,后者是框置信度阈值。 | 漏检较多时,可适当降低阈值(如0.2);误检较多时,可适当提高阈值(如0.4)。 | |
text_det_unclip_ratio |
控制检测框的外扩程度。默认值:1.5。 |
发现文字被截断时,可增大至 1.8;发现文本框过大包含过多背景时,可减小至 1.3。 |
3. 模型文件管理
默认存储路径:首次运行,模型文件默认会下载并保存在
$HOME/.paddleocr/目录下(例如,在Windows系统中,通常是C:\Users\[您的用户名]\.paddleocr\)。指定其他路径:如果您希望通过自定义配置文件来指定模型的存放位置,可以按照以下步骤操作:
导出默认配置:首先,运行一段Python代码,将默认的配置导出为一个YAML文件。
1
2
3from paddleocr import PPStructureV3
ocr = PPStructureV3()
ocr.export_paddlex_config_to_yaml("PPStructureV3_test_config.yaml")修改模型路径:用文本编辑器打开导出的
PPStructureV3_test_config.yaml文件,找到各个模块(如文本检测、文本识别、版面分析等)配置项下的model_dir字段,将其值修改为您希望存放模型的本地目录路径。使用新配置:在初始化PPStructureV3时,通过参数加载您修改后的配置文件。
1
ocr_pipeline = PPStructureV3(paddlex_config="./PPStructureV3_test_config.yaml")
4. PPStructureV3配置文件详解
1 | |
全局配置参数
1 | |
子模块配置 (SubModules)
1. ChartRecognition (图表识别)
1 | |
2. LayoutDetection (版面检测)
1 | |
3. RegionDetection (区域检测)
1 | |
子管道配置 (SubPipelines)
1. DocPreprocessor (文档预处理)
1 | |
2. GeneralOCR (通用OCR)
1 | |
3. TableRecognition (表格识别)
1 | |
4. FormulaRecognition (公式识别)
1 | |
5. SealRecognition (印章识别)
1 | |
第三部分:PaddleOCR-VL多模态文档解析
1. PaddleOCR-VL简介
百度飞桨在2025年下半年推出的一个多模态文档智能解析模型,它在传统的文字识别(OCR)基础上,融合了视觉与语言模型的理解能力,能同时处理文本、表格、公式和图表等多种元素。
| 模型名称 | 发布机构/团队 | 参数规模 | 核心特点 | 主要应用场景 |
|---|---|---|---|---|
| PaddleOCR-VL | 百度 | 0.9B | 两阶段处理,先分析版面布局再识别内容;在权威评测中综合性能领先 | 复杂排版的文档解析、多语言文本识别、表格和公式提取 |
| DeepSeek-OCR | DeepSeek | 约3B (MoE架构) | 创新的视觉压缩技术,将图像信息高效压缩为少量视觉Token,处理长文档效率高 | 长文档、书籍的高效处理;为大型模型准备训练数据 |
| Qwen2.5-VL | 阿里巴巴 | 3B/7B/72B | 通用型视觉语言模型,能力均衡,支持长视频理解、视觉智能体操控等复杂任务 | 视觉问答、图文理解、结构化数据输出、智能体应用 |
PaddleOCR-VL的核心技术:两阶段处理流程
PaddleOCR-VL的卓越表现,很大程度上归功于其巧妙的两阶段处理流程。这让它在参数量不大的情况下,实现了极高的准确率。
第一阶段:专业化版面分析
- 首先,一个名为PP-DocLayoutV2的专用视觉模型会像”侦察兵”一样快速扫描整个文档图像。
- 它的任务非常纯粹:进行布局检测,将文档中不同属性的区域(如标题、正文、表格、公式、图片)用框标出来,并确定符合人类习惯的阅读顺序。
第二阶段:分而治之的结构化识别
- 接着,核心的PaddleOCR-VL模型(0.9B参数)才登场。但它面对的已经不是复杂的整张A4纸,而是上一阶段裁剪好的、一个个被标注了类型的小图片。
- 它的任务也变得非常专注:根据图片类型进行识别。例如,收到”表格”小图,就把它转成Markdown;收到”公式”小图,就把它转成LaTeX。这种”分而治之”的策略,极大地降低了模型的理解难度。
2. PaddleOCR-VL安装与使用
请注意安装 3.2.1 及以上版本的飞桨框架,同时安装特殊版本的 safetensors。
下载:https://xly-devops.cdn.bcebos.com/safetensors-nightly/safetensors-0.6.2.dev0-cp38-abi3-win_amd64.whl
PaddleOCR-VL推理代码如下:
1 | |
如果是 PDF 文件,会将 PDF 的每一页单独处理,每一页的 Markdown 文件也会对应单独的结果。如果希望整个 PDF 文件转换为 Markdown 文件,建议使用以下的方式运行:
1 | |
在上述 Python 脚本中,执行了如下几个步骤:
3. PaddleOCR-VL配置文件详解
1 | |
🏗️ 整体架构概览
1 | |
🔍 核心子模块配置 (SubModules)
1. LayoutDetection (版面检测 - 第一阶段)
这是PaddleOCR-VL两阶段流程中的第一阶段,负责文档结构的初步分析。
1 | |
版面类别与阈值配置:
- 25个语义类别:相比PPStructureV3的20类,新增了5个更细粒度的文档元素类别
- 智能阈值策略:不同类别使用不同检测阈值
- 大部分文本区域:
0.5(较高置信度) - 复杂元素(类别5,6,15,17,22,23):
0.4(稍低阈值,避免漏检) - 特殊元素(类别20):
0.45(中间阈值)
- 大部分文本区域:
边界框合并策略:
1 | |
- union模式:合并重叠区域,适合文本类连续内容
- large模式:保留最大边界框,确保特殊元素(表格、公式等)的完整性
2. VLRecognition (视觉语言识别 - 第二阶段)
这是PaddleOCR-VL的核心模块,负责基于版面分析结果进行精细化内容识别。
1 | |
关键特点:
- 专用模型路径:明确指向PaddleOCR-VL模型目录
- 超大batch_size:
4096说明VL模型在处理裁剪后的小图时极其高效 - 原生推理:优化过的推理后端,确保最佳性能
⚙️ 预处理管道配置 (SubPipelines)
DocPreprocessor (文档预处理)
虽然全局关闭(use_doc_preprocessor: false),但配置中保留了完整的预处理能力:
1 | |
4.PaddleOCR-VL API
在线API参考:https://ai.baidu.com/ai-doc/AISTUDIO/2mh4okm66
1 | |
5.PaddleOCRVL 的所有参数
# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from .._utils.cli import (
add_simple_inference_args,
get_subcommand_args,
perform_simple_inference,
str2bool,
)
from .base import PaddleXPipelineWrapper, PipelineCLISubcommandExecutor
from .utils import create_config_from_structure
_SUPPORTED_VL_BACKENDS = ["native", "vllm-server", "sglang-server", "fastdeploy-server"]
class PaddleOCRVL(PaddleXPipelineWrapper):
def __init__(
self,
layout_detection_model_name=None,
layout_detection_model_dir=None,
layout_threshold=None,
layout_nms=None,
layout_unclip_ratio=None,
layout_merge_bboxes_mode=None,
vl_rec_model_name=None,
vl_rec_model_dir=None,
vl_rec_backend=None,
vl_rec_server_url=None,
vl_rec_max_concurrency=None,
doc_orientation_classify_model_name=None,
doc_orientation_classify_model_dir=None,
doc_unwarping_model_name=None,
doc_unwarping_model_dir=None,
use_doc_orientation_classify=None,
use_doc_unwarping=None,
use_layout_detection=None,
use_chart_recognition=None,
format_block_content=None,
**kwargs,
):
if vl_rec_backend is not None and vl_rec_backend not in _SUPPORTED_VL_BACKENDS:
raise ValueError(
f"Invalid backend for the VL recognition module: {vl_rec_backend}. Supported values are {_SUPPORTED_VL_BACKENDS}."
)
params = locals().copy()
params.pop("self")
params.pop("kwargs")
self._params = params
super().__init__(**kwargs)
@property
def _paddlex_pipeline_name(self):
return "PaddleOCR-VL"
def predict_iter(
self,
input,
*,
use_doc_orientation_classify=None,
use_doc_unwarping=None,
use_layout_detection=None,
use_chart_recognition=None,
layout_threshold=None,
layout_nms=None,
layout_unclip_ratio=None,
layout_merge_bboxes_mode=None,
use_queues=None,
prompt_label=None,
format_block_content=None,
repetition_penalty=None,
temperature=None,
top_p=None,
min_pixels=None,
max_pixels=None,
**kwargs,
):
return self.paddlex_pipeline.predict(
input,
use_doc_orientation_classify=use_doc_orientation_classify,
use_doc_unwarping=use_doc_unwarping,
use_layout_detection=use_layout_detection,
use_chart_recognition=use_chart_recognition,
layout_threshold=layout_threshold,
layout_nms=layout_nms,
layout_unclip_ratio=layout_unclip_ratio,
layout_merge_bboxes_mode=layout_merge_bboxes_mode,
use_queues=use_queues,
prompt_label=prompt_label,
format_block_content=format_block_content,
repetiti