本文提供了完整的 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}")