
PaddleOCR 中的 UniMERNet 通用数学公式识别从数据准备到训练、评估与推理的完整实战指南【免费下载链接】PaddleOCRTurn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between images/PDFs and LLMs. Supports 100 languages.项目地址: https://gitcode.com/GitHub_Trending/pa/PaddleOCR导读本文基于 PaddleOCR 仓库中的 算法文档 与 UniMERNet 配置文件系统讲解如何在 PaddleOCR 中复现、训练、评估与推理通用数学公式识别模型 UniMERNet。读完本文你将掌握UniMERNet 在 PaddleOCR 中的整体架构与复现精度、四个标准测试集SPE/CPE/SCE/HWE的指标含义、从 UniMER-1M 与 HME100K 原始数据到 PaddleOCR 训练格式的完整转换流程以及单卡/多卡训练、分测试集评估与单图预测的完整命令行操作并了解其背后的源码实现细节。1. UniMERNet 算法简介与复现精度1.1 算法背景UniMERNet 是一个面向通用数学公式识别Mathematical Expression Recognition, MER的端到端模型原始项目由 OpenDataLab 团队开源。PaddleOCR 将其以模块化方式集成进文本识别rec体系使用Donut Swin作为视觉骨干网络编码器配合自研的 UniMERNetHead 解码器将公式图片端到端转换为 LaTeX 序列。由于 PaddleOCR 对代码做了模块化训练不同识别模型只需要更换配置文件因此本文全部操作的核心配置文件是 configs/rec/UniMERNet.yaml。1.2 复现指标说明PaddleOCR 使用 UniMERNet 通用公式识别数据集训练、并在对应测试集上评估复现结果如下表模型骨干网络配置文件SPE-BLEU↑SPE-EditDis↓CPE-BLEU↑CPE-EditDis↓SCE-BLEU↑SCE-EditDis↓HWE-BLEU↑HWE-EditDis↓下载链接UniMERNetDonut SwinUniMERNet.yaml0.91870.05840.92520.05960.60680.22970.91570.0546trained model其中SPESimple Formulas简单公式测试集CPEComplex Formulas复杂公式测试集SCEScanned Captured Formulas扫描/拍摄公式测试集HWEHandwritten Formulas手写公式测试集。指标方面BLEU↑ 越高越好衡量预测 LaTeX 序列与真值之间的 n-gram 相似度EditDisEdit Distance编辑距离↓ 越低越好衡量字符级差异。从表中可以看到SCE 场景扫描/拍摄的识别难度明显更高EditDis 达到 0.2297这也符合扫描图像噪声多的直觉。1.3 指标在源码中的定义复现表中的 BLEU 与编辑距离指标由 ppocr/metrics/rec_metric.py 中的LaTeXOCRMetric计算实现。从源码可见指标以exp_rate为主指标main_indicatorexp_rate即公式完全识别正确的比例通过cal_bleu_score: True开启 BLEU 计算compute_bleu_score编辑距离采用Levenshtein.normalized_distance归一化编辑距离统计每个样本后按样本总数求平均除 BLEU 与编辑距离外还同时输出exp_rate1/2/3等容忍 1~3 个字符误差的辅助指标。2. 环境配置与依赖安装2.1 基础环境首先参考 运行环境准备 配置 PaddleOCR 运行环境安装 PaddlePaddle 与 PaddleOCR 依赖参考 项目克隆 克隆项目代码。2.2 额外依赖UniMERNet 的训练链路依赖 Hugging Facetokenizers加载公式 tokenizer、imagesize读取图片尺寸、ftfy文本修复以及WandImageMagick Python 绑定用于雪景等图像增强需要额外安装sudo apt-get update sudo apt-get install libmagickwand-dev pip install -r docs/version2.x/algorithm/formula_recognition/requirements.txt该依赖清单定义于 docs/version2.x/algorithm/formula_recognition/requirements.txt当前内容包括tokenizers0.19.1 imagesize ftfy Wand说明libmagickwand-dev是系统级依赖用于Wand库调用 ImageMagick 实现运动模糊motion blur等图像特效缺了它训练增强中的Snow变换会报错。3. 数据集准备与格式转换3.1 数据来源UniMERNet 训练需要三类数据UniMER-1M.zip与UniMER-Test.zip来自 OpenDataLab 的 UniMER-DatasetHME100K来自好未来TALAI 平台的手写公式数据集。3.2 目录创建与解压# create the UniMERNet dataset directory mkdir -p train_data/UniMERNet # unzip UniMER-1M.zip, UniMER-Test.zip and HME100K.zip unzip -d train_data/UniMERNet path/UniMER-1M.zip unzip -d train_data/UniMERNet path/UniMER-Test.zip unzip -d train_data/UniMERNet/HME100K train_data/UniMERNet/HME100K/train.zip unzip -d train_data/UniMERNet/HME100K train_data/UniMERNet/HME100K/test.zip3.3 训练集格式转换UniMER-1M 与 HME100K 的标注格式与 PaddleOCR 的SimpleDataSet不同必须先用仓库自带的转换脚本 ppocr/utils/formula_utils/unimernet_data_convert.py 统一转换为图片相对路径\tLaTeX标注的制表符分隔格式# convert the training set python ppocr/utils/formula_utils/unimernet_data_convert.py \ --image_dirtrain_data/UniMERNet \ --datatypeunimernet_train \ --unimernet_txt_pathtrain_data/UniMERNet/UniMER-1M/train.txt \ --hme100k_txt_pathtrain_data/UniMERNet/HME100K/train_labels.txt \ --output_pathtrain_data/UniMERNet/train_unimernet_1M.txt从源码看datatypeunimernet_train时执行latexocr2paddleocr_train对 UniMER-1M按train.txt行号生成UniMER-1M/images/{i:07d}.png的 7 位数字文件名如0000000.png逐行写入UniMER-1M/images/0000000.png\t{LaTeX}对 HME100K从train_labels.txt中读取图片名\tLaTeX行改写为HME100K/train_images/{img_name}\t{LaTeX}。3.4 测试集格式转换四个测试子集分别转换datatypeunimernet_test时执行unimernet2paddleocr_test同样按spe.txt等标注文件的行号生成 7 位数字图片名# SPE python ppocr/utils/formula_utils/unimernet_data_convert.py \ --image_dirtrain_data/UniMERNet/UniMER-Test/spe \ --datatypeunimernet_test \ --unimernet_txt_pathtrain_data/UniMERNet/UniMER-Test/spe.txt \ --output_pathtrain_data/UniMERNet/test_unimernet_spe.txt # CPE python ppocr/utils/formula_utils/unimernet_data_convert.py \ --image_dirtrain_data/UniMERNet/UniMER-Test/cpe \ --datatypeunimernet_test \ --unimernet_txt_pathtrain_data/UniMERNet/UniMER-Test/cpe.txt \ --output_pathtrain_data/UniMERNet/test_unimernet_cpe.txt # SCE python ppocr/utils/formula_utils/unimernet_data_convert.py \ --image_dirtrain_data/UniMERNet/UniMER-Test/sce \ --datatypeunimernet_test \ --unimernet_txt_pathtrain_data/UniMERNet/UniMER-Test/sce.txt \ --output_pathtrain_data/UniMERNet/test_unimernet_sce.txt # HWE python ppocr/utils/formula_utils/unimernet_data_convert.py \ --image_dirtrain_data/UniMERNet/UniMER-Test/hwe \ --datatypeunimernet_test \ --unimernet_txt_pathtrain_data/UniMERNet/UniMER-Test/hwe.txt \ --output_pathtrain_data/UniMERNet/test_unimernet_hwe.txt转换得到的四个 txt 文件分别对应配置文件中Eval.dataset.data_dir与Eval.dataset.label_file_list的组合用于后续分场景评估。3.5 补充工具math_txt2pkl.py仓库中另有一个辅助脚本 ppocr/utils/formula_utils/math_txt2pkl.py它按图片宽高将公式聚合成(divide_w, divide_h) - [(公式, 图片名)]的 pickle 字典宽度范围 32~672、高度范围 32~192并向上取整到 16 的倍数适用于需要按图像尺寸分桶处理的场景普通训练流程中可不用。4. 配置文件全解析configs/rec/UniMERNet.yaml 是训练/评估/预测共用的唯一配置入口各模块含义如下4.1 Global 全局配置参数值说明model_nameUniMERNet模型名用于静态图推理use_gpuTrue是否使用 GPUepoch_num40训练轮数save_model_dir./output/rec/unimernet/模型保存目录save_epoch_step5每 5 个 epoch 保存一次eval_batch_step[0, 37880]第 0 次迭代后每 37880 次迭代评估一次即每个 epoch 评估 1 次cal_metric_during_trainTrue训练过程中计算评估指标pretrained_model空预训练权重路径训练时通过-o覆盖rec_char_dict_pathppocr/utils/dict/unimernet_tokenizer关键公式 tokenizer 目录非普通字符字典文件内含tokenizer.json与tokenizer_config.jsoninput_size[192, 672]模型输入尺寸高×宽max_seq_len1024训练时最大序列长度use_space_charFalse不额外使用空格字符save_res_path./output/rec/predicts_unimernet.txt预测结果保存路径4.2 Optimizer 优化器Optimizer: name: AdamW beta1: 0.9 beta2: 0.999 weight_decay: 0.05 lr: name: LinearWarmupCosine learning_rate: 1e-4 start_lr: 1e-5 min_lr: 1e-8 warmup_steps: 5000采用 AdamW 优化器 线性 warmup 余弦退火学习率峰值学习率1e-4起始1e-5最低1e-8前 5000 步线性预热。4.3 Architecture 网络结构Architecture: model_type: rec algorithm: UniMERNet in_channels: 3 Transform: Backbone: name: DonutSwinModel hidden_size : 1024 num_layers: 4 num_heads: [4, 8, 16, 32] add_pooling_layer: True use_mask_token: False Head: name: UniMERNetHead max_new_tokens: 1536 decoder_start_token_id: 0 temperature: 0.2 do_sample: False top_p: 0.95 encoder_hidden_size: 1024 is_export: False length_aware: TrueBackboneDonutSwinModel视觉编码器实现位于 ppocr/modeling/backbones/rec_donut_swin.py。从源码可见其内部配置为patch_size4、embed_dim128、depths[2,2,14,2]、window_size5、image_size[420,420]的 Swin Transformer 结构hidden_size1024输出视觉特征HeadUniMERNetHead自回归解码器实现位于 ppocr/modeling/heads/rec_unimernet_head.py其核心是 MBart 风格的因果语言模型CustomMBartForCausalLM加lm_head输出 50000 词表上的 logits。解码参数说明max_new_tokens: 1536推理时最多新生成 1536 个 tokendo_sample: False默认贪心解码temperature: 0.2、top_p: 0.95采样解码参数do_sampleTrue时生效length_aware: True开启长度感知机制解码器同时预测公式 token 数训练时作为辅助损失监督推理时可辅助约束生成长度。4.4 Loss 损失函数Loss: name: UniMERNetLoss实现位于 ppocr/losses/rec_unimernet_loss.py。训练时 Head 输出三元组(logits, count_pred, masked_label)损失由两部分组成word_loss对解码 logits 与标签shift 一位后计算CrossEntropyLossignore_index-100屏蔽填充位count_loss当length_awareTrue时将标签做 one-hot 后按序列求和得到每个公式的 token 计数真值取log(count1)后与解码器预测的计数count_pred计算SmoothL1Loss最终loss word_loss 0.5 * count_loss。4.5 PostProcess 后处理PostProcess: name: UniMERNetDecode rec_char_dict_path: *rec_char_dict_pathUniMERNetDecode实现位于 ppocr/postprocess/rec_postprocess.py从rec_char_dict_path指向的目录加载tokenizer.json与tokenizer_config.json将解码出的 token id 序列还原为 LaTeX 字符串并处理sbos, id0、/seos, id2、padpad, id1等特殊 token。4.6 Metric 评估指标Metric: name: LaTeXOCRMetric main_indicator: exp_rate cal_bleu_score: True即前文 1.3 节所述的LaTeXOCRMetric主指标为公式完全正确率exp_rate同时计算 BLEU 与编辑距离。4.7 Train / Eval 数据管线训练与评估均使用SimpleDataSet关键差异在于 transformsTrainUniMERNetImgDecode裁边→resize→居中 padding 到 192×672→UniMERNetTrainTransform数据增强→UniMERNetImageFormat通道压缩为单通道、padding 到 32 的倍数并转[1,H,W]→UniMERNetLabelEncodetokenizer 编码标签max_seq_len1024→KeepKeys保留[image, label, attention_mask]Eval将UniMERNetTrainTransform替换为无增强的UniMERNetTestTransform其余一致两者均使用UniMERNetCollator作为collate_fnbatch_size_per_card训练为 7、评估为 30。训练增强UniMERNetTrainTransform的实现位于 ppocr/data/imaug/unimernet_aug.py包含腐蚀/膨胀Erosion/Dilation、雾/霜/雪/雨/阴影Fog/Frost/Snow/Rain/Shadow其中雪景使用Wand做运动模糊、ShiftScaleRotate、GridDistortion、RGBShift、高斯噪声、RandomBrightnessContrast、JPEG 压缩最后统一转灰度并以mean0.7931, std0.1738归一化测试变换仅做灰度化与归一化见 unimernet_aug.py。5. 模型训练5.1 下载预训练模型训练前需下载Texify预训练权重作为初始化UniMERNetHead解码器结构对齐自 Texify 的 MBart 解码器# download the Texify pre-trained model wget -P ./pretrain_models/ https://paddleocr.bj.bcebos.com/pretrained/texify.pdparams5.2 单卡训练# Single GPU training python3 tools/train.py -c configs/rec/UniMERNet.yaml \ -o Global.pretrained_model./pretrain_models/texify.pdparams5.3 多卡训练通过--gpus参数指定卡号# Multi GPU training, specify the gpu number through the --gpus parameter python3 -m paddle.distributed.launch --gpus 0,1,2,3 --ips127.0.0.1 tools/train.py -c configs/rec/UniMERNet.yaml \ -o Global.pretrained_model./pretrain_models/texify.pdparams5.4 调整评估频率配置默认每训练 1 个 epoch37880 次 iteration评估 1 次。若你修改了batch_size或更换了数据集评估间隔应相应调整可按下式计算并覆盖python3 -m paddle.distributed.launch --gpus 0,1,2,3 --ips127.0.0.1 tools/train.py -c configs/rec/UniMERNet.yaml \ -o Global.eval_batch_step[0,{length_of_dataset//batch_size//4}] \ Global.pretrained_model./pretrain_models/texify.pdparams其中{length_of_dataset//batch_size//4}表示“数据集样本数 ÷ batch size ÷ 4”对应的迭代步数。训练过程中的完整通用说明可参考 文本识别训练教程。5.5 训练入口与模块注册训练入口为 tools/train.pyPaddleOCR 按algorithm: UniMERNet自动装配 backboneDonutSwinModel、headUniMERNetHead、lossUniMERNetLoss、postprocessUniMERNetDecode与 metricLaTeXOCRMetric注册表分别位于 ppocr/modeling/backbones、ppocr/modeling/heads、ppocr/losses 与 ppocr/postprocess 的__init__.py中。6. 模型评估下载已训练完成的 模型文件或使用自训练保存的best_accuracy.pdparams解压后按四个测试集分别评估。注意将Global.pretrained_model设置为本地路径# GPU evaluation # SPE test set evaluation python3 tools/eval.py -c configs/rec/UniMERNet.yaml -o \ Eval.dataset.data_dir./train_data/UniMERNet/UniMER-Test/spe \ Eval.dataset.label_file_list[./train_data/UniMERNet/test_unimernet_spe.txt] \ Global.pretrained_model./rec_unimernet_train/best_accuracy.pdparams # CPE test set evaluation python3 tools/eval.py -c configs/rec/UniMERNet.yaml -o \ Eval.dataset.data_dir./train_data/UniMERNet/UniMER-Test/cpe \ Eval.dataset.label_file_list[./train_data/UniMERNet/test_unimernet_cpe.txt] \ Global.pretrained_model./rec_unimernet_train/best_accuracy.pdparams # SCE test set evaluation python3 tools/eval.py -c configs/rec/UniMERNet.yaml -o \ Eval.dataset.data_dir./train_data/UniMERNet/UniMER-Test/sce \ Eval.dataset.label_file_list[./train_data/UniMERNet/test_unimernet_sce.txt] \ Global.pretrained_model./rec_unimernet_train/best_accuracy.pdparams # HWE test set evaluation python3 tools/eval.py -c configs/rec/UniMERNet.yaml -o \ Eval.dataset.data_dir./train_data/UniMERNet/UniMER-Test/hwe \ Eval.dataset.label_file_list[./train_data/UniMERNet/test_unimernet_hwe.txt] \ Global.pretrained_model./rec_unimernet_train/best_accuracy.pdparams每条命令通过-o覆盖Eval.dataset.data_dir图片目录与Eval.dataset.label_file_list3.4 节转换出的标注文件即可在对应场景上输出exp_rate、bleu_score、edit distance等指标与第 1.2 节复现表一一对应。评估入口为 tools/eval.py。7. 模型预测使用与训练一致的配置文件进行单张图片预测# The configuration file used for prediction must match the training python3 tools/infer_rec.py -c configs/rec/UniMERNet.yaml \ -o Global.infer_img./docs/datasets/images/pme_demo/0000099.png \ Global.pretrained_model./rec_unimernet_train/best_accuracy.pdparams要点说明Global.infer_img支持单张图片路径若想预测目录下所有图像可将其改为文件夹路径如Global.infer_img./doc/datasets/pme_demo/预测使用的配置文件必须与训练一致保证字典tokenizer、输入尺寸等设置匹配预测结果默认写入Global.save_res_path指定的./output/rec/predicts_unimernet.txt。推理入口为 tools/infer_rec.py。从 rec_unimernet_head.py 的forward实现可见推理模式下 Head 以视觉编码器输出为条件通过generate/generate_export执行自回归解码配合use_cacheTrue缓存 KV加速逐 token 生成再经UniMERNetDecode还原为 LaTeX 文本。8. 常见问题FAQUniMERNet 数据集从哪来训练所用的 UniMER-1M / UniMER-Test 与 HME100K 数据来自 UniMERNet 源项目及好未来平台PaddleOCR 侧仅提供数据转换工具unimernet_data_convert.py与训练配置不随仓库分发数据本身。为什么需要安装 libmagickwand-dev训练数据增强中的Snow雪景变换通过WandImageMagick 绑定实现motion_blur缺少该系统库会导致增强阶段报错因此必须在pip install之前完成apt-get install libmagickwand-dev。为什么rec_char_dict_path指向一个目录而不是 .txt 字典UniMERNet 使用 Hugging Facetokenizers的 BPE/Unigram tokenizer 而非普通字符表目录内包含tokenizer.json与tokenizer_config.json由UniMERNetLabelEncodelabel_ops.py与UniMERNetDecode共同加载。改 batch_size 后如何保持评估频率合理按 5.4 节公式通过-o Global.eval_batch_step[0,{length_of_dataset//batch_size//4}]覆盖评估间隔。推理速度慢怎么办推理默认贪心解码do_sampleFalse若模型已导出为静态图可将Global.model_name: UniMERNet与is_export: True配合使用代码中为静态图导出提供了generate_export分支以获得更稳定的部署推理路径。总结本文完整覆盖了 PaddleOCR 中 UniMERNet 公式识别从环境搭建、数据转换、配置解析到训练、评估、预测的全链路并深入源码印证了 Donut Swin 编码器、MBart 风格自回归解码器、长度感知损失UniMERNetLoss、tokenizer 加载UniMERNetLabelEncode/UniMERNetDecode与LaTeXOCRMetric指标计算等关键实现。按文中命令逐步操作即可在四个标准测试集上复现文档给出的 SPE/CPE/SCE/HWE 精度并将任意公式图片转换为 LaTeX 序列。【免费下载链接】PaddleOCRTurn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between images/PDFs and LLMs. Supports 100 languages.项目地址: https://gitcode.com/GitHub_Trending/pa/PaddleOCR创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考