欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 社会 > 最好用的图文识别OCR -- PaddleOCR(2) 提高检测识别精度 推理效率(PPOCR模型转ONNX模型进行推理)

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

2025/1/12 7:10:59 来源:https://blog.csdn.net/qq_36228377/article/details/144898240  浏览:    关键词:最好用的图文识别OCR -- PaddleOCR(2) 提高检测识别精度 推理效率(PPOCR模型转ONNX模型进行推理)

提高检测识别精度 && 推理效率

    • 基于项目
    • 环境准备
    • 高效率版本
      • 1 下载模型与相关资源
      • 2. 模型转换
      • 3. 转换后效果测试
        • 测试图片示例:
        • 使用 PaddleOCR 模型进行推理:
        • 使用转换后的 ONNX 模型进行推理:
    • 高精度版本
      • 1 下载模型与相关资源
      • 2 配置`PaddleOCR`的运行环境
      • 3. 模型转换
      • 4. 转换后效果测试
        • 测试图片示例:
        • 使用 PaddleOCR 模型进行推理:
        • 使用转换后的 ONNX 模型进行推理:
    • 结果比对
    • 思考 & 优化
    • 总结


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


基于项目

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

项目的介绍图如下:
OnnxOCR 项目介绍

优化后的代码参考: https://github.com/CKboss/pp_onnx
本文使用到的模型转换工具: Paddle2ONNX


环境准备

  1. 安装必要工具和依赖
pip install paddlepaddle==3.0.0b2 -i https://www.paddlepaddle.org.cn/packages/stable/cpu/ \
&& pip install paddlex==3.0.0b2 \
&& pip install paddle2onnx \
&& pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt \
&& pip install onnx==1.17.0 \
&& pip install onnxruntime==1.20.1
# (或者安装GPU版本 pip install onnxruntime-gpu)
  1. PaddleOCR 官方模型列表
  • PaddleOCR提供的模型列表
    在这里插入图片描述

  • PaddleX提供的模型列表
    在这里插入图片描述

  • 本文下载的所有模型都为推理模型!!!
    在这里插入图片描述


高效率版本

1 下载模型与相关资源

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

以下为高效率版本用到的模型及其下载地址:

  • 中文检测模型:PP-OCRv4_mobile_det
    下载链接

  • 中文识别模型:PP-OCRv4_mobile_rec
    下载链接

  • 文本方向分类模型:ch_ppocr_mobile_v2.0_cls
    下载链接

  • 中文字典:ppocr_keys_v1
    下载链接

  • 中文字体:simfang.ttf
    下载链接

分别下载并解压上面的模型列表 留作备用

2. 模型转换

下载 OnnxOCR 项目代码:

git clone https://github.com/jingsongliujing/OnnxOCR.git

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

# 检测模型转换
paddle2onnx --model_dir ./PP-OCRv4_mobile_det_infer \--model_filename inference.pdmodel \--params_filename inference.pdiparams \--save_file ./det2.onnx \--opset_version 14 --enable_onnx_checker True# 识别模型转换
paddle2onnx --model_dir ./PP-OCRv4_mobile_rec_infer \--model_filename inference.pdmodel \--params_filename inference.pdiparams \--save_file ./rec2.onnx \--opset_version 14 --enable_onnx_checker True# 方向分类模型转换
paddle2onnx --model_dir ./ch_ppocr_mobile_v2.0_cls_infer \--model_filename inference.pdmodel \--params_filename inference.pdiparams \--save_file ./cls.onnx \--opset_version 14 --enable_onnx_checker True

模型文件的最终存放结构如下:
在这里插入图片描述


3. 转换后效果测试

测试图片示例:

测试图片

使用 PaddleOCR 模型进行推理:
  • 配置PaddleOCR的运行环境

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

  • 代码演示 PaddleOCR 的推理流程:

    from paddlex import create_pipeline
    import cv2
    import timetime1 = 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() - time1for res in output:dt_scores = res.get("dt_scores")rec_text = res.get("rec_text")for i in range(len(rec_text)):print(rec_text[i],dt_scores[i])res.save_to_img(f"./output.jpg")
    print(f'------------------------ 总花费时间: {time_count} 秒----------------------')
    
  • 推理结果和用时
    在这里插入图片描述

使用转换后的 ONNX 模型进行推理:
  • 代码演示 ONNX 模型的推理流程:

    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/det.onnx',"rec_model_dir": f'{module_dir}/onnxocr/models/ppocrv4/rec/ch/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")
    result = model.ocr(resized_img)
    time_count = time.time() - time1for res in result[0]:print(res[1][0],res[1][1])sav2Img(resized_img, result)
    print(f'------------------------ 总花费时间: {time_count} 秒----------------------')
    
  • 推理结果和用时
    在这里插入图片描述


高精度版本

1 下载模型与相关资源

在这里插入图片描述
在这里插入图片描述

以下为高精度版本的模型及其下载地址:

  • 中文检测模型:PP-OCRv4_server_det
    下载链接

  • 中文识别模型:PP-OCRv4_server_rec
    下载链接

  • 文本方向分类模型:ch_ppocr_mobile_v2.0_cls
    下载链接

  • 中文字典:ppocr_keys_v1
    下载链接

  • 中文字体:simfang.ttf
    下载链接

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

2 配置PaddleOCR的运行环境

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

3. 模型转换

下载 OnnxOCR 项目代码:

git clone https://github.com/jingsongliujing/OnnxOCR.git

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

# 检测模型转换
paddle2onnx --model_dir ./PP-OCRv4_server_det_infer \--model_filename inference.pdmodel \--params_filename inference.pdiparams \--save_file ./PP-OCRv4_server_det.onnx \--opset_version 14 --enable_onnx_checker True# 识别模型转换
paddle2onnx --model_dir ./PP-OCRv4_server_rec_infer \--model_filename inference.pdmodel \--params_filename inference.pdiparams \--save_file ./PP-OCRv4_server_rec.onnx \--opset_version 14 --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 14 --enable_onnx_checker True

模型文件的最终存放结构如下:
在这里插入图片描述


4. 转换后效果测试

测试图片示例:

测试图片

使用 PaddleOCR 模型进行推理:
  • 配置PaddleOCR的运行环境

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

  • 代码演示 PaddleOCR 的推理流程:

    from paddlex import create_pipeline
    import cv2
    import timetime1 = 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() - time1for res in output:print(res.get("rec_text"),res.get("dt_scores"))
    print(f'------------------------ 总花费时间: {time_count} 秒----------------------')
    
  • 推理结果和用时
    在这里插入图片描述

使用转换后的 ONNX 模型进行推理:

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

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/PP-OCRv4_server_det.onnx',"rec_model_dir": f'{module_dir}/onnxocr/models/ppocrv4/rec/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")
result = model.ocr(resized_img)
time_count = time.time() - time1for res in result[0]:print(res[1][0],res[1][1])
print(f'------------------------ 总花费时间: {time_count} 秒----------------------')
  • 推理结果和用时
    在这里插入图片描述

结果比对

  • 不同版本 识别准确度 & 用时 比对:

    用时 / s识别准确度
    Paddle高效率2.07一般
    ONNX高效率0.48较差
    Paddle高精度1.82精准
    ONNX高精度7.01精准
  • 高效率版本
    测试显示,在相同硬件环境下,通过将 PaddleOCR 高效率模型转换为 ONNX 格式,可以显著提升推理速度。但是精度缺有所损失。

  • 高精度版本
    测试显示,在相同硬件环境下,将 PaddleOCR 高效率模型转换为 ONNX 格式,最终的运行效率远不如PaddleOCR。


思考 & 优化

有没有一种办法即提高了识别的效率,同时又可以不会损失精准度呢?测试下来有一种办法,就是 使用PaddleOCR高效率版本转为ONNX -> 转变要识别图片的大小

优化后的代码如下:

import cv2
import time
from onnxocr.onnx_paddleocr import ONNXPaddleOcr,sav2Img
from pathlib import Pathdef resize_image(image_path, scale=0.5, max_size=960):# 读取图片img = cv2.imread(image_path)if img is None:raise FileNotFoundError(f"图片 {image_path} 不存在!")# 获取原始宽高original_height, original_width = img.shape[:2]print(f"原始宽高: {original_width}x{original_height}")# 首先将宽高按指定比例缩小或放大new_width = int(original_width * scale)new_height = int(original_height * scale)# 如果修改后图片有一边大于 max_size,则进行二次等比缩放if max(new_width, new_height) > max_size:if new_width > new_height:  # 宽度是最大边scale = max_size / new_widthelse:  # 高度是最大边scale = max_size / new_heightnew_width = int(new_width * scale)new_height = int(new_height * scale)print(f"调整后的宽高: {new_width}x{new_height}")# 调整图片大小resized_img = cv2.resize(img, None, fx=scale, fy=scale, interpolation=cv2.INTER_AREA)return resized_imgmodule_dir = Path(__file__).resolve().parent
ch_model = {"det_model_dir": f'{module_dir}/onnxocr/models/ppocrv4/det/ch/det.onnx',"rec_model_dir": f'{module_dir}/onnxocr/models/ppocrv4/rec/ch/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 = resize_image(f"../tb-img/img9.webp",0.4)
result = model.ocr(resized_img)
time_count = time.time() - time1for res in result[0]:print(res[1][0],res[1][1])
sav2Img(resized_img, result, "output.jpg")
print(f'------------------------ 总花费时间: {time_count} 秒----------------------')
  • 优化后的 推理结果和用时
    在这里插入图片描述

总结

可以看到经过调整图片整体尺寸大小,使用PaddleOCR高效率版本转为ONNX , 不仅可以提高整体的识别效率,同时又不会损失识别的精度。

大家可以根据自己在实际识别场景所用的图片中文字大小进行 等比缩小或者等比放大

  • 图片中的文字较大:适当缩小图片
  • 图片中的文字较小:适当放大图片

找到适合自己的识别场景的识别规律,即可进行规模化部署。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com