在 `PaddleOCR` 中配置自定义模型(如自己训练的检测/识别模型)
在 PaddleOCR 中配置自定义模型(如自己训练的检测/识别模型),需要明确模型路径、确保文件完整,并在初始化时通过参数指定。以下是详细步骤:
一、准备自定义模型文件
自定义模型需包含 PaddleOCR 要求的完整文件结构,否则会加载失败。具体要求:
1. 模型文件组成(每个模型都需要)
-
检测模型(如文本定位):
文件夹内必须包含:inference.pdmodel(模型结构文件)inference.pdiparams(模型参数文件)inference.yml(模型配置文件,记录输入尺寸、预处理方式等)
-
识别模型(如文本内容识别):
文件夹内文件同上(3个核心文件)。 -
方向分类器模型(可选,用于判断文本方向):
文件夹内文件同上。
2. 示例目录结构
假设你的自定义模型放在项目的 models 文件夹下,结构如下:
project/
├── models/
│ ├── det_model/ # 自定义检测模型
│ │ ├── inference.pdmodel
│ │ ├── inference.pdiparams
│ │ └── inference.yml
│ └── rec_model/ # 自定义识别模型
│ ├── inference.pdmodel
│ ├── inference.pdiparams
│ └── inference.yml
└── your_script.py # 你的Python脚本
二、在代码中配置自定义模型
通过 PaddleOCR 初始化时的参数,指定自定义模型的路径。核心参数:
det_model_dir:自定义检测模型文件夹路径rec_model_dir:自定义识别模型文件夹路径cls_model_dir:自定义方向分类器模型文件夹路径(若启用)
示例代码
from paddleocr import PaddleOCR# 配置自定义模型路径(绝对路径或相对路径均可)
det_model_path = "./models/det_model/" # 检测模型文件夹
rec_model_path = "./models/rec_model/" # 识别模型文件夹# 初始化OCR,指定自定义模型
ocr = PaddleOCR(# 检测模型配置det_model_dir=det_model_path,# 识别模型配置rec_model_dir=rec_model_path,# 若有自定义分类器,添加以下参数# cls_model_dir="./models/cls_model/",# 其他必要参数use_angle_cls=True, # 启用方向检测(若用分类器)lang="ch", # 语言类型(需与模型训练语言一致)show_log=False # 关闭日志(可选)
)# 使用自定义模型识别图片
img_path = "test_receipt.jpg" # 待识别图片
result = ocr.ocr(img_path, cls=True) # cls=True 启用方向分类# 打印识别结果
for line in result:text = line[1][0] # 文本内容score = line[1][1] # 置信度print(f"识别结果:{text},置信度:{score:.2f}")
三、关键注意事项
-
路径正确性
- 确保
det_model_dir/rec_model_dir指向的文件夹中,确实存在inference.pdmodel、inference.pdiparams、inference.yml三个文件。 - 路径中避免中文、空格或特殊字符(可能导致解析错误,建议用英文路径)。
- 相对路径是相对于脚本运行目录的,可通过
print(os.getcwd())查看当前目录,避免路径错误。
- 确保
-
模型与配置匹配
inference.yml中的配置(如输入图片尺寸、归一化参数)必须与模型训练时的设置一致,否则会导致识别精度骤降或报错。- 若自定义模型是基于
PaddleOCR官方代码训练的,导出推理模型时会自动生成inference.yml,无需手动修改。
-
语言类型匹配
lang参数需与自定义模型训练时的语言一致(如训练的是英文模型,lang="en";中文模型用lang="ch"),否则可能出现乱码。
-
混合使用自定义与默认模型
若只想替换其中一个模型(如用自定义检测模型+官方识别模型),只需指定对应参数,未指定的参数会自动使用默认模型:# 仅使用自定义检测模型,识别模型用官方默认 ocr = PaddleOCR(det_model_dir="./models/det_model/", rec_model_dir=None)
四、常见错误及解决
-
“No such file or directory: … inference.yml”
→ 原因:模型文件夹中缺少inference.yml,或路径错误。
→ 解决:重新下载/导出完整模型,核对路径是否正确。 -
“Model format error” 或识别结果乱码
→ 原因:模型文件损坏,或inference.yml配置与模型不匹配。
→ 解决:重新导出模型,确保训练和导出流程正确。 -
“Could not find xxx in the model”
→ 原因:模型类型与任务不匹配(如用识别模型当检测模型)。
→ 解决:确认det_model_dir放检测模型,rec_model_dir放识别模型。
通过以上步骤,即可在 PaddleOCR 中成功配置并使用自定义模型,实现个性化的文本检测与识别需求。
在 CPU 环境下使用 PaddleOCR 时,识别速度较慢是常见问题,主要受限于 CPU 计算能力和模型复杂度。以下是经过验证的优化方法,可显著提升速度(按效果优先级排序):
一、使用轻量级模型(最有效)
PaddleOCR 提供不同量级的模型,轻量版模型(Mobile 版)的速度远快于高精度版,适合 CPU 环境:
1. 切换为轻量版模型
默认情况下,PaddleOCR 可能使用轻量模型,但若手动指定了高精度模型,需切换:
from paddleocr import PaddleOCR# 明确使用轻量版模型(中文为例)
ocr = PaddleOCR(use_angle_cls=True,lang="ch",# 轻量版检测模型(默认):ch_PP-OCRv5_det_infer# 轻量版识别模型(默认):ch_PP-OCRv5_rec_infershow_log=False
)
- 轻量版模型(如
PP-OCRv5 Mobile)体积小、计算量低,CPU 上速度提升 2-3 倍。 - 高精度模型(如
PP-OCRv5 Server)适合 GPU,CPU 上会很慢,非必要不使用。
二、降低图片分辨率(性价比高)
大尺寸图片(如 4000x3000 像素)会显著增加计算量,缩小图片尺寸可大幅提升速度,且对文字较大的场景(如单据、文档)影响较小:
1. 代码中预处理图片
from paddleocr import PaddleOCR
from PIL import Image
import numpy as npdef resize_image(img_path, max_side_len=1024):"""将图片最长边缩放到 max_side_len,保持比例"""img = Image.open(img_path).convert("RGB")w, h = img.size# 计算缩放比例scale = max_side_len / max(w, h)if scale < 1:new_w, new_h = int(w * scale), int(h * scale)img = img.resize((new_w, new_h), Image.LANCZOS) # 高质量缩放return np.array(img)# 初始化 OCR
ocr = PaddleOCR(use_angle_cls=True, lang="ch", show_log=False)# 处理图片并识别
img = resize_image("receipt.jpg", max_side_len=1024) # 最长边不超过1024
result = ocr.ocr(img, cls=True)
- 推荐
max_side_len=800-1200(根据文字大小调整,文字越小,尺寸不宜过小)。 - 对比:4000x3000 图片缩放到 1000x750 后,速度可提升 3-5 倍。
三、关闭不必要的功能
1. 关闭方向分类器(cls=False)
若单据文本方向固定(如均为水平),可关闭方向检测(cls=False),减少一次模型推理:
ocr = PaddleOCR(use_angle_cls=False, lang="ch") # 关闭方向分类
result = ocr.ocr(img_path, cls=False) # 不执行方向检测
- 速度提升:约 10-20%(方向分类器占总耗时的一部分)。
- 注意:若文本可能倾斜(如手写单据),关闭后会降低识别准确率。
2. 减少识别候选框数量
通过检测模型参数限制文本框数量(适合文本稀疏的场景):
ocr = PaddleOCR(det_limit_side_len=1024, # 检测时图片最大边长(同 resize 效果)det_db_thresh=0.3, # 检测阈值(值越高,检测出的文本框越少)show_log=False
)
det_db_thresh调大(如 0.3→0.5),会过滤低置信度文本框,减少后续识别压力。
四、使用 ONNX 推理引擎(加速 20-50%)
PaddleOCR 支持 ONNX 格式模型,配合 onnxruntime 引擎,CPU 上速度比原生 Paddle 引擎更快:
1. 安装 ONNX 相关依赖
pip install onnxruntime paddle2onnx
2. 转换模型为 ONNX 格式(仅需一次)
from paddle2onnx import convert# 转换检测模型(以轻量版为例)
convert(model_dir="./ch_PP-OCRv5_det_infer", # 原 Paddle 模型目录save_file="./onnx/det_model.onnx",input_shape_dict={"x": [1, 3, -1, -1]}, # 动态输入尺寸opset_version=11
)# 转换识别模型
convert(model_dir="./ch_PP-OCRv5_rec_infer",save_file="./onnx/rec_model.onnx",input_shape_dict={"x": [1, 3, 48, -1]},opset_version=11
)
3. 使用 ONNX 引擎加载模型
from paddleocr import PaddleOCRocr = PaddleOCR(det_model_dir="./onnx/det_model.onnx", # ONNX 检测模型rec_model_dir="./onnx/rec_model.onnx", # ONNX 识别模型use_onnx=True, # 启用 ONNX 引擎show_log=False
)
- 优势:
onnxruntime对 CPU 优化更好(如支持 MKL-DNN 加速),尤其在多线程下效率更高。
五、启用多线程/多进程(批量处理时)
若需批量识别多张图片,使用多线程或进程池并行处理,充分利用 CPU 多核:
1. 多线程示例(适合 I/O 密集型场景)
import threading
from paddleocr import PaddleOCRocr = PaddleOCR(use_angle_cls=True, lang="ch", show_log=False)
img_list = ["img1.jpg", "img2.jpg", "img3.jpg"] # 批量图片
results = []def ocr_task(img_path):results.append(ocr.ocr(img_path, cls=True))# 启动多线程
threads = [threading.Thread(target=ocr_task, args=(img,)) for img in img_list]
for t in threads:t.start()
for t in threads:t.join()print(results) # 批量结果
- 注意:Python 多线程受 GIL 限制,CPU 密集型任务建议用
multiprocessing多进程。
六、其他细节优化
- 关闭日志输出:
show_log=False减少 I/O 耗时。 - 使用最新版本:
PaddleOCR和paddlepaddle不断优化 CPU 支持,更新到最新版(pip install -U paddleocr paddlepaddle)。 - 裁剪 ROI 区域:若只需识别单据中的特定区域(如编号所在位置),提前裁剪图片,减少无效区域计算。
效果总结
组合以上方法(轻量模型 + 图片缩放 + ONNX 引擎),CPU 环境下的识别速度可提升 3-10 倍,基本能满足日常单据处理需求。若仍不满足,可考虑升级到高性能 CPU(如 Intel i7/i9 或 AMD Ryzen),或在关键场景引入 GPU 加速。
