PaddleOCR 中 SAR 不规则文本识别算法:原理、训练与推理部署实践
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/PaddleOCR导读本文聚焦 PaddleOCR 中对 SARShow, Attend and Read不规则文本识别算法的完整支持从算法动机与网络结构出发结合 SAR 算法配置 与 SAR Head 源码实现系统讲解数据预处理、标签编码、损失计算、训练/评估/预测全流程命令以及 Python 推理部署的完整步骤。读完本文你将掌握在 PaddleOCR 中基于 ResNet31 SAR 结构复现不规则文本识别模型的全套实操方法并理解 2D 注意力解码器在其中的关键作用。1. SAR 算法简介与原理1.1 论文信息SARShow, Attend and Read: A Simple and Strong Baseline for Irregular Text Recognition由 Hui Li、Peng Wang、Chunhua Shen、Guyu Zhang 提出发表于 AAAI 2019论文为Show, Attend and Read: A Simple and Strong Baseline for Irregular Text RecognitionarXiv: 1811.00751。该算法的核心动机是常规文本识别方法如基于 CTC 或一维序列注意力难以处理弯曲、透视畸变等不规则文本。SAR 通过引入二维2D注意力机制让解码器能够直接在整张特征图上看Attend到字符对应区域的二维位置从而对不规则文本具备更强的鲁棒性同时保持结构简单、效果稳定。1.2 算法结构总览在 PaddleOCR 中SAR 算法采用骨干网络 编码器 并行解码器的经典结构对应 SARHead 的三段式组装SARHead.__init__中依次构建SAREncoder与ParallelSARDecoder模块PaddleOCR 实现类源码位置作用骨干网络BackboneResNet31rec_resnet_31.py提取图像的卷积特征图序列编码器EncoderSAREncoderrec_sar_head.py将二维特征压缩为全局整体特征holistic feature并行解码器DecoderParallelSARDecoderrec_sar_head.py通过 2D 注意力逐字符解码损失函数SARLossrec_sar_loss.py带 padding 忽略的交叉熵损失标签编码SARLabelEncodelabel_ops.py添加 BOS/EOS、UKN、PAD 特殊字符图像预处理SARRecResizeImgrec_img_aug.py保持宽高比缩放 按有效宽度 padding后处理解码SARLabelDecoderec_postprocess.py将索引序列还原为文本编码器要点对应SAREncoder.forward对骨干输出的特征图feat (bsz, C, H, W)沿高度方向做max_pool2d得到(bsz, C, W)转置后送入 2 层 LSTM默认单向得到逐列时序特征再取最后一个有效时间步依据valid_ratio掩码计算作为整体特征经线性层映射后输出。解码器要点对应ParallelSARDecoder._2d_attention解码器在训练时以真实标签teacher forcing并行输入在推理时以自回归方式逐步生成。每一步都执行一次2D 注意力用3x3卷积将编码特征图变换为注意力 Key用解码器隐状态变换为注意力 Query通过 softmax 在二维空间上加权求和得到glimpse特征再与隐状态、整体特征拼接后经线性层输出字符类别分布——这正是pred_concatTrue时的特征融合方式。1.3 数据与复现效果PaddleOCR 官方使用 MJSynth 和 SynthText 两个合成数据集训练 SAR 模型并在 IIIT、SVT、IC03、IC13、IC15、SVTP、CUTE 等不规则文本基准上进行评估复现效果如下模型骨干网络配置文件Acc下载链接SARResNet31rec_r31_sar.yml87.20%rec_r31_sar_trainPaddleOCR 官方模型库注除了 MJSynth 与 SynthText 外复现时还加入了 SynthAdd 合成数据百度网盘提取码 627x和部分真实数据具体数据细节可参考论文。2. 环境配置开始训练前请先按 《运行环境准备》 配置好 PaddlePaddle 与 PaddleOCR 运行环境并按 《项目克隆》 克隆当前仓库代码。环境就绪后进入仓库根目录即可执行后续所有命令。3. 配置文件详解rec_r31_sar.ymlPaddleOCR 对代码进行了高度模块化训练不同识别模型只需更换配置文件。SAR 的完整训练配置位于 configs/rec/rec_r31_sar.yml下面逐段解读3.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 个 iter 执行一次评估 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.txtcharacter_dict_path字符字典路径SAR 使用 dict90.txt90 个字符类。结合 SARLabelEncode.add_special_char实际会在字典末尾追加UKN、BOS/EOS、PAD三个特殊 token因此模型输出类别数为90 3 93SARLoss 中默认ignore_index92正是PAD的索引。max_text_length: 30最大解码序列长度解码器按此长度自回归展开。use_space_char: False不额外加入空格字符。rm_symbol: True后处理时移除符号见 SARLabelDecode.decode 中的正则过滤与小写化。3.2 模型结构与损失Architecture: model_type: rec algorithm: SAR Transform: Backbone: name: ResNet31 Head: name: SARHead Loss: name: SARLoss PostProcess: name: SARLabelDecode Metric: name: RecMetricArchitecture.algorithm: SARPaddleOCR 据此匹配对应的识别算法组装逻辑。Backbone.name: ResNet31使用 ResNet31 骨干网络31 层残差结构。Head.name: SARHead由SAREncoderParallelSARDecoder组成可配置enc_bi_rnn、enc_gru、dec_bi_rnn、d_k、pred_dropout、pred_concat等超参数均有默认值配置中未写则使用源码默认。Loss.name: SARLoss交叉熵损失训练时丢弃解码输出的最后一位、并忽略标签首位的 BOS token与标签序列长度对齐详见 SARLoss.forward。3.3 优化器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 优化器 分段常数衰减学习率第 3 个 epoch 降至 1e-4第 4 个 epoch 再降至 1e-5共训练 5 个 epoch。3.4 数据预处理Train / Eval 数据集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] 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]关键点说明image_shape: [3, 48, 48, 160]四维形式依次为通道数 3、高度 48、最小宽度 48、最大宽度 160。在 resize_norm_img_sar 中图像按w/h比例缩放到固定高度 48宽度在[48, 160]范围内且必须是width_divisor 1/0.25 4的整数倍。valid_ratio实际缩放宽度与最大宽度之比超宽图被截断时 1.0。该值作为img_metas传入编码器/解码器用于掩蔽 padding 区域——编码器取最后一个有效时间步、解码器将超宽部分注意力权重置为-inf见 SAREncoder.forward 与_2d_attention中的 valid_width 掩码逻辑。图像归一化方式/255后减 0.5 再除以 0.5padding 区域填充-1.0。KeepKeys保留image, label, valid_ratiodataloader 按此顺序返回供 loss 与解码使用。训练集使用SimpleDataSet文本列表格式评估集使用LMDBDataSetLMDB 格式SAR 官方复现的评估数据为data_lmdb_release/evaluation/目录。4. 模型训练、评估、预测4.1 训练在完成数据准备按 文本识别教程 组织train_data/与train_list.txt后即可启动训练# 单卡训练训练周期长不建议 python3 tools/train.py -c configs/rec/rec_r31_sar.yml # 多卡训练通过 --gpus 参数指定卡号 python3 -m paddle.distributed.launch --gpus 0,1,2,3 tools/train.py -c configs/rec/rec_r31_sar.yml训练过程中每 2000 个 iter 会自动执行一次评估eval_batch_step: [0, 2000]并默认在./sar_rec/目录下按 epoch 保存模型save_model_dir、save_epoch_step: 1。4.2 评估# GPU 评估Global.pretrained_model 为待测权重 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评估指标由Metric.name: RecMetric计算在 rec_metric.py 中实现统计准确率Acc与编辑距离edit distance等指标。4.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.pnginfer_rec.py是面向单张图片/目录的识别入口内部同样走 SARLabelEncode 的字典构造与 SARLabelDecode 的后处理解码流程。5. 推理部署5.1 Python 推理inference model首先将训练保存的模型导出为 inference model官方提供的预训练权重 rec_r31_sar_train 可直接下载使用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导出后可调用 predict_rec.py 执行推理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_shape必须与训练配置中的image_shape一致3, 48, 48, 160。--rec_algorithmSAR指定推理走 SAR 算法分支。--rec_char_dict_path字典与训练一致dict90.txt。--max_text_length30解码最大长度。--use_space_charFalse与训练配置保持一致。5.2 C 推理由于 C 端预处理/后处理暂未支持 SAR 算法因此C 推理暂未支持。5.3 Serving 服务化部署暂不支持。5.4 更多推理部署暂不支持Paddle Lite、Paddle2ONNX 等链路同样未覆盖 SAR请以官方后续版本支持情况为准。在实际使用时请以当前仓库 tools/infer 与 deploy 目录下的实现为准确认所采用部署方式对 SAR 算法的支持状态。6. 深入源码SAR 的训练与推理流程为进一步理解上述命令背后的执行链路可以从两个角度快速定位源码训练数据流SimpleDataSet读取图片 →DecodeImage解码 →SARLabelEncode将标签转为[BOS, ...chars, EOS]并 padding 到max_text_lengthlabel_ops.py→SARRecResizeImg得到归一化图像与valid_ratio→SARHead前向 →SARLoss计算交叉熵。推理数据流SARRecResizeImg预处理 →SARHead.forward_test中以BOS起始自回归解码max_seq_len步rec_sar_head.py→SARLabelDecode去除PAD、在EOS处截断并还原文本rec_postprocess.py。其中值得注意的工程细节标签结构SAR 在推理时并不做去重合并CTC 式的合并而是依赖BOS/EOS标记指示序列起止因此is_remove_duplicateFalse。掩码机制valid_ratio贯穿编码与解码全程是 SAR 处理变宽图像的关键——它保证 padding 区域不参与注意力计算避免引入噪声。损失对齐SARLoss 通过predict[:, :-1]与label[:, 1:]的对齐方式巧妙处理了训练时解码器多出的 BOS 前缀位。7. FAQQ1SAR 与基于 CTC 的识别模型如 CRNN有什么区别SAR 属于基于注意力机制的识别模型解码器在二维特征图上进行软注意力加权天然适合弯曲、倾斜等不规则文本而 CTC 模型通常对序列建模更高效、训练更快但在不规则文本上表现相对受限。选择哪种取决于数据形态与部署成本。Q2valid_ratio是什么为什么推理命令中看不到它valid_ratio是预处理阶段由 resize_norm_img_sar 计算出的实际缩放宽度 / 最大宽度比例随样本自动计算并传入模型用于掩蔽 padding 区域无需在命令行手动指定。Q3为什么配置文件里image_shape是四维[3, 48, 48, 160]这是 SAR 特化的变宽输入表示前两维为通道数与固定高度后两维为宽度范围最小 48、最大 160。与普通识别模型固定[3, 32, 320]的三维写法不同SAR 允许宽度在区间内动态变化超出最大宽度时以valid_ratio记录截断比例。8. 引用article{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/ppocr/model_train/recognition.md环境准备与项目克隆docs/version2.x/ppocr/environment.md、docs/version2.x/ppocr/blog/clone.mdSAR 配置文件configs/rec/rec_r31_sar.ymlSAR 模型实现ppocr/modeling/heads/rec_sar_head.pySAR 预处理与后处理ppocr/data/imaug/rec_img_aug.py、ppocr/data/imaug/label_ops.py、ppocr/postprocess/rec_postprocess.py识别推理入口tools/infer/predict_rec.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),仅供参考

相关新闻

16 类 Adobe 软件替代方案:200 余款工具按场景选型

16 类 Adobe 软件替代方案:200 余款工具按场景选型

16 类 Adobe 软件替代方案:200 余款工具按场景选型 【免费下载链接】Adobe-Alternatives A list of alternatives for Adobe software 项目地址: https://gitcode.com/GitHub_Trending/ad/Adobe-Alternatives Adobe-Alternatives 是社区维护的 Adobe 替代方案…

2026/9/18 8:47:40 阅读更多 →
数据分析和画图本来是一件事:图分三档用,分析才推得动

数据分析和画图本来是一件事:图分三档用,分析才推得动

一边跑分析一边要出图,这两条线怎么并着往前走?图常被拖到章节交稿才补。图本来就分三档:自己看形状的、并排对读数的、留进章节的;认出手上这一张属于哪档,两条线才推得动。写论文时有两件事免费用得上:一…

2026/9/18 8:47:40 阅读更多 →
VoiceStudio语音工作台:批量合成与稳定流水线实践

VoiceStudio语音工作台:批量合成与稳定流水线实践

做语音内容这几年,我最怕的不是没灵感,而是素材散。一段三分钟的旁白,可能要经历录音笔采集、Audacity粗剪、某在线工具降噪、另一个网页端做合成补录、最后再导回剪辑软件对齐时间轴。中间任何一个环节换台机器、换个浏览器,参数…

2026/9/18 8:47:40 阅读更多 →

最新新闻

Spring Boot毕业设计成绩管理系统:从流程设计到并发控制

Spring Boot毕业设计成绩管理系统:从流程设计到并发控制

简介:一份围绕毕业设计成绩管理系统设计与实现的完整技术文档,后端以SpringBoot框架为核心,配合Eclipse开发环境和MySQL数据库,针对传统信息管理方式中处理耗时长、数据差错率高、修改繁琐和检索不便等问题,给出了计算…

2026/9/18 9:35:10 阅读更多 →
基于Spring Boot的家政服务管理平台设计与实现

基于Spring Boot的家政服务管理平台设计与实现

最近身边好几个学弟学妹在做Java方向的毕业设计,选题五花八门,但问得最多的就是这种“XX管理平台”类型的项目。我手上正好有一个做完了的“保清家政服务管理平台”,基于Java的全套家政服务数字化运营系统,从前端页面到后端接口再…

2026/9/18 9:35:10 阅读更多 →
大型应用系统架构设计:稳定性设计与高并发防护实践

大型应用系统架构设计:稳定性设计与高并发防护实践

简介:这是聚焦大型应用系统稳定性的实战型PPT,内容整理自新浪微博稳定性经验谈,适合系统架构师、后端研发与运维人员参考。资源共1个文件,为可直接浏览和分享的PPTX演示文稿(约37页),压缩包大小…

2026/9/18 9:35:10 阅读更多 →
CockroachDB读写架构解析:Raft复制、MVCC与租约读

CockroachDB读写架构解析:Raft复制、MVCC与租约读

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/18 9:35:10 阅读更多 →
亚马逊消费者法案审核技术解析与申诉指南

亚马逊消费者法案审核技术解析与申诉指南

1. 亚马逊消费者法案审核的技术逻辑解析作为跨境电商卖家,我经历过多次亚马逊消费者法案审核的"洗礼"。这个审核机制本质上是一套精密设计的自动化风控系统,专门用来验证卖家是否符合欧盟《消费者权益指令》的要求。根据我的实操经验&#xff…

2026/9/18 9:35:10 阅读更多 →
做婚恋网站的翻译好吗?附建站避坑指南

做婚恋网站的翻译好吗?附建站避坑指南

做婚恋网站的翻译好吗?附建站避坑指南 网站被黑挂马,后台数据一夜清零,这时候你才想起之前为了省事没做安全防护?别急,这种惨痛教训我见得太多了。很多老板以为只要页面漂亮、功能齐全就能赚钱,结果上线没几天,服务器就被植入了木马,用户信息泄露,品牌声誉毁于一旦。…

2026/9/18 9:34:27 阅读更多 →

日新闻

Matlab手写逻辑回归:从数学原理到多变量概率预测模型实现

Matlab手写逻辑回归:从数学原理到多变量概率预测模型实现

很多朋友第一次看到"逻辑回归"这四个字,第一反应就是——这玩意儿是个回归模型吧?我当年也是在Matlab里跑完一段代码,看着输出的0.73、0.86这种概率值,才回过神来:这家伙其实是披着回归外衣的分类神器&#…

2026/9/18 0:00:28 阅读更多 →
高值医用耗材研报PDF:用Python完成字段抽取、清洗与趋势预测

高值医用耗材研报PDF:用Python完成字段抽取、清洗与趋势预测

简介:这份报告是2023-2028年高值医用耗材行业调研及发展前景趋势预测报告,面向医疗器械企业管理者、投资机构、行业研究人员及关注政策变化的从业者,用于把握行业监管动向、市场格局与未来趋势。报告以PDF格式呈现,共1个文件、整体…

2026/9/18 0:00:28 阅读更多 →
三维高斯场赋能世界模型:几何语义蒸馏与机器人决策实战

三维高斯场赋能世界模型:几何语义蒸馏与机器人决策实战

先把我自己的背景交代一下:我之前在搞具身智能和机器人导航相关的项目,很长一段时间里都被“环境表示”这件事卡着。传统做法是用点云或者网格做几何建模,语义信息另外再跑分割模型,两套东西各管各的,时间一长就会发现…

2026/9/18 0:00:28 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/16 19:03:19 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/17 7:57:36 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/17 10:19:14 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/16 22:31:27 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/15 21:39:18 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/16 22:32:59 阅读更多 →