资讯动态

PaddleOCR 关键信息抽取算法 SDMGR 实战:双模态图推理的原理、配置与训练评估预测全解析

发布时间:2026/9/10 1:07:38 来源:尧图企业网站定制
PaddleOCR 关键信息抽取算法 SDMGR 实战双模态图推理的原理、配置与训练评估预测全解析【免费下载链接】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 中基于 Spatial Dual-Modality Graph ReasoningSDMGR 论文实现的关键信息抽取KIE算法展开系统讲解其视觉 文本双模态图推理的算法原理、配套源码实现、wildreceipt 数据集上的完整训练/评估/预测流程并逐项拆解其核心配置文件。读完本文你将能够独立完成 SDMGR 模型从数据准备、配置修改到训练评估与可视化的全链路实操并理解其底层图神经网络的设计细节。1. 算法简介SDMGR 解决什么问题SDMGRSpatial Dual-Modality Graph Reasoning for Key Information Extraction是一种关键信息抽取算法其核心任务是将文档中每个检测到的文本区域textline分类为预定义的语义类别例如订单 ID、发票号码、金额等。与纯文本序列标注方案不同SDMGR 显式建模文本之间的空间关系如上下、左右、包含等将整张票据/文档构造成一张图文本区域作为节点node区域间的空间关系作为边edge从而把关键信息抽取转化为图上的节点分类与边分类问题。论文信息如下Spatial Dual-Modality Graph Reasoning for Key Information ExtractionHongbin Sun, Zhanghui Kuang, Xiaoyu Yue, Chenhao Lin, Wayne Zhang2021在 wildreceipt 发票公开数据集上PaddleOCR 对该算法的复现效果如下模型骨干网络配置文件Hmean下载链接SDMGRVGG6UNet 变体configs/kie/sdmgr/kie_unet_sdmgr.yml86.70%官方提供训练模型 kie_vgg16.tar推理模型待发布在 PaddleOCR 仓库中SDMGR 的完整实现分布在以下源码文件中构成了数据预处理 → 骨干网络 → 图推理头 → 损失 → 评估指标的完整链路图推理头ppocr/modeling/heads/kie_sdmgr_head.pySDMGRHead、GNNLayer、Block骨干网络ppocr/modeling/backbones/kie_unet_sdmgr.pyKie_backbone损失函数ppocr/losses/kie_sdmgr_loss.pySDMGRLoss评估指标ppocr/metrics/kie_metric.pyKIEMetric预测脚本tools/infer_kie.py2. 算法原理与源码级解析2.1 整体架构Backbone SDMGRHead从 configs/kie/sdmgr/kie_unet_sdmgr.yml 的Architecture段可以看到SDMGR 的网络结构分为骨干网络与头部两部分Architecture: model_type: kie algorithm: SDMGR Transform: Backbone: name: Kie_backbone Head: name: SDMGRHead其中Kie_backbone定义于 ppocr/modeling/backbones/kie_unet_sdmgr.py是一个基于 UNet 结构的编码器-解码器网络编码器由卷积 BatchNorm ReLU 池化堆叠而成逐级提取图像的多尺度视觉特征解码器通过上采样与跳跃连接恢复分辨率。该骨干的作用是从整张票据图像中提取视觉特征图visual feature供后续头部与文本节点特征进行融合。2.2 节点与边的构造SDMGRHead 的前向流程SDMGRHeadppocr/modeling/heads/kie_sdmgr_head.py的构造参数如下参数默认值含义in_channels必填骨干网络输出的通道数num_chars92字符字典大小用于文本序列嵌入visual_dim16视觉 ROI 特征的维度fusion_dim1024双模态融合模块的中间维度node_input32字符嵌入的维度node_embed256节点文本区域的嵌入维度edge_input5空间关系边的原始特征维度edge_embed256边的嵌入维度num_gnn2图神经网络GNN层数num_classes26预定义语义类别数量bidirectionalFalse是否使用双向 LSTM 编码文本前向过程forward(self, input, targets)接收(relations, texts, x)三元组文本节点编码对每个文本区域的字符索引序列做nn.Embedding嵌入再送入单层 LSTMnn.LSTM取最后一个有效字符位置对应的隐状态作为该文本区域的节点特征node_embed维。视觉特征融合若存在骨干输出的视觉特征x则通过多模态融合模块Block将视觉 ROI 特征与文本节点特征融合self.fusion([x, nodes])这正是双模态的体现。边编码将每对文本区域之间的空间关系向量relations5 维通过nn.Linear映射为边嵌入embed_edges并做 L2 归一化。GNN 推理将节点与边送入堆叠的num_gnn层GNNLayer进行消息传递与聚合。输出self.node_cls(nodes)输出节点类别 logitsself.edge_cls(cat_nodes)输出边类别 logits2 类表示关系是否成立。2.3 图推理核心GNNLayerGNNLayer同文件内实现了单层图卷积的聚合逻辑将每个样本内的节点两两拼接paddle.concat([expand(nodes, ...), expand(nodes, ...)], -1)构造出num² × (node_dim*2)的节点对特征再与边特征拼接后过in_fc线性层与 ReLU通过coef_fc计算注意力系数并使用softmax(-eye(num)*1e9 coefs)屏蔽自环对角线置为极小值实现基于注意力权重的邻居聚合聚合结果经out_fc与 ReLU 后作为残差加到原节点特征上nodes relu(out_fc(...))形成节点更新 残差连接的图卷积单元。2.4 双模态融合模块BlockBlock是一个借鉴多模态紧凑双线性池化MCB思路的融合模块两个输入分支分别经过线性层映射到高维空间后按chunks分块每块通过rank秩的 Hadamard 积与按秩求和m m0(x0_c) * m1(x1_c); z paddle.sum(m, 1)实现紧凑双线性特征交互最后再经过正负 ReLU 开方sqrt(relu(z)) - sqrt(relu(-z))与归一化输出。该模块用于将骨干提取的视觉特征与 LSTM 编码的文本节点特征深度融合。2.5 损失函数SDMGRLossSDMGRLossppocr/losses/kie_sdmgr_loss.py采用节点分类与边分类双分支交叉熵loss_node nn.CrossEntropyLoss(ignore_index0)节点类别预测损失索引为 0 的类别被忽略loss_edge nn.CrossEntropyLoss(ignore_index-1)边空间关系预测损失-1 表示无有效关系的位置被忽略最终损失loss node_weight * loss_node edge_weight * loss_edge默认node_weight1.0、edge_weight1.0。同时该损失在forward中还会计算节点与边的 Top-1 准确率acc_node、acc_edge供训练日志观察。从pre_process的实现可以看出每个样本的真实标签gts是一个num × (num1)的矩阵第一列为节点类别其余列为该节点与其他节点的关系类别tag记录每个样本的真实节点数与标签长度。2.6 评估指标KIEMetricKIEMetricppocr/metrics/kie_metric.py实现了文档原论文约定的评估协议计算混淆矩阵后忽略掉 26 个类别中 13 个其他/忽略类别如ignores [0, 2, 4, ..., 24, 25]所列索引仅对有效类别计算逐类 F1 并取平均作为hmean。配置文件中Metric.main_indicator: hmean即指定该值为最终衡量指标。3. 环境配置与数据准备3.1 环境与项目准备请先参考 《运行环境准备》 配置 PaddleOCR 运行环境再参考 《项目克隆》 克隆项目代码中文版环境说明见 environment.md。3.2 下载 wildreceipt 数据集SDMGR 的训练与测试数据来自 wildreceipt 数据集票据类文档包含文本行、类别标签与空间关系标注通过如下命令下载并解压wget https://paddleocr.bj.bcebos.com/ppstructure/dataset/wildreceipt.tar tar xf wildreceipt.tar解压完成后将数据集软链到PaddleOCR/train_data目录下cd PaddleOCR/ mkdir train_data cd train_data ln -s ../../wildreceipt ./数据就绪后目录结构应满足配置文件中的默认路径约定train_data/wildreceipt/下包含wildreceipt_train.txt、wildreceipt_test.txt、dict.txt、class_list.txt等文件。4. 配置文件详解kie_unet_sdmgr.yml训练、评估与预测统一使用 configs/kie/sdmgr/kie_unet_sdmgr.yml。下面逐段拆解其关键参数。4.1 Global 全局配置Global: use_gpu: True epoch_num: 60 log_smooth_window: 20 print_batch_step: 50 save_model_dir: ./output/kie_5/ save_epoch_step: 50 eval_batch_step: [ 0, 80 ] # 每 80 个 iter 评估一次 load_static_weights: False cal_metric_during_train: False pretrained_model: checkpoints: save_inference_dir: use_visualdl: False class_path: class_path ./train_data/wildreceipt/class_list.txt infer_img: ./train_data/wildreceipt/1.txt save_res_path: ./output/sdmgr_kie/predicts_kie.txt img_scale: [ 1024, 512 ]要点说明epoch_num: 60为总训练轮数eval_batch_step: [0, 80]表示从第 0 个迭代开始每 80 个迭代执行一次评估class_path指向类别名称文件class_list.txt其行号即类别索引训练、预测、结果可视化均依赖该映射tools/infer_kie.py中的read_class_list会逐行读取生成idx - class_name字典infer_img指定预测阶段输入的文本文件每行存储图片路径与 OCR 标注信息的 JSONsave_res_path为预测结果文本文件路径可视化图片默认保存于其所在目录下的kie_results/子目录img_scale: [1024, 512]用于KieResize变换控制输入图像缩放的尺寸。4.2 Architecture / Loss / OptimizerArchitecture: model_type: kie algorithm: SDMGR Backbone: name: Kie_backbone Head: name: SDMGRHead Loss: name: SDMGRLoss Optimizer: name: Adam beta1: 0.9 beta2: 0.999 lr: name: Piecewise learning_rate: 0.001 decay_epochs: [ 60, 80, 100] values: [ 0.001, 0.0001, 0.00001] warmup_epoch: 2 regularizer: name: L2 factor: 0.00005 PostProcess: name: None Metric: name: KIEMetric main_indicator: hmean要点说明优化器采用Adambeta10.9、beta20.999学习率采用Piecewise 分段衰减初始 0.001分别在 epoch 60、80、100 处衰减为 0.0001、0.00001并带有 2 个 epoch 的 warmupL2 权重衰减系数为 0.00005PostProcess.name: None表示该算法不设置独立后处理模块Metric指定KIEMetric以hmean作为主指标。4.3 Train 训练数据流Train: dataset: name: SimpleDataSet data_dir: ./train_data/wildreceipt/ label_file_list: [ ./train_data/wildreceipt/wildreceipt_train.txt ] ratio_list: [ 1.0 ] transforms: - DecodeImage: # 加载图像 img_mode: RGB channel_first: False - NormalizeImage: scale: 1 mean: [ 123.675, 116.28, 103.53 ] std: [ 58.395, 57.12, 57.375 ] order: hwc - KieLabelEncode: # 标签编码节点类别、边关系、文本序列 character_dict_path: ./train_data/wildreceipt/dict.txt class_path: *class_path - KieResize: - ToCHWImage: - KeepKeys: keep_keys: [ image, relations, texts, points, labels, tag, shape] loader: shuffle: True drop_last: False batch_size_per_card: 4 num_workers: 4要点说明KieLabelEncode实现在 ppocr/data/imaug/label_ops.py负责解析训练标签dict.txt为字符字典决定num_charsclass_path为类别文件决定num_classes其输出relations空间关系、texts文本字符序列、points文本行四点坐标、labels节点/边标签矩阵、tag每个样本的有效数量信息正是SDMGRHead与SDMGRLoss的输入KieResizeppocr/data/imaug/operators.py按Global.img_scale对图像与坐标同步缩放KeepKeys中列出的键顺序即 dataloader 返回列表的顺序训练与评估阶段的键集合不同评估阶段额外包含ori_image、ori_boxes用于结果可视化与评估。4.4 Eval 评估数据流Eval: dataset: name: SimpleDataSet data_dir: ./train_data/wildreceipt label_file_list: - ./train_data/wildreceipt/wildreceipt_test.txt transforms: - DecodeImage: img_mode: RGB channel_first: False - KieLabelEncode: character_dict_path: ./train_data/wildreceipt/dict.txt - KieResize: - NormalizeImage: scale: 1 mean: [ 123.675, 116.28, 103.53 ] std: [ 58.395, 57.12, 57.375 ] order: hwc - ToCHWImage: - KeepKeys: keep_keys: [ image, relations, texts, points, labels, tag, ori_image, ori_boxes, shape] loader: shuffle: False drop_last: False batch_size_per_card: 1 # 评估时 batch size 必须为 1 num_workers: 4注意评估阶段的batch_size_per_card必须设置为 1因为KIEMetric与标签预处理依赖逐样本处理batch[4].squeeze(0)、tag解析等逻辑假定 batch 内只有一个样本。5. 模型训练、评估与预测5.1 模型训练配置文件默认训练数据路径为train_data/wildreceipt数据准备好后执行python3 tools/train.py -c configs/kie/sdmgr/kie_unet_sdmgr.yml -o Global.save_model_dir./output/kie/-o Global.save_model_dir./output/kie/通过命令行覆盖配置项将模型保存目录指定为./output/kie/。训练过程中的节点/边准确率、总损失loss、loss_node、loss_edge会按print_batch_step: 50的频率打印。5.2 模型评估执行下面的命令对训练好的模型进行评估Global.checkpoints指向保存的最佳模型python3 tools/eval.py -c configs/kie/sdmgr/kie_unet_sdmgr.yml -o Global.checkpoints./output/kie/best_accuracy输出信息示例如下[2022/08/10 05:22:23] ppocr INFO: metric eval *************** [2022/08/10 05:22:23] ppocr INFO: hmean:0.8670120239257812 [2022/08/10 05:22:23] ppocr INFO: fps:10.18816520530961其中hmean即文档 §2.6 中KIEMetric忽略非目标类别后计算的平均 F10.867 与表格中 86.70% 的复现效果一致fps为评估吞吐。5.3 模型预测与结果可视化SDMGR 的预测由专用脚本 tools/infer_kie.py 完成与常规 OCR 推理不同预测时需要预先加载一个存储图片路径 OCR 标注信息的文本文件通过Global.infer_img指定python3 tools/infer_kie.py -c configs/kie/sdmgr/kie_unet_sdmgr.yml -o Global.checkpointskie_vgg16/best_accuracy Global.infer_img./train_data/wildreceipt/1.txt说明原文档此命令中的配置文件路径写作configs/kie/kie_unet_sdmgr.yml但当前仓库中该文件实际位于configs/kie/sdmgr/kie_unet_sdmgr.yml请以仓库实际路径为准Global.checkpoints指向官方提供的kie_vgg16预训练模型。infer_kie.py的执行流程可从源码确认通过read_class_list(class_path)读取class_list.txt构建类别索引映射逐行读取Global.infer_img指定的文本文件每行格式为图片相对路径\t标签JSON其中标签 JSON 数组的每个元素包含该文本区域的transcription识别文本与points四点坐标构建模型并加载权重build_modelload_model执行前向得到节点与边预测draw_kie_result将预测类别与置信度绘制到图像上——左侧为原图叠加检测框右侧为标注了类别(置信度)的预测图并保存到save_res_path所在目录的kie_results/子目录默认./output/sdmgr_kie/kie_results/write_kie_result将每条文本行的预测结果label、transcription、score、points以 JSON 数组形式写入save_res_path默认./output/sdmgr_kie/predicts_kie.txt并按预测类别排序输出。可视化结果示例如下从图中可以看到票据中的订单号、日期、金额、名称等文本区域被逐一标注为对应语义类别并附带置信度直观体现了 SDMGR 将整张票据建模为图、对每个节点文本区域做分类的能力。6. 推理部署支持情况与 FAQ6.1 推理部署截至本文撰写时以当前仓库 docs/version2.x 文档为准SDMGR 算法的常规推理部署支持情况如下Python 推理暂不支持预测请使用 tools/infer_kie.py 脚本C 推理部署暂不支持Serving 服务化部署暂不支持更多推理部署如移动端/其他框架暂不支持。该算法的使用范围当前主要面向科研复现与训练/评估流程正式生产部署前请关注官方后续版本对 SDMGR 推理支持的更新。6.2 FAQ本节为占位章节目前无额外高频问题记录实际使用中如遇到数据格式相关问题建议优先核对train_data/wildreceipt/下wildreceipt_train.txt、wildreceipt_test.txt的标签格式是否与KieLabelEncode的解析约定一致。7. 引用如需在论文或报告中引用 SDMGR 算法可使用以下 BibTeXmisc{sun2021spatial, title{Spatial Dual-Modality Graph Reasoning for Key Information Extraction}, author{Hongbin Sun and Zhanghui Kuang and Xiaoyu Yue and Chenhao Lin and Wayne Zhang}, year{2021}, eprint{2103.14470}, archivePrefix{arXiv}, primaryClass{cs.CV} }此外本仓库中还有更多关键信息抽取算法的实现与文档可供参考例如基于 LayoutLM 的 algorithm_kie_layoutxlm.en.md 与基于 Vi-LayoutXLM 的 algorithm_kie_vi_layoutxlm.en.md以及对应的中文版文档可作为 KIE 技术选型与对比研究的延伸阅读。【免费下载链接】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),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价