基于 PaddleOCR 的文本检测识别实战指南:快速部署与代码实现

10 阅读4分钟

本文提供了完整的 PaddleOCR 文字检测识别实现,专注于模型快速下载部署和即用型代码实现。

一、基础介绍

PaddleOCR 是百度飞桨(PaddlePaddle)开源的超轻量、高性能光学字符识别(OCR)工具库,核心作用是把图像 / 视频中的文字内容转换成可编辑的文本,是目前国内使用广泛、对中文支持极佳的 OCR 解决方案,特别适合新手快速上手。

1.1 算法识别流程

PaddleOCR 的识别过程主要分为三步:

文本检测(Det):找到图像中文字的位置(用矩形框标出文字区域); 文本方向分类(Cls):识别文字的旋转方向(如 0°、90°、180°),修正倾斜 / 倒序文本; 文本识别(Rec):把检测到的文字区域转换成具体的字符内容(如 “2026-01-09 10:00”)。 PaddleOCR 是百度开源的高性能 OCR 工具库,对中文支持极佳,新手易上手;支持 CPU/GPU 推理、多场景适配,还能自定义训练,兼顾易用性和灵活性。

二、环境安装

首先确认电脑已安装Python 环境(推荐 3.7~3.10 版本,过高版本可能兼容问题),可以通过终端 / 命令行输入 python --version 查看版本。

2.1 基础安装(CPU 版)

安装 PaddlePaddle 核心库 打开终端 / 命令提示符,执行对应系统的命令:

Windows/Linux/Mac通用(CPU版)

python -m pip install paddlepaddle -i pypi.tuna.tsinghua.edu.cn/simple

(使用清华镜像源,下载速度更快)

安装 PaddleOCR 库 接着执行:

pip install paddleocr -i pypi.tuna.tsinghua.edu.cn/simple

这一步会自动安装 PaddleOCR 及其依赖(如 OpenCV、numpy 等)。

2.2 GPU 版安装(高性能需求)

如果电脑有 NVIDIA 显卡,提升识别速度,需要先配置 CUDA 环境(步骤略过): 检查显卡兼容性:确认显卡支持 CUDA(可在 NVIDIA 官网查询);

安装 GPU 版 PaddlePaddle:

以CUDA 11.2为例

python -m pip install paddlepaddle-gpu==2.5.2.post112 -f www.paddlepaddle.org.cn/whl/windows…

2.3 验证安装是否成功

安装完成后,执行以下简单代码验证:

from paddleocr import PaddleOCR

初始化OCR(默认CPU,use_gpu=True则启用GPU)

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

识别示例图片(会自动下载模型,首次运行稍慢)

result = ocr.ocr('paddleocr.bj.bcebos.com/PP-OCRv4/im…', cls=True)

打印识别结果

for line in result[0]: print("识别文本:", line[1][0])

代码运行结束后,会在当前目录下自动生成文件夹./PP-OCRv4

三、PaddleOCR 核心参数调试

import os import cv2 import numpy as np from paddleocr import PaddleOCR from PIL import Image, ImageDraw, ImageFont

class PaddleOCRDetector: def init(self, use_gpu=True): """ 初始化PaddleOCR检测器 :param use_gpu: 是否使用GPU推理 """ # 适配1920x1080分辨率的参数优化 self.ocr = PaddleOCR( use_angle_cls=True, # 启用文字方向分类(解决文本旋转问题) lang='ch', # 识别语言为中文(含数字/英文) use_gpu=use_gpu,
show_log=False, det_model_dir='./PP-OCRv4/ch_PP-OCRv4_det_server_infer/', rec_model_dir='./PP-OCRv4/ch_PP-OCRv4_rec_server_infer/', cls_model_dir='./PP-OCRv4/ch_ppocr_mobile_v2.0_cls_infer/',

        # 适配1920x1080分辨率的尺寸参数
        det_limit_side_len=1920,     # 匹配图像最大边1920像素
        det_limit_type='max',        # 按最大边缩放
        
        # 检测参数优化(适配时间水印这类小文本)
        det_db_thresh=0.15,          # 更低阈值检测小文本
        det_db_box_thresh=0.15,      # 降低框阈值保留更多候选框
        det_db_unclip_ratio=2.0,     # 适度扩展文本框(适配水印长文本)
        det_db_score_mode='fast',
        use_dilation=True,           # 启用膨胀处理(修复原注释错误,增强小文本检测)
        
        # 识别参数优化(提升时间水印识别精度)
        rec_image_shape='3, 48, 480',
        drop_score=0.5,              # 适度降低置信度(避免水印文本被过滤)
        rec_batch_num=2,             # 减小批次提升小文本识别精度
        rec_algorithm='SVTR_LCNet',
        
        # 分类参数
        cls_batch_num=2,
        cls_thresh=0.85,             # 降低分类阈值(适配水印文本)
        
        # 性能参数
        max_batch_size=4,
        cpu_threads=12,
        gpu_mem=2000,
    )

def inference(self, img_input):
    """
    推理函数:输入图像路径/数组,返回OCR识别结果
    :param img_input: 图像路径(str)或cv2读取的numpy数组
    :return: 原始OCR结果(列表),识别的文本拼接字符串
    """
    try:
        # 处理图像输入
        if isinstance(img_input, str):
            if not os.path.exists(img_input):
                raise FileNotFoundError(f"图片文件 {img_input} 不存在!")
            img = cv2.imread(img_input)
            raw_result = self.ocr.ocr(img, cls=True)
        elif isinstance(img_input, np.ndarray):
            if len(img_input.shape) != 3:
                raise ValueError("图像数组必须是3D(彩色)格式")
            img = img_input.copy()
            rgb_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
            raw_result = self.ocr.ocr(rgb_img, cls=True)
        else:
            raise ValueError("输入必须是图像文件路径(str)或图像数组(numpy.ndarray)")

        # 提取识别的文本(过滤空结果)
        ocr_texts = []
        if raw_result and len(raw_result) > 0 and raw_result[0] is not None:
            for line in raw_result[0]:
                text = line[1][0].strip()  # 提取文本内容
                score = line[1][1]         # 提取置信度
                if text and score > 0.1:   # 过滤空文本和极低置信度结果
                    ocr_texts.append(text)
        return ocr_texts
    except Exception as e:
        raise Exception(f"OCR识别过程中出现错误: {e}")