PaddleOCR 太慢?我换成 RapidOCR 后,速度直接起飞

我的网站原文地址:www.javayong.cn/md/ocr/01-R...

我在学习使用 PaddleOCR 时,在本地 Mac M1 上进行了测试,发现 PaddleOCR 的性能表现并不理想------处理每张图片大约需要 5 秒。于是我开始寻找替代方案,意外发现社区中有大量开发者推荐 RapidOCR。

这不禁让我思考:为什么 RapidOCR 能够如此快速?

今天这篇文章,我们将深入探讨 RapidOCR 的核心优势,剖析其高性能背后的技术秘密------ONNX,最后还会介绍具体的使用方法。

RapidOCR 简介

RapidOCR 是一款完全开源免费、支持离线快速部署的多平台多语言 OCR 工具,以极致的速度与广泛的兼容性为核心优势。

鉴于 PaddleOCR 在工程化方面仍有优化空间,RapidOCR 致力于简化并加速 OCR 模型在各类终端设备上的推理部署。项目创新性地将 PaddleOCR 模型转换为高度兼容的 ONNX 格式,并基于 Python、C++、Java、C# 等多种编程语言实现了跨平台的无缝移植,让开发者能够轻松上手、高效集成。

看到这里,你可能会产生疑问:什么是 ONNX?

什么是 ONNX

ONNX(Open Neural Network Exchange,开放神经网络交换)是一种用于表示深度学习模型的开放格式。它定义了模型的数据结构和计算图,使得不同深度学习框架训练的模型可以互相转换和使用。

它的主要特点是:

  • 跨框架兼容:支持 PyTorch、TensorFlow、MXNet 等主流框架的模型导出
  • 跨平台部署:可在不同硬件平台和操作系统上无缝运行
  • 高性能推理:支持多种推理优化技术,显著提升模型运行效率
  • 可扩展架构:支持自定义算子,便于功能扩展

开发者可以使用任何支持的框架训练模型,然后导出为 ONNX 格式,再使用任何支持 ONNX 的推理引擎进行部署。

以机器视觉领域为例,C# 作为应用开发的主流语言,ONNX 格式因此备受青睐。开发者无需安装庞大的 PaddlePaddle 框架,也不必使用 Python 编写识别算法,直接使用 ONNX Runtime 库即可完成所有工作,极大提升了开发效率。

简而言之,ONNX 就像是深度学习模型的"通用语言",让模型能够在不同的环境和平台之间自由迁移。

快速开始

首先创建一个 Python 工程,在依赖文件中添加依赖:

ini 复制代码
# OCR  
rapidocr==3.9.0

接下来封装一个 RapidOCR 示例:

python 复制代码
def example_3_chinese_english_mixed():
    # 创建 RapidOCR 实例(使用默认参数,自动检测多语言)
    ocr = RapidOCR()

    # 读取图片
    img = Image.open(TEST_IMAGE_1)
    img_array = np.array(img)

    print(f"图片信息: {img.size} {img.mode}")

    # 执行 OCR
    result = ocr(img_array)

    # 转换结果格式(RapidOCR 3.8+ 返回 RapidOCROutput 对象)
    result = convert_result(result)

    # result 格式: [[[x1,y1],[x2,y1],[x2,y2],[x1,y2]], (文本, 置信度)]
    print(f"\n检测到 {len(result)} 个文本框\n")

    for i, (box, (text, score)) in enumerate(result, 1):
        print(f"{i}. 文本: {text}")
        print(f"   置信度: {score:.4f}")
        print(f"   坐标: {box}\n")

  
def convert_result(result):  
    """  
    将 RapidOCR 3.8+ 的 RapidOCROutput 对象转换为旧格式  
  
    Args:        result: RapidOCR 返回的结果(可能是 RapidOCROutput 对象或列表)  
  
    Returns:        旧格式列表: [([[x1,y1],[x2,y1],[x2,y2],[x1,y2]], (text, confidence)), ...]  
    """    if hasattr(result, 'boxes') and result.boxes is not None:  
        # RapidOCROutput 对象  
        boxes = result.boxes  
        txts = result.txts  
        scores = result.scores  
        return [[box.tolist(), (txt, float(score))]  
                for box, txt, score in zip(boxes, txts, scores)]  
    return result  # 已经是旧格式     
    

打印结果:

RapidOCR 的识别结果采用以下格式:

arduino 复制代码
[
    [box_points, text, score],
    [box_points, text, score],
    ...
]

字段说明:

  • box_points:文本框的四个顶点坐标
  • text:识别出的文本内容
  • score:置信度分数(0-1 之间,越接近 1 表示识别结果越可靠)

图片 OCR 样式示例:

总结

RapidOCR 通过采用 ONNX 格式和多种推理引擎优化,成功实现了高性能、高精度的 OCR 识别能力,其开源、跨平台的特性使其成为 OCR 领域的优秀选择。

如果你也遇到了 PaddleOCR 的性能瓶颈 (没有 GPU 资源),不妨尝试一下 RapidOCR,相信会给你带来惊喜。

相关推荐
苏三说技术6 小时前
LangChain4j 和 LangGraph4j,哪个更好?
后端
ServBay7 小时前
7 个AI开发中真正用得上的 MCP Server,配合Claude Code食用效果更佳
后端·claude·mcp
妙码生花7 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(十五):优化细节、网络请求封装
前端·后端·ai编程
用户6757049885028 小时前
Go 语言里判断字符串为空,90% 的人都写错了!
后端·go
用户6757049885028 小时前
Go 进阶必修:90% 的人都没用对的“表驱动法”
后端·go
小兔崽子去哪了8 小时前
Java 生成二维码解决方案
java·后端
苍何8 小时前
懂事的 Agent 已经开始自己看屏幕干活了,效率起飞!
后端
掘金码甲哥8 小时前
1分钟买不了吃亏系列: nginx动态域名解析
后端