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

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

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

# RapidOCR 简介

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

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

ScreenShot_2026-06-29_222428_935.png

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

# 什么是 ONNX

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

它的主要特点是:

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

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

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

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

# 快速开始

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

# OCR  
rapidocr==3.9.0
1
2

接下来封装一个 RapidOCR 示例:

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  # 已经是旧格式     
    
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

打印结果:

image.png

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

[
    [box_points, text, score],
    [box_points, text, score],
    ...
]
1
2
3
4
5

字段说明:

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

图片 OCR 样式示例:

3_divide.png

# 总结

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

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

上次更新: 2026/7/1