最好用的图文识别OCR -- PaddleOCR(2) 提高推理效率(PPOCR模型转ONNX模型进行推理)

在实际推理过程中,使用 PaddleOCR 模型时效率较慢,经测试每张图片的检测与识别平均耗时超过 5 秒,这在需要大规模自动化处理的场景中无法满足需求。为此,我尝试将 PaddleOCR 模型转换为 ONNX 格式进行推理,以提升效率。以下是模型转换与使用的完整过程记录。


基于项目

本次转换基于 GitHub 上的 OnnxOCR 项目,仓库地址如下:
https://github.com/jingsongliujing/OnnxOCR

项目的介绍图如下:

优化后的代码参考: https://github.com/CKboss/pp_onnx

本文使用到的模型转换工具: Paddle2ONNX


1. 环境准备

1.1 安装必要工具和依赖:

bash 复制代码
pip install paddle2onnx
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt

1.2 下载模型与相关资源:

PaddleOCR官方模型列表:https://paddlepaddle.github.io/PaddleOCR/latest/ppocr/model_list.html

以下为本文用到的模型及其下载地址:

分别下载并解压上面的模型列表 & 字典文件 & 中文字体 留作备用

1.3 配置PaddleOCR的运行环境

参考上一篇文章中的 PaddleOCR 高精度版本 配置:
最好用的图文识别OCR -- PaddleOCR(1) 快速集成


2. 模型转换

下载 OnnxOCR 项目代码:

bash 复制代码
git clone https://github.com/jingsongliujing/OnnxOCR.git

转换 PaddleOCR 模型为 ONNX:

使用之前下载好的模型文件开始进行模型转换,以下命令用于将 PaddleOCR 的检测、识别和方向分类模型分别转换为 ONNX 格式。

bash 复制代码
# 检测模型转换
paddle2onnx --model_dir ./ch_PP-OCRv4_det_server_infer \
             --model_filename inference.pdmodel \
             --params_filename inference.pdiparams \
             --save_file ./ch_PP-OCRv4_server_det.onnx \
             --opset_version 11 --enable_onnx_checker True

# 识别模型转换
paddle2onnx --model_dir ./ch_PP-OCRv4_rec_server_infer \
             --model_filename inference.pdmodel \
             --params_filename inference.pdiparams \
             --save_file ./ch_PP-OCRv4_server_rec.onnx \
             --opset_version 11 --enable_onnx_checker True

# 方向分类模型转换
paddle2onnx --model_dir ./ch_ppocr_mobile_v2.0_cls_infer \
             --model_filename inference.pdmodel \
             --params_filename inference.pdiparams \
             --save_file ./ch_ppocr_mobile_v2.0_cls.onnx \
             --opset_version 11 --enable_onnx_checker True

模型文件的最终存放结构如下:


3. 转换后效果测试

测试图片示例:
使用 PaddleOCR 模型进行推理:

以下代码演示 PaddleOCR 的推理流程:

python 复制代码
from paddlex import create_pipeline
import cv2
import time

time1 = time.time()
pipeline = create_pipeline(pipeline="../OCR.yaml",device='cpu')

image = cv2.imread("../tb-img/img9.webp")
output = pipeline.predict(image)
time_count = time.time() - time1

for res in output:
    print(res.get("rec_text"),res.get("dt_scores"))
print(f'------------------------ 总花费时间: {time_count} 秒----------------------')
使用转换后的 ONNX 模型进行推理:

以下代码演示 ONNX 模型的推理流程:

python 复制代码
import cv2
import time
from onnxocr.onnx_paddleocr import ONNXPaddleOcr,sav2Img
from pathlib import Path

# 获取当前文件所在的目录
module_dir = Path(__file__).resolve().parent
ch_model = {
    "det_model_dir": f'{module_dir}/onnxocr/models/ppocrv4/det/ch/ch_PP-OCRv4_server_det.onnx',
    "rec_model_dir": f'{module_dir}/onnxocr/models/ppocrv4/rec/ch/ch_PP-OCRv4_server_rec.onnx',
    "cls_model_dir": f'{module_dir}/onnxocr/models/ppocrv4/cls/ch_ppocr_mobile_v2.0_cls.onnx',
    "rec_char_dict_path": f'{module_dir}/onnxocr/models/ppocrv4/rec_char_dict/ppocr_keys_v1.txt',
    "vis_font_path":f'{module_dir}/onnxocr/fonts/simfang.ttf'
}

time1 = time.time()

model = ONNXPaddleOcr(
    use_angle_cls=True, 
    use_gpu=False,
    det_model_dir=ch_model["det_model_dir"],
    rec_model_dir=ch_model["rec_model_dir"],
    cls_model_dir=ch_model["cls_model_dir"],
    rec_char_dict_path=ch_model["rec_char_dict_path"],
    vis_font_path=ch_model["vis_font_path"],
    drop_score=0.1,
    )

resized_img = cv2.imread("../tb-img/img9.webp")
# 调整尺寸
# resized_img = cv2.resize(resized_img, (960, 960))
result = model.ocr(resized_img)
time_count = time.time() - time1

for res in result[0]:
    print(res[1][0],res[1][1])
print(f'------------------------ 总花费时间: {time_count} 秒----------------------')

结论

通过将 PaddleOCR 模型转换为 ONNX 格式,可以显著提升推理速度。测试显示,在相同硬件环境下,ONNX 模型推理效率更高,适合大规模自动化处理场景。

相关推荐
思则变2 小时前
[Pytest] [Part 2]增加 log功能
开发语言·python·pytest
漫谈网络3 小时前
WebSocket 在前后端的完整使用流程
javascript·python·websocket
try2find4 小时前
安装llama-cpp-python踩坑记
开发语言·python·llama
博观而约取5 小时前
Django ORM 1. 创建模型(Model)
数据库·python·django
精灵vector7 小时前
构建专家级SQL Agent交互
python·aigc·ai编程
Zonda要好好学习7 小时前
Python入门Day2
开发语言·python
Vertira7 小时前
pdf 合并 python实现(已解决)
前端·python·pdf
太凉7 小时前
Python之 sorted() 函数的基本语法
python
项目題供诗7 小时前
黑马python(二十四)
开发语言·python
晓13138 小时前
OpenCV篇——项目(二)OCR文档扫描
人工智能·python·opencv·pycharm·ocr