PaddleOCR 中 SAR 不规则文本识别算法:原理、配置与完整训练部署实战
发布时间:2026/9/18 7:13:09 锦皓数字建站

PaddleOCR 中 SAR 不规则文本识别算法原理、配置与完整训练部署实战【免费下载链接】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/PaddleOCRSARShow, Attend and Read是 PaddleOCR 中内置的一款经典不规则文本识别算法由 Hui Li 等人于 AAAI 2019 提出其核心价值在于通过 2D 注意力机制与 LSTM 编解码结构在不依赖矫正模块的情况下直接处理弯曲、倾斜等不规则文本。本指南以 PaddleOCR 仓库中的 SAR 算法文档 为骨架结合仓库源码与真实配置文件完整讲解 SAR 的网络结构、配置解析、训练/评估/预测命令、推理模型导出与部署方式帮助读者在 PaddleOCR 中一键复现 SAR 并深入理解其实现原理。1. SAR 算法概述1.1 算法定位面向不规则文本识别的强基线SAR 全称Show, Attend and Read: A Simple and Strong Baseline for Irregular Text Recognition论文发表于 AAAI 2019。与同期依赖空间变换网络STN先矫正再识别的方案如 RARE、Aster不同SAR 采用隐式矫正思路直接在 2D 特征图上应用注意力机制让解码器在每次解码时按需关注特征图中的任意位置从而天然适应弯曲、透视畸变等不规则文本。在 PaddleOCR 中SAR 通过 rec_r31_sar.yml 配置即可完整复现属于仓库中文本识别算法家族的经典成员之一同类文档还包括 CRNN、NRTR、SAR、SATRN 等见 docs/version2.x/algorithm/text_recognition/。1.2 论文信息与复现效果论文出处如下Show, Attend and Read: A Simple and Strong Baseline for Irregular Text Recognition Hui Li, Peng Wang, Chunhua Shen, Guyu Zhang AAAI, 2019在官方复现中SAR 使用MJSynth 和 SynthText两个文本识别数据集进行训练并在 IIIT、SVT、IC03、IC13、IC15、SVTP、CUTE 等基准数据集上评估PaddleOCR 中的复现效果如下ModelBackbone配置文件Acc下载链接SARResNet31rec_r31_sar.yml87.20%train model需要特别说明的是除了 MJSynth 与 SynthText 两个公开数据集外官方训练还额外使用了 SynthAdd 数据百度网盘提取码 627x以及部分真实数据具体数据细节可参考原论文。这也意味着如果在本地仅使用公开数据集复现最终精度可能与表中数字存在合理差异。2. 网络结构源码解析Encoder-Decoder 与 2D 注意力SAR 的网络实现集中在 ppocr/modeling/heads/rec_sar_head.py由三个模块组成SAREncoder编码器、ParallelSARDecoder并行解码器与门面类SARHead。配置文件中Architecture.Head.name: SARHead即指向该实现。2.1 SAREncoder全局特征holistic feature提取SAREncoderrec_sar_head.py 第 31 行起负责把骨干网络输出的 2D 特征图压缩成一段全局上下文向量其流程如下垂直池化对特征图feat沿高度方向做max_pool2d得到bsz × C × W的向量序列序列建模将池化结果转置为bsz × W × C后送入 2 层 LSTM默认enc_bi_rnnFalse为单向完成整行文本的序列上下文建模全局特征提取取序列最后一个时间步或按valid_ratio对齐到有效宽度处的输出经过一个nn.Linear线性变换得到维度为d_enc的全局特征holistic_feat。关键超参数d_model512、d_enc512由SARHead传入d_model即骨干网络输出通道数in_channelsd_enc为编码器 RNN 隐藏维度。2.2 ParallelSARDecoder2D 注意力 并行解码ParallelSARDecoderrec_sar_head.py 第 136 行起是 SAR 的核心其注意力计算在_2d_attention方法中实现注意力 Query解码器 RNN 每一步的隐状态经conv1x1_1线性映射为注意力查询向量注意力 Key骨干输出的 2D 特征图经conv3x3_1卷积映射为注意力键保留空间结构注意力权重查询与键做外积式相加、tanh激活后经conv1x1_2打分再对h × w空间做 softmax得到真正的2D 注意力图注意力输出按注意力权重对特征图加权求和得到 glimpse 特征与解码隐状态、全局特征拼接后送入预测层pred_concatTrue时。解码策略上训练与推理采用不同路径对应SARHead.forward中的self.training分支训练teacher forcing真实标签经embedding后与全局特征拼接作为解码器输入一次性并行解码整条序列forward_train推理自回归以BOS起始符开始逐步将上一步argmax出的字符嵌入回填到解码器输入循环max_text_length步forward_test。这种训练并行、推理串行的设计正是 SAR 训练高效的来源也是后续 SRN、SATRN 等算法设计的重要参照。2.3 骨干网络 ResNet31配置中Architecture.Backbone.name: ResNet31即采用 31 层 ResNet 变体作为特征提取骨干实现位于 ppocr/modeling/backbones/。ResNet31 输出 512 维特征图与SARHead默认的in_channels/d_model512对齐。3. 环境准备与项目克隆3.1 环境准备按照文档要求先参考 环境准备指南 配置 PaddleOCR 运行环境核心依赖包括PaddlePaddle 深度学习框架含 GPU 版若使用 GPU 训练OpenCV、NumPy 等 Python 依赖包完整清单见 requirements.txt其余可选组件如 VisualDL 用于可视化训练Global.use_visualdl: True时启用。3.2 克隆项目代码参考 项目克隆指南 获取仓库代码。PaddleOCR 对代码做了模块化拆分训练不同识别模型只需切换配置文件无需改动任何训练代码——这正是 PaddleOCR 算法复现的通用范式。4. 配置文件深度解析rec_r31_sar.ymlSAR 的完整配置见 configs/rec/rec_r31_sar.yml以下逐段解读其关键参数训练时所有路径均可按需修改。4.1 Global 全局配置Global: use_gpu: true epoch_num: 5 log_smooth_window: 20 print_batch_step: 20 save_model_dir: ./sar_rec save_epoch_step: 1 eval_batch_step: [0, 2000] # 每 2000 个 iteration 评估一次 cal_metric_during_train: True pretrained_model: checkpoints: save_inference_dir: use_visualdl: False infer_img: character_dict_path: ppocr/utils/dict90.txt max_text_length: 30 infer_mode: False use_space_char: False rm_symbol: True save_res_path: ./output/rec/predicts_sar.txt关键参数说明参数默认值含义epoch_num5训练轮数SAR 官方复现采用较少的轮次配合分段学习率衰减eval_batch_step[0, 2000]从第 0 个 iteration 开始每 2000 步执行一次评估character_dict_pathppocr/utils/dict90.txt字符字典路径dict90 为 90 类精简英文字典max_text_length30最大文本长度同时作为解码器最大序列长度SARHead.max_text_lengthuse_space_charFalse是否将空格符纳入字典SAR 复现中关闭因为 dict90 面向单词级识别rm_symbolTrue后处理阶段移除符号并转小写见 5.2 节 SARLabelDecodecharacter_dict_path指向 ppocr/utils/dict90.txt它是 SAR 这类注意力机制模型常用的精简字典。需要说明的是SARLabelEncode会在字典末尾追加UKN未知、BOS/EOS起始/结束、PAD填充三个特殊 token见 label_ops.py 第 877-889 行因此模型实际输出类别数为90 3 93SARLoss默认的ignore_index92即对应PADtoken 的索引见 rec_sar_loss.py 第 12 行。4.2 Optimizer 优化器配置Optimizer: name: Adam beta1: 0.9 beta2: 0.999 lr: name: Piecewise decay_epochs: [3, 4] values: [0.001, 0.0001, 0.00001] regularizer: name: L2 factor: 0使用Adam优化器初始学习率0.001学习率采用Piecewise 分段衰减在第 3 个 epoch 衰减到 0.0001第 4 个 epoch 衰减到 0.00001与epoch_num: 5的values一一对应L2 正则化因子为 0即训练中不施加权重衰减。4.3 Architecture 网络结构Architecture: model_type: rec algorithm: SAR Transform: Backbone: name: ResNet31 Head: name: SARHeadmodel_type: rec声明这是识别任务algorithm: SAR用于推理阶段选择SARLabelDecode后处理与SARRecResizeImg预处理Head.name: SARHead实例化 rec_sar_head.py 中的编解码器。4.4 Loss 与 PostProcessLoss: name: SARLoss PostProcess: name: SARLabelDecodeSARLossrec_sar_loss.py实现细节预测结果去掉最后一个时间步predicts[:, :-1, :]标签去掉起始符label[:, 1:]使两者序列长度对齐后计算交叉熵ignore_index92忽略PAD填充位置SARLabelDecoderec_postprocess.py 第 684 行起将预测索引序列解码为文本跳过填充 token、遇到BOS/EOS结束解码当rm_symbolTrue时还会用正则[^A-Z^a-z^0-9^\u4e00-\u9fa5]剔除符号并转小写。4.5 MetricMetric: name: RecMetricRecMetric是识别任务通用评估指标训练与评估阶段均使用统计整句准确率acc。4.6 Train / Eval 数据管线训练集使用SimpleDataSet文本行清单格式评估集使用LMDBDataSetLMDB 数据库格式二者共用同一套 SAR 专属数据增强Train: dataset: name: SimpleDataSet label_file_list: [./train_data/train_list.txt] data_dir: ./train_data/ ratio_list: 1.0 transforms: - DecodeImage: img_mode: BGR channel_first: False - SARLabelEncode: - SARRecResizeImg: image_shape: [3, 48, 48, 160] # h:48 w:[48,160] width_downsample_ratio: 0.25 - KeepKeys: keep_keys: [image, label, valid_ratio] loader: shuffle: True batch_size_per_card: 64 drop_last: True num_workers: 8 use_shared_memory: False Eval: dataset: name: LMDBDataSet data_dir: ./train_data/data_lmdb_release/evaluation/ transforms: - DecodeImage: img_mode: BGR channel_first: False - SARLabelEncode: - SARRecResizeImg: image_shape: [3, 48, 48, 160] width_downsample_ratio: 0.25 - KeepKeys: keep_keys: [image, label, valid_ratio] loader: shuffle: False drop_last: False batch_size_per_card: 64 num_workers: 4 use_shared_memory: FalseSARRecResizeImg的输入形状[3, 48, 48, 160]是 SAR 区别于其他识别算法如 CRNN 的[3, 32, 100]的关键点格式为[通道数 C, 高度 H, 最小宽度, 最大宽度]即高度固定 48宽度在 48~160 之间动态缩放。从源码 rec_img_aug.py 第 596-628 行 可还原其完整流程按原图宽高比计算目标宽度resize_w ceil(48 * w / h)并取整到1/0.25 4的整数倍将resize_w限制在[48, 160]区间内并据此计算valid_ratiovalid_ratio min(1.0, resize_w / 160)用于标记图像有效区域比例缩放图像到48 × resize_w除以 255 归一化、再以 0.5 为中心的标准化将结果左对齐填充到3 × 48 × 160的固定张量右侧填充-1.0作为无效区域。这个valid_ratio会随 batch 一起传入网络见KeepKeys的keep_keys在 rec_sar_head.py 中用于两处 mask编码器取全局特征时按valid_ratio对齐到有效宽度对应的时间步解码器_2d_attention计算注意力权重时将valid_ratio之外的宽度位置注意力得分置为-infsoftmax 后权重为 0从而自动忽略填充区域的干扰。width_downsample_ratio: 0.25表示宽度方向下采样倍率为 1/4它决定了宽度方向的整除约束以及后续注意力图的空间粒度。SARLabelEncodelabel_ops.py 第 867 行起负责标签编码在字典末尾追加三个特殊 token并把标签构造成[BOS] 文本索引 [EOS]后填充到max_text_length长度若编码后文本长度超过max_text_length - 1则丢弃该样本。5. 模型训练 / 评估 / 预测按 文本识别训练教程 准备好数据后即可开始 SAR 训练。由于 PaddleOCR 代码模块化整个训练流程只需通过配置文件驱动。5.1 训练# 单卡训练训练周期较长不推荐 python3 tools/train.py -c configs/rec/rec_r31_sar.yml # 多卡训练通过 --gpus 参数指定使用的 GPU 编号 python3 -m paddle.distributed.launch --gpus 0,1,2,3 tools/train.py -c configs/rec/rec_r31_sar.yml入口脚本为 tools/train.py通过-c指定配置文件多卡场景使用 Paddle 内置的paddle.distributed.launch启动器--gpus传逗号分隔的 GPU 编号训练过程中每print_batch_step20步打印一次日志每eval_batch_step[0, 2000]评估一次cal_metric_during_train: True时训练中同步计算指标模型权重按save_epoch_step: 1每个 epoch 保存一次到save_model_dir: ./sar_rec。5.2 评估# GPU 评估 python3 -m paddle.distributed.launch --gpus 0 tools/eval.py -c configs/rec/rec_r31_sar.yml -o Global.pretrained_model{path/to/weights}/best_accuracy评估入口为 tools/eval.py复用训练配置文件通过-o Global.pretrained_model{path/to/weights}/best_accuracy指定待评估权重注意-o命令行覆盖的优先级高于配置文件评估时数据管线自动切换为Eval.datasetLMDBDataSet并按RecMetric计算准确率。5.3 预测单张图片# 预测使用的配置文件必须与训练保持一致 python3 tools/infer_rec.py -c configs/rec/rec_r31_sar.yml -o Global.pretrained_model{path/to/weights}/best_accuracy Global.infer_imgdoc/imgs_words/en/word_1.png入口脚本为 tools/infer_rec.pyGlobal.infer_img指定待识别图片预测结果与置信度会写入save_res_path: ./output/rec/predicts_sar.txt关键约束预测时的配置字典、max_text_length、use_space_char等必须与训练完全一致否则解码会错乱。6. 推理与部署6.1 Python 推理第一步导出推理模型训练得到的动态图权重例如从 rec_r31_sar_train.tar 下载的模型解压后权重位于./rec_r31_sar_train/best_accuracy需要先转换为推理模型python3 tools/export_model.py -c configs/rec/rec_r31_sar.yml -o Global.pretrained_model./rec_r31_sar_train/best_accuracy Global.save_inference_dir./inference/rec_sar导出脚本为 tools/export_model.py输出目录由Global.save_inference_dir指定此处为./inference/rec_sar导出产物为inference.pdmodel模型结构与inference.pdiparams模型参数两个文件。第二步执行推理python3 tools/infer/predict_rec.py --image_dir./doc/imgs_words/en/word_1.png --rec_model_dir./inference/rec_sar/ --rec_image_shape3, 48, 48, 160 --rec_algorithmSAR --rec_char_dict_pathppocr/utils/dict90.txt --max_text_length30 --use_space_charFalse关键参数与训练配置的对应关系如下推理参数值对应训练配置--rec_image_shape3, 48, 48, 160SARRecResizeImg.image_shape--rec_algorithmSARArchitecture.algorithm--rec_char_dict_pathppocr/utils/dict90.txtGlobal.character_dict_path--max_text_length30Global.max_text_length--use_space_charFalseGlobal.use_space_char推理时同样会经由 SARLabelDecode 进行后处理遇到BOS/EOS结束、跳过PAD并在rm_symbol生效时剔除符号。6.2 C 推理SAR 暂不支持 C 推理文档标注为 Not supported。6.3 Serving 服务化部署SAR 暂不支持 Serving 服务化部署文档标注为 Not supported。6.4 更多部署方式SAR 暂不支持其他部署方式文档标注为 Not supported。如需在端侧部署可关注 PaddleOCR 中支持 C/移动端推理的其他识别算法如 PP-OCRv4/PP-OCRv5 系列参考 docs/version3.x/ 下的部署文档。7. 常见问题FAQ与复现要点输入形状为什么是[3, 48, 48, 160]而不是[3, 32, 100]SAR 的解码器需要在 2D 特征图上计算注意力宽度信息必须保留因此采用高度固定、宽度动态48~160的输入策略并通过valid_ratio屏蔽填充区域。为什么use_space_charFalse官方复现针对单词级识别dict90 无空格字符若需识别含空格的自然语句文本应改为True并配合对应字典。精度达不到 87.20% 怎么办官方精度是在 MJSynth SynthText SynthAdd 部分真实数据上训练得到的。仅使用两个公开数据集训练时建议适当增加epoch_num或调整学习率衰减节奏并检查valid_ratio相关 mask 是否正确生效。如何查看训练日志与指标训练日志中会打印 lossSARLoss输出cal_metric_during_train: True时还会同步打印 acc也可将Global.use_visualdl设为True使用 VisualDL 可视化。8. 引用如需在论文或项目中引用 SAR建议使用官方 BibTeXarticle{Li2019ShowAA, title{Show, Attend and Read: A Simple and Strong Baseline for Irregular Text Recognition}, author{Hui Li and Peng Wang and Chunhua Shen and Guyu Zhang}, journal{ArXiv}, year{2019}, volume{abs/1811.00751} }延伸阅读文本识别算法家族对比docs/version2.x/algorithm/text_recognition/SAR 与 CRNN、NRTR、SATRN、RARE 等并列文本识别训练通用教程docs/version2.x/ppocr/model_train/recognition.en.mdSAR 源码实现ppocr/modeling/heads/rec_sar_head.py、ppocr/losses/rec_sar_loss.pySAR 数据增强实现ppocr/data/imaug/rec_img_aug.py、ppocr/data/imaug/label_ops.pySAR 后处理实现ppocr/postprocess/rec_postprocess.py训练入口tools/train.py、tools/eval.py、tools/infer_rec.py、tools/export_model.py【免费下载链接】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),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。