PaddleOCR 关键信息抽取(KIE)全流程实战:基于 VI-LayoutXLM 的 SER 与 RE 模型训练、评估与推理指南
【免费下载链接】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
关键信息抽取(Key Information Extraction,KIE)是文档智能化的核心技术之一,旨在从票据、证件、合同等富文本图像中自动抽取「问题-答案」语义实体及其关联关系。本文以 PaddleOCR 仓库中 docs/version2.x/ppocr/model_train/kie.en.md 为主线,系统讲解基于 VI-LayoutXLM 多模态预训练模型完成语义实体识别(SER)与关系抽取(RE)任务的完整链路:从数据准备、配置文件解读、单卡/多卡训练、知识蒸馏,到评估、预测、推理模型导出与部署推理。读完本文,你将掌握一套可直接落地的 KIE 建模与上线方案,并理解 PaddleOCR 中 KIE 数据流与模型结构的源码级实现。
1. KIE 任务概述与 VI-LayoutXLM 模型
在 PaddleOCR 中,KIE 被拆解为两个相互衔接的经典任务:
- SER(Semantic Entity Recognition,语义实体识别):为文档图像中的每个文本行(token)预测语义类别,如
QUESTION(问题)、ANSWER(答案)、HEADER(页眉)等。它类似于序列标注问题。 - RE(Relation Extraction,关系抽取):在 SER 标注结果的基础上,进一步判断「问题-答案」文本行之间是否存在关联关系(linking),从而把散落的实体组织成结构化键值对。
本文以VI-LayoutXLM多模态预训练模型为例展开。VI-LayoutXLM 是 LayoutXLM 的轻量化多语言变体,同时融合了文本语义、版面坐标(bbox)与视觉特征三类信息,非常适合票据、证照等版式复杂场景。
从源码结构看,PaddleOCR 在 ppocr/modeling/backbones/vqa_layoutlm.py 中定义了LayoutXLMForSer(第 149 行)与LayoutXLMForRe(第 223 行)两个网络入口,分别对应 SER 与 RE 任务的LayoutXLMForTokenClassification与LayoutXLMForRelationExtraction头。SER 模型前向输入为input_ids / bbox / attention_mask / token_type_ids / image五元组;RE 模型在此基础上额外接收entities与relations张量,其中entities由 SER 预测结果过滤掉O(other)类别后构建,relations则穷举所有「QUESTION→ANSWER」实体对(详见 tools/infer_kie_token_ser_re.py 中的make_input函数)。
如果你希望使用基于图神经网络的 SDMGR 算法而非 LayoutXLM 系列,可参考 SDMGR 算法文档,其配置入口位于 configs/kie/sdmgr/kie_unet_sdmgr.yml。
2. 数据准备:从原始标注到 PaddleOCR 训练集
2.1 数据集存储约定
PaddleOCR 训练 KIE 模型时,默认数据路径为PaddleOCR/train_data。若数据已存在于磁盘其他位置,只需创建软链接(soft link)指向数据集目录:
# linux and mac os ln -sf <path/to/dataset> <path/to/paddle_ocr>/train_data/dataset # windows mklink /d <path/to/paddle_ocr>/train_data/dataset <path/to/dataset>训练过程通常包含训练集与评估集两部分,二者的数据格式完全一致,均通过SimpleDataset读取。
2.2 自定义数据集标注格式(通用数据格式)
PaddleOCR 采用「图像 + 文本标注文件」的通用数据格式。训练图像建议放入同一文件夹,并在一个文本文件中逐行记录图像路径与标注信息,图像路径与标注之间必须用\t(Tab)分隔,否则训练时会报错。标注文件内容示例如下:
" image path annotation information " zh_train_0.jpg [{"transcription": "汇丰晋信", "label": "other", "points": [[104, 114], [530, 114], [530, 175], [104, 175]], "id": 1, "linking": []}, {"transcription": "受理时间:", "label": "question", "points": [[126, 267], [266, 267], [266, 305], [126, 305]], "id": 7, "linking": [[7, 13]]}, {"transcription": "2020.6.15", "label": "answer", "points": [[321, 239], [537, 239], [537, 285], [321, 285]], "id": 13, "linking": [[7, 13]]}] zh_train_1.jpg [{"transcription": "中国人体器官捐献", "label": "other", "points": [[544, 459], [954, 459], [954, 517], [544, 517]], "id": 1, "linking": []}, {"transcription": ">编号:MC545715483585", "label": "other", "points": [[1462, 470], [2054, 470], [2054, 543], [1462, 543]], "id": 10, "linking": []}, {"transcription": "CHINAORGANDONATION", "label": "other", "points": [[543, 516], [958, 516], [958, 551], [543, 551]], "id": 14, "linking": []}, {"transcription": "中国人体器官捐献志愿登记表", "label": "header", "points": [[635, 793], [1892, 793], [1892, 904], [635, 904]], "id": 18, "linking": []}] ...标注由json解析为一个子标注列表,列表中每个元素是一个 dict,包含该文本行的全部信息,字段含义如下:
| 字段 | 含义 | 说明 |
|---|---|---|
transcription | 文本行内容 | 该行 OCR 识别出的文字 |
label | 文本行类别 | 语义类别,如question/answer/header/other |
points | 文本行四点坐标 | 形如[[x1,y1],[x2,y1],[x2,y2],[x1,y2]]的四边形顶点 |
id | 文本行 ID | 用于 RE 模型训练时的实体索引 |
linking | 文本行间关联信息 | 如[[7, 13]]表示 id=7 与 id=13 之间存在问答关系,供 RE 训练使用 |
评估集的构建方式与训练集完全相同。
2.3 字典文件(类别列表)
训练集与评估集中每个文本行的label字段对应的全部类别需汇总写入字典文件(如class_list.txt),每行一个类别名。以 FUND_zh 数据为例,包含四个类别,字典内容为:
OTHER QUESTION ANSWER HEADER标注文件中每条标注的label字段取值必须属于该字典。
两条重要约定:
- 标注文件中的类别信息不区分大小写,例如
HEADER与header会被解析为同一个类别 ID。 - 建议将
other类别(无需关注的文本行统一标注为other)放在字典第一行,解析时other的类别 ID 为 0,预测为other的文本行后续不会参与可视化,从而保证可视化结果干净聚焦。
最终数据集应具有如下目录结构:
|-train_data |-data_name |- train.json |- train |- zh_train_0.png |- zh_train_1.jpg | ... |- val.json |- val |- zh_val_0.png |- zh_val_1.jpg | ...2.4 下载公共数据集与格式转换
如果本地没有数据,可直接下载公共 KIE 数据集源文件,再借助 PaddleOCR 提供的转换脚本将其转为上述格式:
- XFUND(多语言表单理解数据集):使用 ppstructure/kie/tools/trans_xfun_data.py 转换。该脚本读取 XFUND 原始 JSON 中的
documents字段,将每个文档的box转换为四点points,并保留text / label / id / linking信息,最终逐行输出image_path \t json格式的标注文件(对应源码中transfer_xfun_data函数)。 - FUNSD(英文表单理解数据集):使用 ppstructure/kie/tools/trans_funsd_label.py 转换。
更多公共 KIE 数据集的说明与下载方式,可参考 KIE 数据集教程。
此外,PaddleOCR 支持使用 PPOCRLabel 工具进行 KIE 数据标注(包括为文本行打语义类别标签、勾画文本行间的链接关系),可直接用于生成上述格式的标注文件。
3. 模型训练
3.1 快速体验:使用 XFUND 数据集与预训练模型
PaddleOCR 提供了训练、评估与预测三套脚本。本节以 VI-LayoutXLM 模型为例展开讲解。
如果不想从零标注数据,可直接使用 PaddleOCR 已处理好的 XFUND_zh 数据集快速体验:
mkdir train_data cd train_data wget https://paddleocr.bj.bcebos.com/ppstructure/dataset/XFUND.tar && tar -xf XFUND.tar cd ..如果暂时不打算训练,只想直接体验评估、预测与推理流程,可以下载 PaddleOCR 提供的训练模型并跳过本节训练步骤:
mkdir pretrained_model cd pretrained_model # download and uncompress SER model wget https://paddleocr.bj.bcebos.com/ppstructure/models/vi_layoutxlm/ser_vi_layoutxlm_xfund_pretrained.tar & tar -xf ser_vi_layoutxlm_xfund_pretrained.tar # download and uncompress RE model wget https://paddleocr.bj.bcebos.com/ppstructure/models/vi_layoutxlm/re_vi_layoutxlm_xfund_pretrained.tar & tar -xf re_vi_layoutxlm_xfund_pretrained.tar启动训练前注意两点:
- 若你的 PaddlePaddle 为CPU 版本,需要在配置文件中设置
Global.use_gpu=False; - 训练时 PaddleOCR 会自动下载VI-LayoutXLM 预训练模型,无需提前手动下载。
3.2 启动训练(单卡 / 多卡)
# GPU training, support single card and multi-cards # The training log will be save in "{Global.save_model_dir}/train.log" # train SER model using single card python3 tools/train.py -c configs/kie/vi_layoutxlm/ser_vi_layoutxlm_xfund_zh.yml # train SER model using multi-cards, you can use --gpus to assign the GPU ids. python3 -m paddle.distributed.launch --gpus '0,1,2,3' tools/train.py -c configs/kie/vi_layoutxlm/ser_vi_layoutxlm_xfund_zh.yml # train RE model using single card python3 tools/train.py -c configs/kie/vi_layoutxlm/re_vi_layoutxlm_xfund_zh.yml以 SER 模型训练为例,训练启动后会输出如下日志:
[2022/08/08 16:28:28] ppocr INFO: epoch: [1/200], global_step: 10, lr: 0.000006, loss: 1.871535, avg_reader_cost: 0.28200 s, avg_batch_cost: 0.82318 s, avg_samples: 8.0, ips: 9.71838 samples/s, eta: 0:51:59 [2022/08/08 16:28:33] ppocr INFO: epoch: [1/200], global_step: 19, lr: 0.000018, loss: 1.461939, avg_reader_cost: 0.00042 s, avg_batch_cost: 0.32037 s, avg_samples: 6.9, ips: 21.53773 samples/s, eta: 0:37:55 [2022/08/08 16:28:39] ppocr INFO: cur metric, precision: 0.11526348939743859, recall: 0.19776657060518732, hmean: 0.14564265817747712, fps: 34.008392345050055 [2022/08/08 16:28:45] ppocr INFO: save best model is to ./output/ser_vi_layoutxlm_xfund_zh/best_accuracy [2022/08/08 16:28:45] ppocr INFO: best metric, hmean: 0.14564265817747712, precision: 0.11526348939743859, recall: 0.19776657060518732, fps: 34.008392345050055, best_epoch: 1 [2022/08/08 16:28:51] ppocr INFO: save model in ./output/ser_vi_layoutxlm_xfund_zh/latest日志中各字段含义如下:
| 字段 | 含义 |
|---|---|
epoch | 当前迭代轮数 |
global_step/iter | 当前全局迭代次数 |
lr | 当前学习率 |
loss | 当前损失函数值 |
avg_reader_cost | 当前 batch 数据读取耗时 |
avg_batch_cost | 当前 batch 总耗时 |
avg_samples | 当前 batch 样本数 |
ips | 每秒处理的样本数 |
PaddleOCR 支持训练中评估:修改配置文件 configs/kie/vi_layoutxlm/ser_vi_layoutxlm_xfund_zh.yml 中的eval_batch_step(默认[0, 19],即第 0 次迭代后每 19 次迭代评估一次),hmean 最优的模型会保存为output/ser_vi_layoutxlm_xfund_zh/best_accuracy/。如果评估集很大,建议适当拉大评估间隔,或训练结束后再单独评估。
更多 KIE 模型训练方式与配置文件,可进入
configs/kie/目录查看(vi_layoutxlm/下含 SER/RE 及其蒸馏配置,layoutlm_series/下含 LayoutLM / LayoutLMv2 / LayoutXLM 系列配置),也可参考前沿 KIE 算法概览。
3.3 配置文件深度解读与自定义数据集适配
训练自定义数据集时,需要修改配置中的数据路径、字典文件与类别数。以 configs/kie/vi_layoutxlm/ser_vi_layoutxlm_xfund_zh.yml 为例,需要修改的关键部分如下:
Architecture: # ... Backbone: name: LayoutXLMForSer pretrained: True mode: vi # 假设字典文件中包含 n 个类别(含 other),则 num_classes 设置为 2n-1 num_classes: &num_classes 7 PostProcess: name: kieSerTokenLayoutLMPostProcess # 修改为自定义数据集的字典文件路径 class_path: &class_path train_data/XFUND/class_list_xfun.txt Train: dataset: name: SimpleDataSet # 修改为训练数据集路径 data_dir: train_data/XFUND/zh_train/image # 修改为训练标注文件路径 label_file_list: - train_data/XFUND/zh_train/train.json ... loader: # 单卡训练 batch size batch_size_per_card: 8 ... Eval: dataset: name: SimpleDataSet # 修改为评估数据集路径 data_dir: train_data/XFUND/zh_val/image # 修改为评估标注文件路径 label_file_list: - train_data/XFUND/zh_val/val.json ... loader: # 单卡评估 batch size batch_size_per_card: 8注意:预测 / 评估使用的配置文件必须与训练文件保持一致。
结合仓库中的实际配置文件,可进一步理解如下实现细节(均以 ser_vi_layoutxlm_xfund_zh.yml 为准):
- num_classes = 2n - 1:VI-LayoutXLM 的 SER 头采用 BIO 标注方案,
n为字典中的类别数(含other),每个非 other 类别对应B-与I-两个标签,再加上O(other),因此类别总数为2n - 1。例如 XFUND 的class_list_xfun.txt含 4 类,故num_classes为 7。若使用mode: base则会加载基础版 LayoutXLM 权重,mode: vi则加载 VI-LayoutXLM 多语言权重。 - 数据增强管线(transforms):训练与评估共用同一套算子,依次为
DecodeImage(RGB 解码)→VQATokenLabelEncode(将文本行与标签编码为 token 序列,contains_re: False表示不包含关系标注,order_method: "tb-yx"表示按「自上而下、自左而右」的版面顺序对 token 排序)→VQATokenPad(padding 至max_seq_len: 512,同时返回 attention mask)→VQASerTokenChunk(按最大序列长度切块)→Resize(图像缩放到 224×224)→NormalizeImage/ToCHWImage/KeepKeys。KeepKeys决定了数据加载器按input_ids / bbox / attention_mask / token_type_ids / image / labels的顺序返回张量,这与 vqa_layoutlm.py 中LayoutXLMForSer.forward的输入顺序严格对应。 - 损失与优化器:SER 使用
VQASerTokenLayoutLMLoss(交叉熵),RE 使用LossFromOutput;两者优化器均为AdamW,学习率0.00005、warmup 若干 epoch、L2 正则因子为0.00000。RE 配置 re_vi_layoutxlm_xfund_zh.yml 额外增加clip_norm: 10梯度裁剪,并在 transforms 中加入VQAReTokenRelation(基于标注中的linking构建实体关系矩阵)与TensorizeEntitiesRelations,keep_keys相应变为entities / relations。 - 推理时接入 OCR:预测阶段
Global.infer_img指定输入图像,tools/infer_kie_token_ser.py 中的SerPredictor会内部实例化PaddleOCR引擎(默认加载 PP-OCRv3 检测与识别模型,也可通过Global.kie_det_model_dir/Global.kie_rec_model_dir指定)完成 OCR 后送入 KIE 模型。
3.4 断点续训(Resume Training)
若训练中断,可通过指定Architecture.Backbone.checkpoints加载已保存的模型继续训练:
python3 tools/train.py -c configs/kie/vi_layoutxlm/ser_vi_layoutxlm_xfund_zh.yml -o Architecture.Backbone.checkpoints=./output/ser_vi_layoutxlm_xfund_zh/best_accuracy注意事项:
Architecture.Backbone.checkpoints的优先级高于Architecture.Backbone.pretrained。微调(finetune)、断点续训与评估都需要设置checkpoints;若希望使用 NLP 预训练模型从头训练,则应设置Architecture.Backbone.pretrained=True且Architecture.Backbone.checkpoints=null。- LayoutXLM 系列模型复用 PaddleNLP 的加载/保存逻辑,因此无需设置
Global.pretrained_model或Global.checkpoints。 - 若使用知识蒸馏训练 LayoutXLM 系列模型,当前不支持断点续训。
3.5 混合精度训练
混合精度(AMP)训练正在持续完善中(原文档标注 "coming soon!"),仓库中 ser_vi_layoutxlm_xfund_zh.yml 已在Global中预留amp_custom_white_list: ['scale', 'concat', 'elementwise_add']白名单配置,用于混合精度策略的算子白名单控制,具体以仓库后续版本为准。
3.6 分布式训练(多机多卡)
多机多卡训练时,使用--ips指定参与训练的机器 IP,--gpus指定使用的 GPU ID:
python3 -m paddle.distributed.launch --ips="xx.xx.xx.xx,xx.xx.xx.xx" --gpus '0,1,2,3' tools/train.py -c configs/kie/vi_layoutxlm/ser_vi_layoutxlm_xfund_zh.yml注意:(1) 需将命令中的ips替换为实际机器地址,且各机器之间需要能互相 ping 通;(2) 需要在每台机器上分别启动训练;(3) 查看本机 IP 可使用ifconfig命令;(4) 关于分布式训练加速比的更多细节,可参考 分布式训练教程。
3.7 知识蒸馏训练(UDML)
PaddleOCR 支持在 KIE 训练中使用知识蒸馏,配置入口为 configs/kie/vi_layoutxlm/ser_vi_layoutxlm_xfund_zh_udml.yml,原理详见知识蒸馏文档。
从蒸馏配置可以看出其训练范式:Architecture.name设为DistillationModel,同时定义Teacher与Student两个分支(均为LayoutXLMForSer,mode: vi);损失使用CombinedLoss组合多项,包括:
DistillationVQASerTokenLayoutLMLoss(权重 1.0):教师与学生分支的 SER 标注损失;DistillationSERDMLLoss(权重 1.0):教师与学生输出分布之间的 DML 蒸馏损失(act: softmax、use_log: true);- 两个
DistillationVQADistanceLoss(权重 0.5):对第 5 层与第 8 层hidden_states施加 L2 距离约束,实现特征级对齐。
后处理与评估分别使用DistillationSerPostProcess与DistillationMetric(基于VQASerTokenMetric,main_indicator: hmean,以 Student 分支为准)。
注意:LayoutXLM 系列 KIE 模型的保存与加载逻辑与 PaddleNLP 一致,蒸馏过程中只保存学生模型的参数。若要用保存的模型进行评估,需要使用学生模型对应的配置,即 configs/kie/vi_layoutxlm/ser_vi_layoutxlm_xfund_zh.yml。
3.8 其他平台训练(Windows / macOS / Linux DCU)
- Windows GPU/CPU:Windows 平台与 Linux 略有不同:仅支持单 GPU训练与推理,需通过
set CUDA_VISIBLE_DEVICES=0指定 GPU;同时 Windows 上 DataLoader 仅支持单进程模式,需要将num_workers设为 0。 - macOS:不支持 GPU 模式,需在配置文件中将
use_gpu设为 False,其余训练/评估/预测命令与 Linux GPU 完全相同。 - Linux DCU:在 DCU 设备上运行需设置环境变量
export HIP_VISIBLE_DEVICES=0,1,2,3,其余训练与评估预测命令与 Linux GPU 完全相同。
4. 评估与测试
4.1 模型评估(Evaluation)
训练好的模型保存在Global.save_model_dir目录。评估时需要将Architecture.Backbone.checkpoints指向模型目录,评估数据集可通过修改 configs/kie/vi_layoutxlm/ser_vi_layoutxlm_xfund_zh.yml 中的Eval.dataset.label_file_list字段来指定:
# GPU evaluation, Global.checkpoints is the weight to be tested python3 tools/eval.py -c configs/kie/vi_layoutxlm/ser_vi_layoutxlm_xfund_zh.yml -o Architecture.Backbone.checkpoints=./output/ser_vi_layoutxlm_xfund_zh/best_accuracy评估完成后会打印 precision、recall、hmean 等指标:
[2022/08/09 07:59:28] ppocr INFO: metric eval *************** [2022/08/09 07:59:28] ppocr INFO: precision:0.697476609016161 [2022/08/09 07:59:28] ppocr INFO: recall:0.8861671469740634 [2022/08/09 07:59:28] ppocr INFO: hmean:0.7805806758686339 [2022/08/09 07:59:28] ppocr INFO: fps:17.367364606899105其中hmean为 precision 与 recall 的调和平均值,是 KIE 模型的主指标(对应配置中Metric.main_indicator: hmean)。
4.2 模型测试 / 预测(SER 任务)
使用 PaddleOCR 训练出的模型,可通过以下脚本快速获得预测结果。默认预测图像由Global.infer_img指定,训练模型权重通过-o Global.checkpoints指定(注意此处为Global.checkpoints,实际运行命令中为Architecture.Backbone.checkpoints)。
根据配置文件中的Global.save_model_dir与save_epoch_step字段,训练结束后会保存如下文件:
output/ser_vi_layoutxlm_xfund_zh/ ├── best_accuracy ├── metric.states ├── model_config.json ├── model_state.pdparams ├── best_accuracy.pdopt ├── config.yml ├── train.log ├── latest ├── metric.states ├── model_config.json ├── model_state.pdparams ├── latest.pdopt其中best_accuracy.*是评估集上效果最好的模型;latest.*是最后一个 epoch 的模型。预测所用配置文件必须与训练文件一致。若使用python3 tools/train.py -c configs/kie/vi_layoutxlm/ser_vi_layoutxlm_xfund_zh.yml完成训练,可用如下命令预测:
python3 tools/infer_kie_token_ser.py -c configs/kie/vi_layoutxlm/ser_vi_layoutxlm_xfund_zh.yml -o Architecture.Backbone.checkpoints=./output/ser_vi_layoutxlm_xfund_zh/best_accuracy Global.infer_img=./ppstructure/docs/kie/input/zh_val_42.jpg输出结果图像会保存到Global.save_res_path指定的目录(默认./output/ser/xfund_zh/res)。
使用预标注 OCR 结果预测(关闭内置 OCR 引擎):预测过程中默认会加载 PP-OCRv3 检测与识别模型来执行 OCR 信息抽取。如果希望直接使用预先得到的 OCR 结果,可将Global.infer_img指定为标注文件(其中包含图像路径与 OCR 信息),并设置Global.infer_mode=False,表示此时不使用 OCR 推理引擎:
python3 tools/infer_kie_token_ser.py -c configs/kie/vi_layoutxlm/ser_vi_layoutxlm_xfund_zh.yml -o Architecture.Backbone.checkpoints=./output/ser_vi_layoutxlm_xfund_zh/best_accuracy Global.infer_img=./train_data/XFUND/zh_val/val.json Global.infer_mode=False从 tools/infer_kie_token_ser.py 的实现可以看到该机制:SerPredictor.__init__中判断Global.infer_mode,为False时读取标注文件逐行解析(以\t切分得到图像路径与标注),否则走get_image_file_list遍历图像目录;可视化通过draw_ser_results完成并写出*_ser.jpg结果图。对比两种预测方式可以发现,使用标注 OCR 结果时部分检测信息更准确,但整体信息抽取结果基本一致。
4.3 模型测试 / 预测(RE 任务,SER + RE 串联)
RE 模型预测需要先给出 SER 模型结果,因此需要同时加载 SER 的配置文件与模型权重:
python3 ./tools/infer_kie_token_ser_re.py \ -c configs/kie/vi_layoutxlm/re_vi_layoutxlm_xfund_zh.yml \ -o Architecture.Backbone.checkpoints=./pretrain_models/re_vi_layoutxlm_udml_xfund_zh/best_accuracy/ \ Global.infer_img=./train_data/XFUND/zh_val/image/ \ -c_ser configs/kie/vi_layoutxlm/ser_vi_layoutxlm_xfund_zh.yml \ -o_ser Architecture.Backbone.checkpoints=pretrain_models/ \ ser_vi_layoutxlm_udml_xfund_zh/best_accuracy/其中-c_ser表示 SER 配置文件,-o_ser表示覆盖 SER 配置中相应内容的参数。
同样支持使用预标注 OCR 结果预测:
python3 ./tools/infer_kie_token_ser_re.py \ -c configs/kie/vi_layoutxlm/re_vi_layoutxlm_xfund_zh.yml \ -o Architecture.Backbone.checkpoints=./pretrain_models/re_vi_layoutxlm_udml_xfund_zh/best_accuracy/ \ Global.infer_img=./train_data/XFUND/zh_val/val.json \ Global.infer_mode=False \ -c_ser configs/kie/vi_layoutxlm/ser_vi_layoutxlm_xfund_zh.yml \ -o_ser Architecture.Backbone.checkpoints=pretrain_models/ser_vi_layoutxlm_udml_xfund_zh/best_accuracy/从源码 tools/infer_kie_token_ser_re.py 可以看清 SER→RE 的串联机制:ReArgsParser在标准参数基础上扩展了-c_ser与-o_ser两个参数;SerRePredictor.__call__先调用self.ser_engine(data)得到 SER 预测结果,再经make_input将 SER 结果中的实体(过滤掉O标签)与其穷举的「QUESTION→ANSWER」关系对构造成entities / relations张量,作为 RE 模型的附加输入;RE 的后处理VQAReTokenLayoutLMPostProcess会结合ser_results与实体索引字典输出最终的键值关系。实验表明,直接使用标注 OCR 结果进行 RE 预测,结果通常更准确。
5. 模型推理(部署级 Inference)
5.1 导出推理模型
推理模型(paddle.jit.save保存的模型)是训练完成后固化的模型,主要用于部署环境中的预测;而训练过程中保存的是 checkpoints 模型,仅保存模型参数,主要用于断点续训。
相比 checkpoints 模型,推理模型额外保存了模型的结构信息,模型结构与参数已固化在推理文件中,因此更易于部署,适合与实际系统集成。
SER 模型导出命令:
# -c 设置训练算法 yml 配置文件 # -o 设置可选参数 # Architecture.Backbone.checkpoints 设置训练模型地址 # Global.save_inference_dir 设置转换后模型的保存地址 python3 tools/export_model.py -c configs/kie/vi_layoutxlm/ser_vi_layoutxlm_xfund_zh.yml -o Architecture.Backbone.checkpoints=./output/ser_vi_layoutxlm_xfund_zh/best_accuracy Global.save_inference_dir=./inference/ser_vi_layoutxlmRE 模型导出命令:
python3 tools/export_model.py -c configs/kie/vi_layoutxlm/re_vi_layoutxlm_xfund_zh.yml -o Architecture.Backbone.checkpoints=./output/re_vi_layoutxlm_xfund_zh/best_accuracy Global.save_inference_dir=./inference/re_vi_layoutxlm转换成功后,模型保存目录下会有三个文件:
inference/ser_vi_layoutxlm/ ├── inference.pdiparams # The parameter file of recognition inference model ├── inference.pdiparams.info # The parameter information of recognition inference model, which can be ignored └── inference.pdmodel # The program file of recognition5.2 推理模型预测
VI-LayoutXLM 模型基于 SER 任务进行推理,可执行以下命令。
SER 推理模型预测:
cd ppstructure python3 kie/predict_kie_token_ser.py \ --kie_algorithm=LayoutXLM \ --ser_model_dir=../inference/ser_vi_layoutxlm \ --image_dir=./docs/kie/input/zh_val_42.jpg \ --ser_dict_path=../train_data/XFUND/class_list_xfun.txt \ --vis_font_path=../doc/fonts/simfang.ttf \ --ocr_order_method="tb-yx"RE 推理模型预测(SER 与 RE 推理模型串联):
cd ppstructure python3 kie/predict_kie_token_ser_re.py \ --kie_algorithm=LayoutXLM \ --re_model_dir=../inference/re_vi_layoutxlm \ --ser_model_dir=../inference/ser_vi_layoutxlm \ --use_visual_backbone=False \ --image_dir=./docs/kie/input/zh_val_42.jpg \ --ser_dict_path=../train_data/XFUND/class_list_xfun.txt \ --vis_font_path=../doc/fonts/simfang.ttf \ --ocr_order_method="tb-yx"可视化结果默认保存在./output目录。
上述参数要点:
--kie_algorithm=LayoutXLM:指定 KIE 算法类型;--ser_model_dir/--re_model_dir:SER / RE 推理模型目录;--ser_dict_path:SER 任务的类别字典文件;--vis_font_path:可视化所用的中文字体,仓库内置字体位于 doc/fonts/simfang.ttf;--ocr_order_method="tb-yx":OCR 文本行排序方式(top-bottom、left-right),需与训练配置保持一致;--use_visual_backbone=False:关闭 RE 模型的视觉骨干分支。结合 ppstructure/kie/predict_kie_token_ser_re.py 源码可见,该开关会决定re_input是否弹出第 4 个张量(图像特征),从而跳过视觉分支以提升推理速度;对应地,vqa_layoutlm.py 中LayoutXLMForRe.forward也会根据use_visual_backbone调整entities / relations的索引位置。
6. FAQ 与常见问题排查
Q1:训练模型转换为推理模型后,预测效果不一致?
A:此类问题绝大多数是由训练模型预测与推理模型预测时的预处理、后处理参数不一致引起的。建议逐一对比训练所用配置文件与推理阶段的预处理、后处理及预测参数是否存在差异,重点检查transforms中的图像尺寸(Resize)、归一化均值/方差、order_method排序方式、class_path字典文件与max_seq_len等是否与训练保持一致。
7. 结语
本文围绕 PaddleOCR 的 KIE 全流程,完整覆盖了数据准备(通用标注格式、字典文件、XFUND/FUNSD 转换)、VI-LayoutXLM 的 SER/RE 训练(单卡、多卡、断点续训、知识蒸馏、多平台)、评估、预测(含内置 OCR 与预标注 OCR 两种模式)以及推理模型导出与部署推理。结合仓库源码,你可以进一步沿着 configs/kie/(配置入口)、ppocr/modeling/backbones/vqa_layoutlm.py(模型结构)、tools/infer_kie_token_ser.py 与 tools/infer_kie_token_ser_re.py(SER/RE 串联预测)、ppstructure/kie/(推理脚本与数据转换工具)四条主线,将这套流程迁移到票据、证照、合同等自定义文档场景中。
【免费下载链接】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),仅供参考