目录

端侧 OCR 实战:RapidOCR 与 Apple Vision 让应用离线读懂图片文字

端侧 OCR 实战:RapidOCR 与 Apple Vision 让应用离线读懂图片文字

OCR(光学字符识别)是把图片里的文字变成可编辑文本的技术,证件识别、票据录入、截图翻译、扫码枪背后都是它。过去主流做法是调云端 API,但端侧 OCR 有三个硬优势:

  1. 隐私:身份证、合同、聊天截图不出设备
  2. 离线可用:飞机、地铁、弱网环境照常工作
  3. 零边际成本:云 API 按次计费,端侧一次部署永久免费,还省掉了网络往返延迟

开源方案怎么选

方案 模型体积 语言生态 适用场景
RapidOCR 约 20MB(INT8 量化后约 10MB) Python / C++ / Android / iOS 跨端统一逻辑,离线部署首选
PaddleOCR 30MB 起,可剪枝量化 Python 为主 追求极致精度,接受较大体积
Tesseract 中文语言包约 40MB C++ 生态 老牌方案,中文准确率一般
Apple Vision 系统内置,零体积 Swift(iOS 13+) iOS 原生 App 零集成成本

RapidOCR 实战:四行代码接入

RapidOCR 是百度 PP-OCR 模型的 ONNX 移植版(RapidAI 开源),检测(det)、方向分类(cls)、识别(rec)三个模型全部转成 ONNX,用 onnxruntime 推理,不依赖 Paddle 框架,体积小、跨端部署简单:

1
2
3
4
5
6
7
8
# pip install rapidocr-onnxruntime
from rapidocr_onnxruntime import RapidOCR

engine = RapidOCR()  # 首次调用自动加载三个 ONNX 模型
result, elapse = engine("receipt.jpg")  # 支持路径、bytes、numpy 数组

for box, text, score in result:
    print(text, round(score, 2))

result 中每个元素是 [坐标框, 识别文本, 置信度],elapse 是本次推理耗时(秒)。把它包成 HTTP 服务给前端用,也就十几行:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from fastapi import FastAPI, UploadFile
from rapidocr_onnxruntime import RapidOCR

app = FastAPI()
engine = RapidOCR()

@app.post("/ocr")
async def ocr(file: UploadFile):
    data = await file.read()
    result, _ = engine(data)          # bytes 直接喂给引擎
    return {"texts": [t for _, t, _ in result]}

Apple Vision 实战:iOS 端零依赖

如果只做 iOS 端,Apple 的 Vision framework 性价比最高——系统自带、跑在 Neural Engine 上,不需要集成任何第三方模型:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import Vision
import UIKit

func recognizeText(in image: UIImage) -> [String] {
    guard let cgImage = image.cgImage else { return [] }

    let request = VNRecognizeTextRequest()
    request.recognitionLevel = .accurate          // 精确模式走神经网络
    request.recognitionLanguages = ["zh-Hans", "en-US"] // 中英混排
    request.usesLanguageCorrection = true         // 语言模型纠错

    let handler = VNImageRequestHandler(cgImage: cgImage)
    try? handler.perform([request])

    return request.results?.compactMap { $0.topCandidates(1).first?.string } ?? []
}

识别结果按从上到下、从左到右排序,topCandidates(1) 取置信度最高的候选文本。recognitionLanguages 在 iOS 15 之后支持任意语言组合,iOS 16 之后对中文的识别稳定性更好。

性能与体积数据

  • RapidOCR:det 模型约 4.7MB、cls 约 1.4MB、rec 约 15MB(PP-OCRv4 官方 ONNX 导出),合计约 20MB;INT8 量化后 10MB 以内。CPU 上单张普通图片推理约 100-500ms(官方标注与社区实测,随分辨率和设备浮动)
  • Apple Vision:系统级框架,单张 1080p 图片在 iPhone 上通常几十毫秒级(实测结论),不占 App 包体积

实战踩坑记录

  1. 超大图先缩放:长边超过 2000px 的截图先等比缩放,速度提升明显、精度几乎不降
  2. 竖排文字:RapidOCR 内置 cls 方向分类模型自动纠正旋转;Apple Vision 对横竖排混合场景建议分区域识别
  3. 清晰度优先于滤镜:端侧识别对低照度鲁棒,但运动模糊是杀手,拍摄类 App 建议加抖动检测
  4. 长文档分块:A4 整页识别容易漏字,按行高切块并行识别更稳

总结

端侧 OCR 的技术栈已经非常成熟:跨端统一逻辑选 RapidOCR(ONNX 运行时、约 20MB),iOS 原生选 Apple Vision(零成本、NPU 加速)。两者都支持中文、都能完全离线,配合端侧 INT8 量化技术,识别模型还能再瘦身一半。下一个版本,给你的 App 装上眼睛吧。