PaddleOCR 印刷公式识别算法 PP-FormulaNet 实战指南:从模型选型、环境配置到训练评估与推理 PaddleOCR 印刷公式识别算法 PP-FormulaNet 实战指南从模型选型、环境配置到训练评估与推理【免费下载链接】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/PaddleOCRPP-FormulaNet 是 PaddleOCR 仓库中面向印刷数学公式识别的端到端 LaTeX 识别算法提供 S / L 两个版本分别面向简单印刷公式与复杂/手写公式场景。本文以 PaddleOCR 官方文档 docs/version2.x/algorithm/formula_recognition/algorithm_rec_ppformulanet.md 为主线结合仓库源码与配置文件完整讲解该算法的精度表现、环境搭建、数据准备、训练、评估、预测全流程并深入解析其网络结构、并行解码与损失函数等底层实现帮助读者在 PaddleOCR 框架下独立复现并调优 PP-FormulaNet 公式识别模型。1. 算法简介PP-FormulaNet是由百度飞桨视觉团队开发的先进公式识别模型支持识别 5 万个常见 LaTeX 源码词汇。它包含两个版本PP-FormulaNet-S采用 PP-HGNetV2-B4 作为骨干网络通过并行掩码parallel masking和模型蒸馏等技术大幅提升推理速度并保持高识别精度适用于简单印刷公式和跨行简单印刷公式等场景。其解码器仅 2 层、FFN 维度 1536、隐层维度 384配合parallel_step3的并行解码策略单张图推理耗时仅约 202ms。PP-FormulaNet-L基于 Vary_VIT_B 骨干并经过大规模公式数据集的深入训练在复杂公式识别方面表现显著提升适用于简单印刷、复杂印刷和手写公式。其解码器 8 层、隐层维度 512输入分辨率 768×768推理耗时约 1976ms属于追求精度上限的高配版本。从仓库源码看两个版本的差异同样体现在配置文件中S 版本在 configs/rec/PP-FormuaNet/PP-FormulaNet-S.yaml 中开启use_parallel: True、parallel_step: 3而 L 版本在 configs/rec/PP-FormuaNet/PP-FormulaNet-L.yaml 中关闭并行解码use_parallel: False同时输入尺寸从 384×384 提升到 768×768。上述模型在对应测试集上的精度如下模型骨干网络配置文件En-BLEU↑GPU推理耗时ms下载链接UniMERNetDonut SwinUniMERNet.yaml85.912266.96训练模型PP-FormulaNet-SPPHGNetV2_B4PP-FormulaNet-S.yaml87.00202.25训练模型PP-FormulaNet-LVary_VIT_BPP-FormulaNet-L.yaml90.361976.52训练模型LaTeX-OCRHybrid ViTLaTeX_OCR_rec.yaml74.551244.61训练模型其中英文公式评估集包含 UniMERNet 的简单和复杂公式以及 PaddleX 内部自建的简单、中等和复杂公式。可以看出PP-FormulaNet-S 以不足 UniMERNet 十分之一的推理耗时取得了更高的 BLEU 分数而 PP-FormulaNet-L 则在 BLEU 上进一步拉开差距达到 90.36。2. 环境配置在开始训练前请先参考 《运行环境准备》 配置 PaddleOCR 运行环境包括 PaddlePaddle 安装、依赖库安装等再参考 《项目克隆》 克隆项目代码。此外公式识别任务还需要安装额外的依赖sudo apt-get update sudo apt-get install libmagickwand-dev pip install -r docs/version2.x/algorithm/formula_recognition/requirements.txt其中libmagickwand-dev用于提供 ImageMagick Wand 库图片格式转换与数据增强依赖requirements.txt位于 docs/version2.x/algorithm/formula_recognition/requirements.txt中声明的依赖包括tokenizers0.19.1HuggingFace 快速分词器用于加载unimernet_tokenizer词表并对 LaTeX 序列做编码/解码imagesize读取图片尺寸的轻量工具ftfy文本编码修复工具WandImageMagick 的 Python 绑定用于 LatexImageFormat 等图像格式转换。3. 模型训练、评估、预测3.1 准备数据集下载 PaddleX 官方示例数据集LaTeX-OCR 格式的印刷公式数据# 下载 PaddleX 官方示例数据集 wget https://paddle-model-ecology.bj.bcebos.com/paddlex/data/ocr_rec_latexocr_dataset_example.tar tar -xf ocr_rec_latexocr_dataset_example.tar解压后目录中应包含train.txt与val.txt两个标注文件配置文件中label_file_list会引用它们标注格式为图片路径 制表符 LaTeX 标签训练图片与标注文件位于同一数据目录下。3.2 下载预训练模型# 下载 PP-FormulaNet-S 预训练模型 wget https://paddleocr.bj.bcebos.com/contribution/rec_ppformulanet_s_train.tar tar -xf rec_ppformulanet_s_train.tar训练 PP-FormulaNet-L 时同理下载rec_ppformulanet_l_train.tar并解压。解压后得到的目录内含best_accuracy.pdparams权重文件后续训练、评估与预测命令中的Global.pretrained_model均指向该文件。3.3 模型训练PaddleOCR 对代码进行了模块化设计训练PP-FormulaNet-S识别模型时需要更换配置文件为 PP-FormulaNet-S 的 配置文件。完整的训练教程可参考 文本识别训练教程。启动训练具体地在完成数据准备后便可以启动训练训练命令如下# 单卡训练 (默认训练方式) python3 tools/train.py -c configs/rec/PP-FormuaNet/PP-FormulaNet-S.yaml \ -o Global.pretrained_model./rec_ppformulanet_s_train/best_accuracy.pdparams # 多卡训练通过 --gpus 参数指定卡号 python3 -m paddle.distributed.launch --gpus 0,1,2,3 --ips127.0.0.1 tools/train.py -c configs/rec/PP-FormuaNet/PP-FormulaNet-S.yaml \ -o Global.pretrained_model./rec_ppformulanet_s_train/best_accuracy.pdparams注意默认每训练 1 个 epoch179 次 iteration进行 1 次评估若您更改训练的 batch_size或更换数据集请在训练时作出如下修改python3 -m paddle.distributed.launch --gpus 0,1,2,3 --ips127.0.0.1 tools/train.py -c configs/rec/PP-FormuaNet/PP-FormulaNet-S.yaml \ -o Global.eval_batch_step[0,{length_of_dataset//batch_size//4}] \ Global.pretrained_model./rec_ppformulanet_s_train/best_accuracy.pdparams关于配置文件中的关键训练超参从 configs/rec/PP-FormuaNet/PP-FormulaNet-S.yaml 中可以看到Global.epoch_num: 20、Global.eval_batch_step: [0, 179]共训练 20 个 epoch每 179 次迭代评估一次batch_size56 时恰好 1 个 epochGlobal.max_new_tokens: 1024解码最大生成 token 数作为 LaTeX 序列长度的上限Global.input_size: [384, 384]训练输入图像分辨率L 版本为[768, 768]Global.rec_char_dict_path: ppocr/utils/dict/unimernet_tokenizer指向仓库 ppocr/utils/dict/unimernet_tokenizer 目录内含tokenizer.json与tokenizer_config.json是约 5 万词表规模的 BPE 分词器Optimizer: AdamWbeta10.9beta20.999weight_decay0.05学习率采用LinearWarmupCosine策略初始学习率 0.0001Train.loader.batch_size_per_card: 14单卡 batch sizeL 版本为 6因 768×768 输入显存开销更大Loss与PostProcess分别使用PPFormulaNet_S_Loss与UniMERNetDecodeMetric使用LaTeXOCRMetric主指标为exp_rate并开启cal_bleu_score: True。3.4 评估可下载已训练完成的模型文件使用如下命令进行评估# 注意将 pretrained_model 的路径设置为本地路径。若使用自行训练保存的模型请注意修改路径和文件名为 {path/to/weights}/{model_name}。 # demo 测试集评估 python3 tools/eval.py -c configs/rec/PP-FormuaNet/PP-FormulaNet-S.yaml -o \ Global.pretrained_model./rec_ppformulanet_s_train/best_accuracy.pdparams评估脚本会按Eval.dataset中配置的val.txt读取测试集输出exp_rate公式完全正确率、bleu_scoreBLEU 分数等指标。从 ppocr/metrics/rec_metric.py 的LaTeXOCRMetric实现可以看到评估时不仅统计整条 LaTeX 序列完全一致的exp_rate还会计算 BLEU 分数、编辑距离edit distance以及编辑距离 ≤1/≤2/≤3 时的 E1/E2/E3 指标方便对识别结果进行细粒度分析。3.5 预测使用如下命令进行单张图片预测# 注意将 pretrained_model 的路径设置为本地路径。 python3 tools/infer_rec.py -c configs/rec/PP-FormuaNet/PP-FormulaNet-S.yaml \ -o Global.infer_img./docs/datasets/images/pme_demo/0000295.png \ Global.pretrained_model./rec_ppformulanet_s_train/best_accuracy.pdparams # 预测文件夹下所有图像时可修改 infer_img 为文件夹如 Global.infer_img./doc/datasets/pme_demo/。预测结果默认保存至Global.save_res_path指定的文件S 版本默认为./output/rec/predicts_pp_formulanet_s.txt每一行包含图片路径与识别出的 LaTeX 源码。若手头没有 demo 图片可将Global.infer_img指向任意包含公式图片的本地目录。4. 源码级原理PP-FormulaNet 的网络结构与推理机制PP-FormulaNet 的完整实现散落在 PaddleOCR 的建模、损失、后处理与评估模块中理解这些源码有助于针对自己的公式数据集做更深度的调优。4.1 骨干网络编码端特征提取PP-FormulaNet-S使用PPHGNetV2_B4_Formula实现在 ppocr/modeling/backbones/rec_pphgnetv2.py。它基于 PPHGNetV2 构建 4 个 stage输出通道依次为 128/512/1024/2048最终把特征图reshape transpose为[B, H*W, C]的序列形式并包装成DonutSwinModelOutput输出供下游解码器做交叉注意力。配置文件中的class_num: 1024作为 PPHGNetV2 分类头维度传入。PP-FormulaNet-L使用Vary_VIT_B_Formula实现位于 ppocr/modeling/backbones/rec_vary_vit.py配置了encoder_embed_dim: 768、encoder_depth: 12、encoder_num_heads: 12并在[2, 5, 8, 11]层使用全局注意力是标准的 ViT 编码器结构。4.2 解码端基于 MBart 的自回归解码与并行掩码PPFormulaNet_Head实现在 ppocr/modeling/heads/rec_ppformulanet_head.py它继承自UniMERNetHead核心要点包括MBart 风格解码器内部构建MBartConfigvocab_size50000与5 万常见 LaTeX 词汇对应使用CustomMBartForCausalLM/CustomMBartDecoder完成自回归生成解码器配置了forced_eos_token_id2、pad_token_id1并通过LogitsProcessorListForcedEOSTokenLogitsProcessor强制在序列末端输出 EOS并行掩码parallel maskingS 版本开启use_parallelTrue、parallel_step3即每步并行预测 3 个 token。AttentionMaskConverter._make_causal_mask_parallel同文件 L122-L165专门构造允许每步看前面 3 个位置的因果掩码从而把解码迭代次数压缩到原来的 1/3这是 S 版本推理速度大幅领先的关键stopping_criteria_parallel则负责在并行解码下判断 EOS 是否出现生成策略generate训练/普通推理与generate_export静态图导出两个入口都实现了循环解码先通过prepare_inputs_for_generation准备decoder_input_ids再调用generate_single_iter前向解码器取 logits经logits_processor后argmax采样直到产出 EOS 或达到max_new_tokens上限长度感知length_awareS 版本配置length_aware: True用于对超长公式序列做自适应处理。4.3 损失函数与后处理损失函数ppocr/losses/rec_ppformulanet_loss.py 中PPFormulaNet_S_Loss与PPFormulaNet_L_Loss均采用CrossEntropyLossignore_index-100忽略 pad token区别在于 S 版本因并行解码需将标签平移parallel_step个位置后再计算交叉熵masked_label[:, self.parallel_step:]L 版本则为常规的masked_label[:, 1:]后处理ppocr/postprocess/rec_postprocess.py 中的UniMERNetDecode通过tokenizers.Tokenizer加载tokenizer.json将模型输出的 token id 序列解码为 LaTeX 字符串并管理s、/s、pad等特殊 token。4.4 评估指标LaTeXOCRMetric见 ppocr/metrics/rec_metric.py在cal_bleu_scoreTrue时输出bleu_score与exp_rate两个核心指标此外还计算归一化编辑距离与 E1/E2/E3编辑距离 ≤1/2/3 的样本占比其中exp_rate是主指标main_indicator: exp_rate用于在训练过程中挑选最佳 checkpoint。5. FAQQ1训练时评估频率如何调整默认配置为每 179 次迭代S 版本batch_size56 时约 1 个 epoch评估一次L 版本为每 417 次迭代。若修改了batch_size_per_card或更换了数据集请按 3.3 节给出的公式同步修改Global.eval_batch_step[0, {length_of_dataset//batch_size//4}]保证评估节奏合理且不过于频繁。Q2显存不足怎么办优先降低Train.loader.batch_size_per_cardS 版本默认 14L 版本默认 6并同步按 Q1 的公式调整eval_batch_step也可以考虑降低Global.input_size如从 768×768 降到 640×640以缓解显存压力但需注意会略微影响复杂公式的识别精度。Q3S 与 L 版本应该如何选择追求推理速度、面向简单印刷公式或跨行简单公式的在线服务场景选PP-FormulaNet-S约 202ms/张BLEU 87.00追求识别精度、面向复杂印刷公式甚至手写公式的离线批量场景选PP-FormulaNet-L约 1976ms/张BLEU 90.36。Q4Parallel_step的作用是什么可以修改吗parallel_step3表示解码器每步同时预测 3 个 token并行掩码解码是 S 版本加速的核心。修改它需要同时调整Head、Loss中的parallel_step以及max_position_embeddings源码中max_new_tokens parallel_step等配置并重新训练不建议在预训练权重上直接改动。Q5想换成自己的公式数据集训练标注格式是什么与 PaddleOCR 通用识别数据集一致训练图片与train.txt/val.txt放在同一数据目录配置文件data_dir指向该目录每行内容为图片路径\tLaTeX标签再修改配置中Train.dataset.label_file_list与Eval.dataset.label_file_list指向对应的 txt 即可。具体数据格式细节可参考 文本识别训练教程 的数据准备章节。Q6评估时同时输出 BLEU 与 exp_rate 吗是的。LaTeXOCRMetric在cal_bleu_score: True时同时计算并输出bleu_score、exp_rate以及编辑距离、E1/E2/E3 等统计量其中exp_rate作为main_indicator决定最优模型的选择。【免费下载链接】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),仅供参考