做 OCR 的兄弟们应该都有感觉,这几年 PaddleOCR 迭代得太快了。从 v2 的 3.5M 模型让人眼前一亮,到 v3 引入 SVTR,再到现在的 v4,百度这套 PP-OCR 系列确实是把“工业级落地”这几个字琢磨透了。

最近我在项目里实测了 v4 的 server 端和 mobile 端模型,有些心得想和大家拆解一下。v4 最大的变化不仅仅是指标上的提升,而是它在策略上的务实——怎么在算力受限的边缘端,既要多语言支持,又要保证推理速度不掉链子。

1. 核心架构:不仅仅是 Backbone 的升级

很多刚入行的朋友看 Release Note,以为 v4 只是换了个更强的骨干网络(Backbone)。其实没那么简单。

在 v4 的识别模型(Rec Model)里,最核心的改动是它把 SVTR (Scene Text Recognition) 的思路彻底贯彻了,但又做得很克制。v3 的时候 SVTR 还是个尝鲜的组件,到了 v4,他们弄了个 SVTR_LCNet

啥意思呢?纯 Transformer 虽然精度高,但在端侧推理(尤其是老一点的 CPU 或者 ARM 芯片)上其实很吃力,延时很难看。PP-OCRv4 的做法是:头部还是用 CNN(LCNet)来提特征,尾部或者是深层网络里嵌入 Transformer 模块(SVTR unit)来抓取全局上下文信息

这种“CNN + Transformer”的混合架构,解决了以前纯 CNN 模型对弯曲文本、形变文本识别率低的问题,同时因为 Transformer 层数控制得好,并没有让推理时间暴涨。我在 T4 上测过,v4 的 server 模型精度比 v3 提升了大概 3-5%,但吞吐量并没有明显下降,这点在生产环境非常关键。

2. 检测模型:DBNet++ 的调优魔法

检测部分(Det Model)依然沿用了 DBNet 的逻辑(毕竟 Differentiable Binarization 确实是现在实时检测的最优解),但在 v4 里,你会发现即使是小模型,对密集文本的分割能力也变强了。

这背后其实是 PFHead (Parallel FPN Head) 和一些 Trick 的功劳。以前我们训练的时候,经常遇到稍微密集一点的表格文字,框就粘连在一起了。v4 在 Loss Function 上做了微调,配合更强的数据增强(Data Augmentation),让模型对“文字间隙”更敏感。

另外提一嘴,如果你自己在做 Fine-tuning,千万别忽视 det_limit_side_lendet_db_thresh 这两个参数。很多时候 v4 漏检不是模型不行,是你预处理的时候图缩太小,或者后处理阈值卡太死。

3. 多语言支持的“大力出奇迹”与“精细化蒸馏”

v4 宣称支持 80+ 种语言,很多做跨境业务的朋友很看重这个。

但技术层面,多语言模型最大的痛点是 Character Balance(字符平衡)。比如中文常用字几千个,英文就 26 个字母,韩文又是另一套。如果直接一锅炖,小语种的样本很容易被淹没。

PP-OCRv4 在这块用了两个狠招:

  1. GTC (Guided Training of CTC):这玩意儿挺有意思。它在训练的时候引入了一个 Attention 分支来辅助 CTC 学习。训练完后,推理阶段把 Attention 分支扔掉,只留 CTC。这样既享受了 Attention 对序列关系的强建模能力,又保持了 CTC 推理极快的优势。这招对于多语言里的长字符序列识别特别管用。
  2. 知识蒸馏(Knowledge Distillation):这是 Paddle 的拿手好戏了。v4 的学生模型(Student)并不是从头傻练的,而是被一个庞大的教师模型(Teacher)手把手教出来的。对于多语言场景,Teacher 模型往往见过更多的数据分布,通过蒸馏,把这种“泛化能力”压缩到了几兆的 Mobile 模型里。

4. 落地部署的实战坑点

吹了半天架构,最后还得聊聊落地。

  • 转 ONNX 的坑: Paddle 转 ONNX 目前虽然成熟了很多,但在 v4 上,如果你用了带 Transformer 结构的配置,有时候会出现 Shape 推导错误。特别是动态输入尺寸(Dynamic Shape)的时候。建议大家导出时固定一下输入的 height(比如 48 或 32),width 可以动态,这样兼容性最好。Bash# 典型导出命令,注意 input_shape 的 trick paddle2onnx --model_dir ./inference/ch_PP-OCRv4_rec_infer \ --model_filename inference.pdmodel \ --params_filename inference.pdiparams \ --save_file ./ch_PP-OCRv4_rec.onnx \ --opset_version 11 \ --enable_onnx_checker True \ --input_shape_dict "{'x': [1, 3, 48, 320]}" # 高度定死,宽度给个大概
  • 方向分类器(Cls)的必要性: v4 的识别能力虽然强,但它对倒置文本(翻转 180 度)还是没辙。如果你做文档电子化,务必串联一个方向分类器。虽然多了一次推理,但能救回很多必死的 Case。
  • 关于 C++ 推理: 如果上端侧(比如安卓或者树莓派),还是老老实实切到 Paddle Lite 或者 OpenVINO(如果是 Intel 芯片)。直接跑 Python 脚本在端侧那速度是没法看的。v4 的量化版本(INT8)在特定硬件上有加速,但精度大概会掉 1-2 个点,需要权衡。

总结

总的来说,PaddleOCR v4 不是那种发 Paper 刷榜用的“花瓶”模型,它是真正给工程师用的工具。它解决的问题——比如怎么在 CPU 上跑出 GPU 的感觉,怎么用小模型搞定多语言——都是我们在做实际项目时最头疼的点。

如果你还在守着 Tesseract 或者旧版的 CRNN,强烈建议切到 v4 试试。当然,没有任何模型是开箱即完美的,拿到 v4 的预训练权重,针对自己的垂类数据(比如发票、车牌、电表)做一下 Fine-tuning,才是打开它的正确方式。