跳转至

第二章:PaddleOCR 入门

PaddleOCR 简介

PaddleOCR 是百度开源的 OCR 工具箱,基于 PaddlePaddle 深度学习框架。它提供了丰富的 OCR 功能,包括:

  • 文本检测:定位图像中的文字区域
  • 文本识别:识别文字内容
  • 方向分类:自动识别文本方向
  • 表格识别:提取表格结构

安装 PaddleOCR

安装 PaddlePaddle

# CPU 版本
pip install paddlepaddle

# GPU 版本(需要 CUDA 环境)
pip install paddlepaddle-gpu

安装 PaddleOCR

pip install paddleocr

验证安装

from paddleocr import PaddleOCR

# 首次运行会自动下载模型
ocr = PaddleOCR(use_angle_cls=True, lang='ch')

快速开始

基本用法

from paddleocr import PaddleOCR
from PIL import Image

# 初始化 OCR(启用方向分类,支持中文)
ocr = PaddleOCR(use_angle_cls=True, lang='ch', show_log=False)

# 识别单张图片
result = ocr.ocr('invoice.jpg', cls=True)

# 打印结果
for line in result[0]:
    print(f"文本: {line[1][0]}, 置信度: {line[1][1]:.2f}")

批量处理

import os
from paddleocr import PaddleOCR

ocr = PaddleOCR(use_angle_cls=True, lang='ch')

# 批量识别目录中的所有图片
image_dir = './images'
for image_file in os.listdir(image_dir):
    if image_file.lower().endswith(('.png', '.jpg', '.jpeg')):
        image_path = os.path.join(image_dir, image_file)
        result = ocr.ocr(image_path, cls=True)
        print(f"文件: {image_file}")
        for line in result[0]:
            print(f"  - {line[1][0]}")

识别表格

from paddleocr import PaddleOCR, draw_ocr

# 初始化(支持表格识别)
ocr = PaddleOCR(use_angle_cls=True, lang='ch', table=True)

# 识别表格
result = ocr.ocr('table.jpg', cls=True, table=True)

# 表格结果在 result[1] 中
if result[1]:
    print("检测到表格:")
    for table in result[1]:
        print(table)

核心 API

PaddleOCR 类

PaddleOCR(
    use_angle_cls=True,      # 是否启用方向分类
    lang='ch',               # 语言: ch, en, korean, japan
    det=True,                # 是否启用文本检测
    rec=True,                # 是否启用文本识别
    cls=True,                # 是否启用方向分类
    show_log=True,           # 是否显示日志
    table=False,             # 是否启用表格识别
    ocr_version='PP-OCRv4',  # OCR 版本
    use_gpu=False            # 是否使用 GPU
)

返回结果格式

# result 结构
[
    # 页面结果列表
    [
        # 行结果列表
        [
            # 每行的边界框坐标
            [[x1, y1], [x2, y1], [x2, y2], [x1, y2]],
            # (识别文本, 置信度)
            ("文本内容", 0.95)
        ],
        ...
    ],
    # 表格结果(如果启用)
    [...]
]

高级用法

自定义模型

from paddleocr import PaddleOCR

# 使用自定义检测模型
ocr = PaddleOCR(
    use_angle_cls=True,
    lang='ch',
    det_model_dir='./custom_det_model',
    rec_model_dir='./custom_rec_model',
    rec_char_dict_path='./custom_dict.txt'
)

调整检测参数

# 调整文本检测的阈值
result = ocr.ocr(
    'image.jpg',
    det_db_thresh=0.3,      # 检测阈值,越低越敏感
    det_db_box_thresh=0.5,  # 边界框阈值
    det_db_unclip_ratio=1.5 # 文本框扩展比例
)

可视化结果

from paddleocr import PaddleOCR, draw_ocr
from PIL import Image
import cv2

# 识别
ocr = PaddleOCR(use_angle_cls=True, lang='ch')
result = ocr.ocr('image.jpg', cls=True)

# 绘制结果
image = cv2.imread('image.jpg')
image = draw_ocr(image, result[0], font_path='./fonts/simfang.ttf')

# 保存
cv2.imwrite('result.jpg', image)

性能优化

使用 GPU

# 使用 GPU 加速
ocr = PaddleOCR(use_angle_cls=True, lang='ch', use_gpu=True)

批量识别

# 批量识别多张图片
images = ['img1.jpg', 'img2.jpg', 'img3.jpg']
results = [ocr.ocr(img, cls=True) for img in images]

启用 FP16 加速

# 使用 FP16 加速(需要 GPU)
ocr = PaddleOCR(use_angle_cls=True, lang='ch', use_fp16=True)

常见问题

1. 模型下载失败

# 手动下载模型
# PP-OCRv4 模型地址: https://github.com/PaddlePaddle/PaddleOCR/tree/release/2.7

2. 内存占用过高

# 使用轻量级模型
ocr = PaddleOCR(
    use_angle_cls=True,
    lang='ch',
    det_model_dir='./ch_PP-OCRv3_det_infer',
    rec_model_dir='./ch_PP-OCRv3_rec_infer'
)

3. 识别效果不佳

  • 调整图像预处理(去噪、增强对比度)
  • 使用专业领域的字典
  • 考虑使用后处理校正

完整示例

#!/usr/bin/env python3
"""PaddleOCR 完整示例"""

from paddleocr import PaddleOCR
import os

def main():
    # 初始化 OCR
    ocr = PaddleOCR(
        use_angle_cls=True,
        lang='ch',
        show_log=False,
        det_db_thresh=0.3,
        det_db_box_thresh=0.5
    )

    # 识别图片
    image_path = 'document.jpg'
    if not os.path.exists(image_path):
        print(f"图片不存在: {image_path}")
        return

    result = ocr.ocr(image_path, cls=True)

    # 输出结果
    print("识别结果:")
    print("-" * 50)
    for line in result[0]:
        text = line[1][0]
        confidence = line[1][1]
        print(f"{text:30s} | 置信度: {confidence:.2f}")

if __name__ == '__main__':
    main()

下一步

下一章我们将学习 Tesseract OCR 的使用。