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

news2025/1/10 7:12:12

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

    • 基于项目
    • 环境准备
    • 高效率版本
      • 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 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:
        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() - time1
    
    for 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 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 模型的推理流程:

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() - time1

for 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 Path

def 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_width
        else:  # 高度是最大边
            scale = max_size / new_height
        new_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_img

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 = resize_image(f"../tb-img/img9.webp",0.4)
result = model.ocr(resized_img)
time_count = time.time() - time1

for res in result[0]:
    print(res[1][0],res[1][1])
sav2Img(resized_img, result, "output.jpg")
print(f'------------------------ 总花费时间: {time_count} 秒----------------------')
  • 优化后的 推理结果和用时
    在这里插入图片描述

总结

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2274211.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

保护性暂停原理

什么是保护性暂停? 保护性暂停(Guarded Suspension)是一种常见的线程同步设计模式,常用于解决 生产者-消费者问题 或其他需要等待条件满足后再继续执行的场景。通过这种模式,一个线程在执行过程中会检查某个条件是否满…

Linux 工作队列

系列文章目录 Linux内核学习 Linux 知识(1) Linux 知识(2) Linux 工作队列 Linux 内核源代码情景分析(一) Linux 设备驱动程序(二) 文章目录 系列文章目录综述工作(work_…

计算机的错误计算(二百零六)

摘要 电脑准备关机时,看到不知什么时候触发跳出了一个**AI助手页面。里面有关于等价的讨论内容,特记录,以警世人:大模型犯错,不是个别现象。 例1. 下面是对话。问题是: 和 等价吗?在 (0, ) …

支持向量回归(SVR:Support Vector Regression)用于A股数据分析、预测

简单说明 支持向量回归是一种用来做预测的数学方法,属于「机器学习」的一种。 它的目标是找到一条「最合适的线」,能够大致描述数据点的趋势,并允许数据点离这条线有一定的误差(不要求所有点都完全落在这条线上)。 可以把它想象成:找到一条「宽带」或「隧道」,大部分…

web作业

作业一 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>Document</title> </head&g…

(六)ROS通讯机制——常用命令

前言 下面这些主要是一些通讯中经常用到的一些命令&#xff0c;大家需要跟着下面的指示操作一遍&#xff0c;有个大致的了解即可。 1.学习目的 机器人系统中启动的节点少则几个&#xff0c;多则十几个、几十个&#xff0c;不同的节点名称各异&#xff0c;通信时使用话题、服…

掌握正则表达式:从入门到精通的实战指南

文章目录 &#x1f30d;一.正则表达式❄️1.为什么学习正则表达式❄️ 2.基本介绍❄️3.分析底层实现 &#x1f30d;二.正则表达式的语法❄️1.字符匹配❄️2.量词❄️3.定位符4.分组和引用❄️6.非贪婪匹配❄️7.分支结构❄️实际应用 &#x1f30d; 三.正则标表达式的三个常用…

【Linux 之一 】Linux常用命令汇总

Linux常用命令 ./catcd 命令chmodclearcphistoryhtoplnmkdirmvpwdrmtailunamewcwhoami 我从2021年4月份开始才开始真正意义上接触Linux&#xff0c;最初学习时是一脸蒙圈&#xff0c;啥也不会&#xff0c;啥也不懂&#xff0c;做了很多乱七八糟&#xff0c;没有条理的笔记。不知…

AI赋能R-Meta分析核心技术:从热点挖掘到高级模型、助力高效科研与论文发表

Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面&#xff0c;成为Science、Nature论文的…

用 Python 绘制可爱的招财猫

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​​​ ​​​​​​​​​ ​​​​ 招财猫&#xff0c;也被称为“幸运猫”&#xff0c;是一种象征财富和好运的吉祥物&#xff0c;经常…

【Linux】Linux常见指令(上)

个人主页~ 初识Linux 一、Linux基本命令1、ls指令2、pwd命令3、cd指令4、touch指令5、mkdir指令6、rmdir指令7、rm指令8、man指令9、cp指令10、mv命令 Linux是一个开源的、稳定的、安全的、灵活的操作系统&#xff0c;Linux下的操作都是通过指令来实现的 一、Linux基本命令 先…

AI是IT行业的变革力量,还是“职业终结者”?

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 AI是…

mapbox进阶,卷帘对比

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️mapbox-gl-compare 卷帘对比控件二、�…

【开源免费】基于SpringBoot+Vue.JS企业资产管理系统(JAVA毕业设计)

本文项目编号 T 124 &#xff0c;文末自助获取源码 \color{red}{T124&#xff0c;文末自助获取源码} T124&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

Linux环境中对Postgrel数据库的安装与配置

一、环境准备 linux操作系统的环境是centos7; Postgrel数据库的版本是12.0&#xff0c;不同版本的下载渠道如下&#xff08;PostgreSQL: File Browser&#xff09;&#xff1a; 可以看到压缩包是比较小的&#xff1b;下载之后&#xff0c;上传到你的linux环境中即可。 二、…

《零基础Go语言算法实战》【题目 1-11】格式化字符串

《零基础Go语言算法实战》 【题目 1-11】格式化字符串 在 Go 语言中&#xff0c;找到使用变量格式化字符串而不打印值的简单方法。 【解答】 在 Go 语言中&#xff0c;在不打印值的情况下进行格式化的最简单方法是使用 fmt.Sprintf() 函数&#xff0c; 它返回一个格式化的…

【机器视觉】OpenCV 图像轮廓(查找/绘制轮廓、轮廓面积/周长、多边形逼近与凸包、外接矩形)

OpenCV官网 7. 图像轮廓 7.1 什么是图像轮廓 图像轮廓是具有相同颜色或灰度的连续点的曲线. 轮廓在形状分析和物体的检测和识别中很有用。 轮廓的作用: 用于图形分析物体的识别和检测 注意点: 为了检测的准确性&#xff0c;需要先对图像进行二值化或Canny操作。画轮廓时…

Elasticsearch:使用 Playground 与你的 PDF 聊天

LLMs作者&#xff1a;来自 Elastic Toms Mura 了解如何将 PDF 文件上传到 Kibana 并使用 Elastic Playground 与它们交互。本博客展示了在 Playground 中与 PDF 聊天的实用示例。 Elasticsearch 8.16 具有一项新功能&#xff0c;可让你将 PDF 文件直接上传到 Kibana 并使用 Pla…

RabbitMQ 在 Spring Boot 项目中的深度应用与实战解析

RabbitMQ 在 Spring Boot 项目中的深度应用与实战解析 引言 RabbitMQ 作为一款广受欢迎的开源消息队列系统&#xff0c;遵循 AMQP 协议&#xff0c;能够在分布式系统里实现应用程序之间的异步通信、解耦以及流量削峰等关键功能。在 Spring Boot 项目中集成 RabbitMQ&#xff…