
PaddleOCR 中 Rosetta 文本识别算法实战CTC 全卷积架构、模型训练与推理部署全指南【免费下载链接】PaddleOCR飞桨多语言OCR工具包实用超轻量OCR系统支持80种语言识别提供数据标注与合成工具支持服务器、移动端、嵌入式及IoT设备端的训练与部署 Awesome multilingual OCR toolkits based on PaddlePaddle (practical ultra lightweight OCR system, support 80 languages recognition, provide data annotation and synthesis tools, support training and deployment among server, mobile, embedded and IoT devices)项目地址: https://gitcode.com/paddlepaddle/PaddleOCRRosetta 是 KDD 2018 提出的面向大规模图像的文本检测与识别系统其识别分支采用无 RNN 的全卷积 CTC轻量架构在 MJSynth/SynthText 大规模合成数据上训练后可达到较高精度。本文以 PaddleOCR 仓库中 Rosetta 算法文档docs/version2.x/algorithm/text_recognition/algorithm_rec_rosetta.md为核心结合仓库内配置文件与源码实现完整讲解 Rosetta 的算法原理、两种骨干网络配置、从训练评估到推理部署的完整实战流程以及其底层模块在源码中的真实实现。1. 算法简介Rosetta 论文信息Rosetta: Large Scale System for Text Detection and Recognition in Images Borisyuk F, Gordo A, V Sivakumar KDD, 2018Rosetta 的文本识别分支核心理念是去掉常见的 LSTM/RNN 序列建模仅用 CNN 提取特征 CTC 损失对齐从而获得更快的训练与推理速度适合工业级大规模部署。PaddleOCR 复现了该识别分支使用 MJSynth 与 SynthText 两个文字识别数据集训练并在 IIIT、SVT、IC03、IC13、IC15、SVTP、CUTE 数据集上进行评估算法复现效果如下模型骨干网络配置文件Avg Accuracy下载链接RosettaResnet34_vdconfigs/rec/rec_r34_vd_none_none_ctc.yml79.11%训练模型RosettaMobileNetV3configs/rec/rec_mv3_none_none_ctc.yml75.80%训练模型说明上述准确率为官方文档记载的复现评测结果。两份权重链接为原文档中提供的模型下载地址用于后续训练、评估与推理演示。1.1 从配置文件理解 Rosetta 的网络结构在 PaddleOCR 中算法通过配置文件驱动。以 configs/rec/rec_r34_vd_none_none_ctc.yml 为例其Architecture段完整定义了 Rosetta 的网络拓扑Architecture: model_type: rec algorithm: Rosetta Backbone: name: ResNet layers: 34 Neck: name: SequenceEncoder encoder_type: reshape Head: name: CTCHead fc_decay: 0.0004三个组件一一对应源码中的真实实现Backbone骨干网络ResNet层数 34定义于 ppocr/modeling/backbones/rec_resnet_vd.py。从源码可见其支持[18, 34, 50, 101, 152, 200]六种层数其中layers 34时每个 stage 的深度为[3, 4, 6, 3]通道数依次为[64, 64, 128, 256]对应num_channels [64, 64, 128, 256] if layers 50 else [64, 64, 128, 256]的分支即 34 层时为[64, 64, 128, 256]滤波器数为[64, 128, 256, 512]。最终输出的特征图高度被压缩为 1宽度方向保留序列维度。Neck序列编码器SequenceEncoder且encoder_type: reshape实现在 ppocr/modeling/necks/rnn.py。这是 Rosetta 与 CRNN 类算法的关键差异点当encoder_type reshape时只做纯张量形状变换Im2Seq见 rnn.py即把(B, C, 1, W)的特征图squeeze掉高度维并转置为(B, W, C)的序列不引入任何 RNN/LSTM 时序建模而encoder_type为fc/rnn/svtr等取值时才会拼接额外的序列编码器。Head预测头CTCHead实现在 ppocr/modeling/heads/rec_ctc_head.py本质是一个全连接层将序列特征映射为每个时间步在字符字典上的概率分布非训练状态下会对输出做softmaxpredicts F.softmax(predicts, axis2)。配置文件名rec_r34_vd_none_none_ctc的命名也直接揭示了算法组合r34_vdResNet34 的 vd 变体骨干none无 Transformnone无 RNN 序列建模ctcCTC 头。rec_mv3_none_none_ctc同理只是将骨干换成了 MobileNetV3。2. 环境配置请先参考 《运行环境准备》 配置 PaddleOCR 运行环境该文档详细覆盖 Windows/Mac/Linux 下的 Anaconda 环境搭建以及 Linux 下的 Docker 环境配置再参考 《项目克隆》 克隆项目代码。环境就绪后训练、评估、预测三个环节分别依赖仓库中的以下入口脚本tools/train.py模型训练tools/eval.py模型评估tools/infer_rec.py单模型推理tools/export_model.py导出 inference modeltools/infer/predict_rec.py基于推理模型的标准预测脚本3. 模型训练、评估、预测请参考 文本识别训练教程 获取更详细的训练说明。PaddleOCR 对代码进行了模块化训练不同的识别模型只需要更换配置文件即可。以基于 Resnet34_vd 骨干网络为例3.1 训练# 单卡训练训练周期长不建议 python3 tools/train.py -c configs/rec/rec_r34_vd_none_none_ctc.yml # 多卡训练通过--gpus参数指定卡号 python3 -m paddle.distributed.launch --gpus 0,1,2,3 tools/train.py -c configs/rec/rec_r34_vd_none_none_ctc.yml对应用户也可以使用 MobileNetV3 版本python3 -m paddle.distributed.launch --gpus 0,1,2,3 tools/train.py -c configs/rec/rec_mv3_none_none_ctc.yml训练超参数在配置文件的Global、Optimizer、Train段中定义两个配置均默认 72 个 epochepoch_num: 72每 2000 次迭代评估一次eval_batch_step: [0, 2000]优化器为 Adam学习率0.0005beta1: 0.9、beta2: 0.999并带 L2 正则regularizer.factor: 0。训练数据通过LMDBDataSet读取data_dir: ./train_data/data_lmdb_release/training/每个 batch 256 张图图片预处理管线为DecodeImage - CTCLabelEncode - RecResizeImg(image_shape: [3, 32, 100]) - KeepKeys。其中RecResizeImg是文本识别通用的图像缩放与归一化算子实现在 ppocr/data/imaug/rec_img_aug.py。它将输入图统一 resize 到(3, 32, 100)3 通道、高 32、宽 100归一化到 0~1 区间并转为 CHW 布局同时输出valid_ratio记录有效宽度比例供后续解码与评估使用——这与推理时--rec_image_shape3, 32, 100的参数保持一致。3.2 评估# GPU评估, Global.pretrained_model为待评估模型 python3 -m paddle.distributed.launch --gpus 0 tools/eval.py -c configs/rec/rec_r34_vd_none_none_ctc.yml -o Global.pretrained_model{path/to/weights}/best_accuracy评估时使用验证集 LMDB./train_data/data_lmdb_release/validation/指标由Metric段指定Metric: name: RecMetric main_indicator: acc即采用RecMetric实现在 ppocr/metrics/rec_metric.py以识别准确率acc作为主指标。3.3 预测python3 tools/infer_rec.py -c configs/rec/rec_r34_vd_none_none_ctc.yml -o Global.pretrained_model{path/to/weights}/best_accuracy Global.infer_imgdoc/imgs_words/en/word_1.pnginfer_rec.py直接加载训练权重动态图模型对单张图片做识别。若本地缺少测试图片可参考 docs/version2.x/legacy/images/word_1.png 这类仓库内置样例图片或用任意文本行图片替代。4. 推理部署4.1 Python 推理首先将 Rosetta 文本识别训练过程中保存的模型转换成 inference model。以基于 Resnet34_vd 骨干网络、在 MJSynth 和 SynthText 两个文字识别数据集训练得到的模型为例模型下载地址可以使用如下命令进行转换python3 tools/export_model.py -c configs/rec/rec_r34_vd_none_none_ctc.yml -o Global.pretrained_model./rec_r34_vd_none_none_ctc_v2.0_train/best_accuracy Global.save_inference_dir./inference/rec_rosetta转换产物inference.pdmodel、inference.pdiparams等保存在./inference/rec_rosetta/目录供后续 Python/C 等推理使用。Rosetta 文本识别模型推理可以执行如下命令python3 tools/infer/predict_rec.py --image_dirdoc/imgs_words/en/word_1.png --rec_model_dir./inference/rec_rosetta/ --rec_image_shape3, 32, 100 --rec_char_dict_path./ppocr/utils/ic15_dict.txt推理结果如下所示Predicts of doc/imgs_words/en/word_1.png:(joint, 0.9999982714653015)输出为(识别文本, 置信度)元组。这里的置信度由CTCLabelDecode计算它先对每个时间步的概率做argmaxppocr/postprocess/rec_postprocess.py取对应置信度再合并 CTC 的重复字符is_remove_duplicateTrue并过滤blank占位符add_special_char会在字符字典最前面插入blank对应 CTC 损失中blank0的设定见 ppocr/losses/rec_ctc_loss.py最终返回文本与平均置信度。命令参数说明参数含义本示例取值--image_dir待识别图片路径doc/imgs_words/en/word_1.png--rec_model_dir推理模型目录./inference/rec_rosetta/--rec_image_shape输入图片尺寸CHW3, 32, 100--rec_char_dict_path字符字典路径./ppocr/utils/ic15_dict.txt其中 ppocr/utils/ic15_dict.txt 是 IC15 评测场景使用的英文数字字典内容为0-9与a-z共 36 个字符与 Rosetta 英文模型的输出类别一一对应CTCLabelDecode会在该字典基础上自动追加blank作为 CTC 的占位类别参见add_special_char实现因此实际输出维度为 37。4.2 C 推理暂不支持。4.3 Serving 服务化部署暂不支持。4.4 更多推理部署Rosetta 模型还支持以下推理部署方式Paddle2ONNX 推理准备好推理模型后参考 paddle2onnx 教程 操作可将 Paddle 静态图模型转换为 ONNX 格式用于对接 ONNX Runtime 等推理后端。5. FAQ本节暂无常见问题记录。结合源码可以补充两点工程建议更换骨干网络将Backbone.name从ResNet换为MobileNetV3、layers换为scale/model_name即可在精度ResNet34 vd79.11%与速度/体积MobileNetV375.80%之间权衡MobileNetV3 支持model_name: large|small与scale: 0.35/0.5/0.75/1.0/1.25组合见 ppocr/modeling/backbones/rec_mobilenet_v3.py。更换字符字典若需识别包含空格或其他字符的文本在配置中设置Global.character_dict_path与use_space_char: True并在推理命令中同步替换--rec_char_dict_path。6. 引用Rosetta 论文 BibTeXinproceedings{2018Rosetta, title{Rosetta: Large Scale System for Text Detection and Recognition in Images}, author{ Borisyuk, Fedor and Gordo, Albert and Sivakumar, Viswanath }, booktitle{the 24th ACM SIGKDD International Conference}, year{2018}, }总结Rosetta 在 PaddleOCR 中是一款典型的去 RNN 化轻量识别算法CNN 骨干提取特征后SequenceEncoder(reshape)直接做序列化再由CTCHead与CTCLoss完成时序对齐与解码训练与推理链路简洁高效。通过本文你可以完成从环境准备、配置理解、训练评估到 Python/ONNX 推理部署的完整闭环需要更高精度时推荐关注带序列建模如 rnn/svtr 编码器的其他识别算法需要更小体积时则可直接切换 MobileNetV3 骨干。【免费下载链接】PaddleOCR飞桨多语言OCR工具包实用超轻量OCR系统支持80种语言识别提供数据标注与合成工具支持服务器、移动端、嵌入式及IoT设备端的训练与部署 Awesome multilingual OCR toolkits based on PaddlePaddle (practical ultra lightweight OCR system, support 80 languages recognition, provide data annotation and synthesis tools, support training and deployment among server, mobile, embedded and IoT devices)项目地址: https://gitcode.com/paddlepaddle/PaddleOCR创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考