RTX 5070 Ti 部署 PaddleOCR 踩坑实录:GPU 推理乱码的根因与 ONNX 解决方案
RTX 5070 Ti 部署 PaddleOCR 踩坑实录
背景
百度飞桨 PaddleOCR 是国内最流行的开源 OCR 系统,2026年6月刚发布 PP-OCRv6,号称用千万级参数超越千亿级多模态大模型的 OCR 能力。
我在本地双 5070 Ti 机器上部署 PaddleOCR,目标是提供 REST API + 前端 Demo。结果遇到了一个非常隐蔽的坑——GPU 推理正常运行,但输出全是乱码。
问题现象
安装 paddlepaddle-gpu 2.6.2 + paddleocr 2.9.1 后,OCR 服务启动正常,GPU 识别正常,检测框也能正确找到文字区域。但识别结果却是这样的:
输入: 百度飞桨OCR文字识别 输出: 岑博振腺扭唤爸²扭の腺² 输入: Hello World 2026 输出: leuoworia 207
完全乱码,但置信度全是 1.00。
根因分析
经过大量排查,终于找到了根因:
RTX 5070 Ti 的 CUDA Compute Capability = 12.0(Blackwell 架构),PaddlePaddle 2.6.2 只支持到 CC 9.0(Ada Lovelace)。
关键日志:
W: The GPU compute capability in your current machine is 120, which is not supported by Paddle, it is recommended to install the corresponding wheel package according to the installation information on the official Paddle website.
推理引擎使用了不兼容的 CUDA kernel,不报错但输出错误。 这是最危险的——程序正常运行,结果完全错误,没有任何异常提示。
为什么不用 PaddlePaddle 3.x?
PaddlePaddle 3.3.1 已经支持 CUDA 12.9,但问题是:
PyPI 上只有 CPU 版本(
paddlepaddle)GPU 版本(
paddlepaddle-gpu)最高只有 2.6.2百度官方 wheel 源也没有提供 3.x 的 GPU 包
所以通过 pip install 无法获得支持 RTX 5070 Ti 的 PaddlePaddle。
解决方案:ONNX Runtime
既然 PaddlePaddle 的推理引擎不行,那就换一个。ONNX Runtime 是微软开源的推理引擎,支持所有主流 GPU 架构。
步骤 1:获取 ONNX 模型
从 HuggingFace 下载 PP-OCRv4 的 ONNX 格式模型:
from huggingface_hub import hf_hub_download # 检测模型 hf_hub_download("OleehyO/paddleocrv4.onnx", "ch_PP-OCRv4_det.onnx") # 识别模型 hf_hub_download("OleehyO/paddleocrv4.onnx", "ch_PP-OCRv4_rec.onnx")
步骤 2:安装 ONNX Runtime
pip install onnxruntime # CPU 版 # 或 pip install onnxruntime-gpu # GPU 版(支持 CUDA 12.x)
步骤 3:构建 OCR 流水线
import onnxruntime as ort import numpy as np # 加载模型 det = ort.InferenceSession("ch_PP-OCRv4_det.onnx") rec = ort.InferenceSession("ch_PP-OCRv4_rec.onnx") # 检测 → 裁剪 → 识别 # 完整代码见项目仓库
踩坑总结
坑 1:GPU 推理”能跑”≠”跑对”
RTX 5070 Ti 是 Blackwell 架构,老版本框架可能静默出错。升级 GPU 后一定要验证推理结果的正确性,不能只看程序是否正常运行。
坑 2:字典必须匹配
PaddleOCR 的识别模型输出维度 = 字典大小 + blank + space。不同模型使用不同字典,混用会导致乱码。
# 正确: 6625 维模型 + 6625 字字典 dict_path = "ppocr_keys_v1.txt" # 6623字 + blank + space = 6625
坑 3:DB 检测需要 padding
PaddleOCR 的 DB 检测算法只激活文字笔画的核心区域(约文字高度的 1/3),不是完整文字框。裁剪时必须加 padding:
# 裁剪区域上下各加 30px padding pts[0][1] = pts[1][1] = cy - half_h - 30 # top pts[2][1] = pts[3][1] = cy + half_h + 30 # bottom
最终效果
| 场景 | 耗时 |
|---|---|
| 4行中英文(800×400) | 179ms |
| 真实图片上传 | 280ms |
识别准确率:中文、英文、数字均正确识别。
结论
RTX 5070 Ti 用户:不要用
paddlepaddle-gpu 2.x,用 ONNX Runtime 绕过ONNX 是最佳兼容层:模型可从 HuggingFace 获取,推理不依赖 PaddlePaddle
字典匹配很重要:模型输出维度必须等于字典大小
DB 检测需要 padding:裁剪区域加 30px padding 可大幅提升识别准确率
项目地址: /data/research/pp-ocr-v6 外网 Demo: http://219.152.238.231:36510/ocr/[1]