PaddleOCR 关键信息抽取算法 VI-LayoutXLM:原理、配置与 SER/RE 全流程实战指南
【免费下载链接】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 中的VI-LayoutXLM 关键信息抽取算法(视觉无关版 LayoutXLM),系统讲解其在语义实体识别(SER)与关系抽取(RE)两大任务上的模型原理、数据集准备、配置详解、训练/评估/预测以及 inference 模型导出与推理部署的完整链路。读完本文,你将能够基于configs/kie/vi_layoutxlm/下的配置文件,在 XFUND_zh 等数据集上独立完成 VI-LayoutXLM 从训练到 Python 推理部署的端到端实战,并理解其"去掉视觉骨干、精度无损、推理加速"的设计动机与底层实现。
1. 算法简介:从 LayoutXLM 到 VI-LayoutXLM
1.1 算法定位
VI-LayoutXLM(Visual-Independent LayoutXLM)是 PaddleOCR 中对LayoutXLM多模态文档理解模型的关键信息抽取改进。其核心思路是:在下游任务(SER/RE)的训练过程中,去除视觉骨干网络(visual backbone)模块,仅依赖文本与布局(bbox)两种模态完成文档关键信息抽取。由于视觉特征不再参与计算,模型在最终精度基本无损的前提下,推理速度进一步提升。
从源码结构看,该改进体现在 vqa_layoutlm.py 中LayoutXLMForSer与 vqa_layoutlm.py 中LayoutXLMForRe的实现:
if ( hasattr(self.model.layoutxlm, "use_visual_backbone") and self.model.layoutxlm.use_visual_backbone is False ): self.use_visual_backbone = False def forward(self, x): if self.use_visual_backbone is True: image = x[4] else: image = None当检测到底层 PaddleNLP 预训练模型的use_visual_backbone为False时,image输入被置为None,网络跳过图像特征分支。而 VI-LayoutXLM 系列预训练模型(vi-layoutxlm-base-uncased)恰好以"无视觉骨干"的形式发布,从而在训练与推理中省去整个视觉特征提取的计算开销。
1.2 复现精度
在XFUND_zh数据集上,PaddleOCR 官方复现效果如下:
| 模型 | 骨干网络 | 任务 | 配置文件 | hmean | 下载链接 |
|---|---|---|---|---|---|
| VI-LayoutXLM | VI-LayoutXLM-base | SER | ser_vi_layoutxlm_xfund_zh_udml.yml | 93.19% | 训练模型 / 推理模型 |
| VI-LayoutXLM | VI-LayoutXLM-base | RE | re_vi_layoutxlm_xfund_zh_udml.yml | 83.92% | 训练模型 / 推理模型 |
说明:上表两个配置均为U-DML 知识蒸馏训练配置(后缀
udml),hmean 为该配置下的复现结果。此外,configs/kie/vi_layoutxlm/目录还提供对应的非蒸馏基础配置ser_vi_layoutxlm_xfund_zh.yml与re_vi_layoutxlm_xfund_zh.yml。
1.3 算法家族与技术背景
VI-LayoutXLM 属于 PaddleOCR 关键信息抽取(KIE)算法家族中的 LayoutXLM 系列。LayoutXLM(论文 arXiv:2104.08836)是面向**多语言视觉丰富文档理解(Visually-rich Document Understanding)**的多模态预训练模型,其前置工作包括 LayoutLM(arXiv:1912.13318)与 LayoutLMv2(arXiv:2012.14740)。该系列模型将文本(text)、布局(layout/bbox)与图像(image)三种模态统一建模,用于票据、证件、表格等场景的文档信息抽取。论文引用格式见本文最后一节。
2. 环境配置与项目克隆
训练与推理 VI-LayoutXLM 前,需要先完成 PaddleOCR 的运行环境准备与项目克隆:
- 运行环境准备:请参考《运行环境准备》,安装 PaddlePaddle 与 PaddleOCR 依赖(PaddleOCR 的 KIE 模型通过 PaddleNLP 加载 LayoutXLM 预训练模型,需确保 PaddleNLP 正确安装)。
- 项目克隆:请参考《项目克隆》获取仓库代码。
完成上述两步后,后续所有训练、评估、预测与导出命令均在该仓库根目录下执行。
3. 数据准备:从 XFUND 原始数据到 PaddleOCR 训练格式
VI-LayoutXLM 训练使用SimpleDataSet(文本文件存储的通用数据格式)。PaddleOCR 对代码进行了模块化,训练不同的 KIE 模型只需要更换配置文件即可,数据格式完全通用。完整的数据准备细节可参考关键信息抽取教程。
3.1 数据集目录组织
训练数据默认存放在train_data目录。若本地已有数据集,可创建软链接:
# 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>最终数据集推荐结构如下:
|-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 | ...3.2 标注文件格式
训练集与验证集各用一个文本文件记录"图片路径 + 标注信息",二者用\t分割(不可使用其他分隔符,否则训练报错),标注信息为 JSON 字符串:
"图像文件名\t图像标注信息" 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]]}]每个元素(字典)字段含义如下:
| 字段 | 含义 |
|---|---|
transcription | 文本行的文字内容 |
label | 该文本行所属的类别(SER 标签) |
points | 文本行的四点(左上、右上、右下、左下)坐标 |
id | 文本行 id,用于 RE 任务的实体配对 |
linking | 文本行之间的连接信息(实体关系对),用于 RE 任务 |
3.3 字典文件
所有标签的类别列表存放在字典文件中(如class_list.txt),每行一个类别。以 XFUND_zh 为例共 4 类:
OTHER QUESTION ANSWER HEADER注意两点:
- 类别信息不区分大小写,
HEADER与header会被解析为同一类别 id,因此不能用仅大小写不同的字符串表示不同类别; - 建议将
other类别放在第一行,解析时other的类别 id 为 0,后续可视化时该类别不会被绘制。
3.4 公开数据下载与格式转换
没有本地数据时,可从 XFUND 或 FUNSD 官网下载原始数据,再用仓库内转换脚本生成 PaddleOCR 训练格式:
- XFUND 转换脚本:trans_xfun_data.py
- FUNSD 转换脚本:
ppstructure/kie/tools/trans_funsd_label.py
以 XFUND 为例,转换脚本会将原始 json 中的box转为四点points,并保留id、linking字段,输出"图片路径\t标注json"格式:
python3 ppstructure/kie/tools/trans_xfun_data.py \ --ori_gt_path <XFUND原始gt.json> \ --output_path train_data/XFUND/zh_train/train.json更多公开数据集说明见关键信息抽取数据集文档。如需人工标注,可使用 PPOCRLabel。
3.5 快速下载已处理好的 XFUND_zh 数据集
mkdir train_data cd train_data wget https://paddleocr.bj.bcebos.com/ppstructure/dataset/XFUND.tar && tar -xf XFUND.tar cd ..4. 模型训练
4.1 下载预训练模型(可选)
如果只想体验评估、预测、动转静、推理流程,可跳过数据训练,直接下载基于 XFUND 的 SER 与 RE 预训练模型:
mkdir pretrained_model cd pretrained_model # 下载并解压SER预训练模型 wget https://paddleocr.bj.bcebos.com/ppstructure/models/vi_layoutxlm/ser_vi_layoutxlm_xfund_pretrained.tar && tar -xf ser_vi_layoutxlm_xfund_pretrained.tar # 下载并解压RE预训练模型 wget https://paddleocr.bj.bcebos.com/ppstructure/models/vi_layoutxlm/re_vi_layoutxlm_xfund_pretrained.tar && tar -xf re_vi_layoutxlm_xfund_pretrained.tar4.2 启动训练
- 若安装的是 CPU 版本 PaddlePaddle,请将配置文件中的
use_gpu改为False; - PaddleOCR 训练时会自动下载 VI-LayoutXLM 预训练模型(基于 PaddleNLP 加载
vi-layoutxlm-base-uncased),无需预先手动下载; - 训练日志会自动保存到配置文件中
Global.save_model_dir目录下的train.log。
# SER 单卡训练 python3 tools/train.py -c configs/kie/vi_layoutxlm/ser_vi_layoutxlm_xfund_zh.yml # SER 多卡训练,通过--gpus参数指定卡号 python3 -m paddle.distributed.launch --gpus '0,1,2,3' tools/train.py -c configs/kie/vi_layoutxlm/ser_vi_layoutxlm_xfund_zh.yml # RE 任务单卡训练 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日志字段含义:
| 字段 | 含义 |
|---|---|
| epoch | 当前迭代轮次 |
| iter | 当前迭代次数 |
| lr | 当前学习率 |
| loss | 当前损失函数值 |
| reader_cost | 当前 batch 数据处理耗时 |
| batch_cost | 当前 batch 总耗时 |
| samples | 当前 batch 内的样本数 |
| ips | 每秒处理图片的数量 |
PaddleOCR 支持训练与评估交替进行,可在配置文件中修改eval_batch_step设置评估频率(ser_vi_layoutxlm_xfund_zh.yml默认每 19 个 iter 评估一次)。评估过程中默认将最佳 hmean 模型保存为output/ser_vi_layoutxlm_xfund_zh/best_accuracy/。若验证集很大,建议减少评估次数或训练完再评估。
4.3 自定义数据集的配置修改
训练自己的数据集时,需要修改配置文件中的数据配置、字典文件与类别数。以configs/kie/vi_layoutxlm/ser_vi_layoutxlm_xfund_zh.yml为例,核心修改点如下:
Architecture: Backbone: name: LayoutXLMForSer pretrained: True mode: vi # 采用BIO标注时:字典含n个字段(含other)则类别数为2n-1;不含other则为2n+1。 # 否则训练会报 IndexError: (OutOfRange) label value should less than the shape of axis dimension num_classes: &num_classes 7 PostProcess: name: VQASerTokenLayoutLMPostProcess # 修改为自定义数据集的字典路径 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_per_card: 8 # 训练单卡 batch_size 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_per_card: 8 # 验证单卡 batch_size注意:预测/评估时的配置文件务必与训练保持一致。
4.4 断点训练
训练中断后,可通过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。加载之前训练好的模型做微调/恢复训练/评估时,必须用checkpoints指定参数路径;若使用默认通用预训练模型从头训练,则pretrained设为True且checkpoints设为空(null);- LayoutXLM 系列模型均调用 PaddleNLP 中的预训练模型,模型加载与保存逻辑与 PaddleNLP 一致,因此无需指定
Global.pretrained_model或Global.checkpoints; - LayoutXLM 系列模型的蒸馏训练目前不支持断点训练。
4.5 分布式训练
多机多卡训练时,通过--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 通(可用ifconfig查看 IP);(2)需在多台机器上分别启动命令;(3)更多分布式训练性能说明参考分布式训练教程。
4.6 基于 U-DML 的知识蒸馏训练
PaddleOCR 支持基于 U-DML 知识蒸馏的 KIE 模型训练,配置文件为 ser_vi_layoutxlm_xfund_zh_udml.yml 与 re_vi_layoutxlm_xfund_zh_udml.yml,训练命令:
python3 tools/train.py -c configs/kie/vi_layoutxlm/ser_vi_layoutxlm_xfund_zh_udml.yml蒸馏配置文件采用DistillationModel结构,同时定义Teacher与Student两个LayoutXLMForSer子模型,并通过CombinedLoss组合多路蒸馏损失:
Architecture: name: DistillationModel algorithm: Distillation Models: Teacher: Backbone: name: LayoutXLMForSer pretrained: True mode: vi num_classes: &num_classes 7 Student: Backbone: name: LayoutXLMForSer pretrained: True mode: vi num_classes: *num_classes Loss: name: CombinedLoss loss_config_list: - DistillationVQASerTokenLayoutLMLoss: weight: 1.0 model_name_list: ["Student", "Teacher"] key: backbone_out num_classes: *num_classes - DistillationSERDMLLoss: weight: 1.0 act: "softmax" use_log: true model_name_pairs: - ["Student", "Teacher"] key: backbone_out - DistillationVQADistanceLoss: weight: 0.5 mode: "l2" model_name_pairs: - ["Student", "Teacher"] key: hidden_states_5 - DistillationVQADistanceLoss: weight: 0.5 mode: "l2" model_name_pairs: - ["Student", "Teacher"] key: hidden_states_8该配置同时使用标签损失、SER-DML 损失以及中间层(hidden_states_5、hidden_states_8)的 L2 距离损失来约束学生模型逼近教师模型。更多知识蒸馏说明参考知识蒸馏文档。
注意:LayoutXLM 系列 KIE 模型与 PaddleNLP 的保存/加载逻辑保持一致,蒸馏过程中仅保存学生模型参数。若用保存的模型进行评估,需要使用学生模型对应的配置(蒸馏配置对应的学生模型为 ser_vi_layoutxlm_xfund_zh.yml)。
4.7 其他训练环境
- Windows GPU/CPU:仅支持单卡训练与预测,指定 GPU 用
set CUDA_VISIBLE_DEVICES=0;DataLoader 仅支持单进程,需将num_workers设为 0; - macOS:不支持 GPU,需在配置文件中设置
use_gpu: False,其余命令与 Linux 相同; - Linux DCU:需设置环境变量
export HIP_VISIBLE_DEVICES=0,1,2,3,其余命令与 Linux GPU 相同。
5. 模型评估与测试
5.1 指标评估
训练中模型参数默认保存在Global.save_model_dir目录下。评估时需用Architecture.Backbone.checkpoints指向保存的参数文件,评估数据集通过配置文件中 Eval 段的data_dir/label_file_list设置:
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.3673646068991055.2 训练产出的模型文件
根据配置中的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.*是最新保存的模型。
5.3 使用 OCR 引擎快速预测
默认预测会加载 PP-OCRv3 检测/识别模型对图片做 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=./ppstructure/docs/kie/input/zh_val_42.jpg预测图片会保存在Global.save_res_path指定路径中。若希望使用预先获取的(或标注的)OCR 结果而非在线运行 OCR 引擎,可指定Global.infer_img为标注文件(内含图片路径与 OCR 信息),并设置Global.infer_mode=False:
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使用标注 OCR 结果时部分检测框信息更准确,但整体信息抽取结果基本一致。
5.4 RE 任务的预测
RE 预测需要先得到 SER 结果,因此要同时加载 SER 与 RE 的配置和权重:
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 模型参数(如预训练权重)。同理,RE 也可通过Global.infer_mode=False+ 标注文件方式使用预先获取的 OCR 结果,直接使用标注 OCR 结果的 RE 预测通常更准确。
6. 配置文件深度解析
6.1 SER 配置 ser_vi_layoutxlm_xfund_zh.yml
| 配置段 | 关键字段 | 说明 |
|---|---|---|
| Global | epoch_num: 200 | 总训练轮数 |
| Global | eval_batch_step: [0, 19] | 从第 0 个 iter 起,每 19 个 iter 评估一次 |
| Global | save_model_dir: ./output/ser_vi_layoutxlm_xfund_zh | 模型保存目录 |
| Global | infer_img: ppstructure/docs/kie/input/zh_val_42.jpg | 默认推理图片 |
| Global | d2s_train_image_shape: [3, 224, 224] | 训练图像输入尺寸 |
| Global | amp_custom_white_list: ['scale', 'concat', 'elementwise_add'] | AMP 混合精度自定义白名单算子 |
| Architecture.Backbone | name: LayoutXLMForSer | SER 骨干网络(PaddleNLP 实现) |
| Architecture.Backbone | mode: vi | 使用 VI-LayoutXLM(visual-independent)预训练权重,可选base或vi |
| Architecture.Backbone | num_classes: 7 | BIO 标注下的类别数(4 类含 other 时为 2×4−1=7) |
| Loss | name: VQASerTokenLayoutLMLoss | SER token 级分类损失 |
| Optimizer | name: AdamW, lr: 0.00005, warmup_epoch: 2 | 优化器与学习率策略 |
| PostProcess | name: VQASerTokenLayoutLMPostProcess | SER 后处理 |
| PostProcess | class_path: train_data/XFUND/class_list_xfun.txt | 类别字典路径 |
| Metric | name: VQASerTokenMetric, main_indicator: hmean | 评估指标 |
| Train/Eval | batch_size_per_card: 8、num_workers: 4 | 批大小与数据加载线程数 |
训练与评估的transforms流水线(SER)为:
transforms: - DecodeImage: # 读取图像,RGB、channel_first=False img_mode: RGB channel_first: False - VQATokenLabelEncode: # 将 OCR 文本/bbox/标签编码为 token 输入 contains_re: False # 非 RE 任务 algorithm: "LayoutXLM" class_path: train_data/XFUND/class_list_xfun.txt use_textline_bbox_info: True order_method: "tb-yx" # 文本行排序方式,可选 None 或 "tb-yx" - VQATokenPad: # token padding 到 max_seq_len max_seq_len: 512 return_attention_mask: True - VQASerTokenChunk: # 超长序列分块 max_seq_len: 512 - Resize: size: [224, 224] - NormalizeImage: # ImageNet 归一化参数 scale: 1 mean: [123.675, 116.28, 103.53] std: [58.395, 57.12, 57.375] order: 'hwc' - ToCHWImage: - KeepKeys: keep_keys: ['input_ids', 'bbox', 'attention_mask', 'token_type_ids', 'image', 'labels']其中order_method: "tb-yx"表示按"从上到下、从右到左"(top-bottom, y-x)的规则对文本行排序,用于将 2D 版面文本序列化为 token 序列。
6.2 RE 配置 re_vi_layoutxlm_xfund_zh.yml
| 配置段 | 关键字段 | 说明 |
|---|---|---|
| Global | epoch_num: 130 | 总训练轮数 |
| Global | save_model_dir: ./output/re_vi_layoutxlm_xfund_zh | 模型保存目录 |
| Architecture.Backbone | name: LayoutXLMForRe | RE 骨干网络 |
| Loss | name: LossFromOutput, key: loss, reduction: mean | 直接取模型输出 loss |
| Optimizer | clip_norm: 10、warmup_epoch: 10 | 梯度裁剪范数与 warmup |
| PostProcess | name: VQAReTokenLayoutLMPostProcess | RE 后处理(解析实体关系对) |
| Metric | name: VQAReTokenMetric, main_indicator: hmean | 评估指标 |
| Train loader | batch_size_per_card: 2 | RE 任务显存占用较大,批大小更小 |
RE 任务的 transforms 在 SER 基础上额外加入关系标注处理算子:
transforms: - VQATokenLabelEncode: contains_re: True # 开启 RE 标签编码 ... - VQAReTokenRelation: # 构建实体-关系张量 - VQAReTokenChunk: max_seq_len: 512 - TensorizeEntitiesRelations: # 实体/关系张量化 - KeepKeys: keep_keys: ['input_ids', 'bbox', 'attention_mask', 'token_type_ids', 'entities', 'relations']6.3 蒸馏配置与基础配置的关系
*_udml.yml为知识蒸馏配置(Architecture.name: DistillationModel,含 Teacher/Student 双模型与多路损失),基础配置为单模型直接训练。两者共享相同的数据路径、transforms 与num_classes设置;蒸馏配置的训练批大小(batch_size_per_card: 4)因同时前向 Teacher 与 Student 而更小。SER 与 RE 的完整配置均位于 configs/kie/vi_layoutxlm/。
7. 模型导出与 Python 推理部署
7.1 inference 模型与 checkpoints 模型的区别
inference 模型(paddle.jit.save保存)是模型结构与参数一并固化的模型,多用于预测部署场景,推理性能优越、便于系统集成;checkpoints 模型只保存参数,多用于恢复训练。因此部署前需要将训练产出的 checkpoints 导出为 inference 模型。
7.2 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_layoutxlm转换成功后生成三个文件:
inference/ser_vi_layoutxlm/ ├── inference.pdiparams # inference模型的参数文件 ├── inference.pdiparams.info # inference模型的参数信息,可忽略 └── inference.pdmodel # inference模型的模型结构文件也可以直接下载官方已提供的推理模型(ser_vi_layoutxlm_xfund_infer.tar)。以在 XFUND_zh 上训练的模型为例,也可以这样转换:
wget https://paddleocr.bj.bcebos.com/ppstructure/models/vi_layoutxlm/ser_vi_layoutxlm_xfund_pretrained.tar tar -xf ser_vi_layoutxlm_xfund_pretrained.tar python3 tools/export_model.py -c configs/kie/vi_layoutxlm/ser_vi_layoutxlm_xfund_zh.yml \ -o Architecture.Backbone.checkpoints=./ser_vi_layoutxlm_xfund_pretrained/best_accuracy \ Global.save_inference_dir=./inference/ser_vi_layoutxlm_inferVI-LayoutXLM 基于 SER 任务进行推理:
cd ppstructure python3 kie/predict_kie_token_ser.py \ --kie_algorithm=LayoutXLM \ --ser_model_dir=../inference/ser_vi_layoutxlm_infer \ --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"SER 可视化结果默认保存到./output文件夹中,效果示例如下:
从推理脚本 predict_kie_token_ser.py 的源码可以看到 SER 推理的完整流程:SerPredictor内部通过PaddleOCR(use_angle_cls=args.use_angle_cls, det_model_dir=args.det_model_dir, rec_model_dir=args.rec_model_dir, ...)实例化 OCR 引擎,对输入图片做文本检测与识别;随后执行与训练一致的预处理算子链(VQATokenLabelEncode→VQATokenPad→VQASerTokenChunk→Resize→NormalizeImage→ToCHWImage→KeepKeys),将 OCR 结果编码为input_ids、bbox、attention_mask、token_type_ids、image等输入;推理后经VQASerTokenLayoutLMPostProcess后处理得到每个 token 的类别,最终调用draw_ser_results绘制可视化结果,同时把结构化结果写入output/infer.txt。
7.3 RE 模型导出与推理
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.pdiparams、inference.pdiparams.info、inference.pdmodel三个文件。也可直接下载官方推理模型re_vi_layoutxlm_xfund_infer.tar并转换:
wget https://paddleocr.bj.bcebos.com/ppstructure/models/vi_layoutxlm/re_vi_layoutxlm_xfund_pretrained.tar tar -xf re_vi_layoutxlm_xfund_pretrained.tar python3 tools/export_model.py -c configs/kie/vi_layoutxlm/re_vi_layoutxlm_xfund_zh.yml \ -o Architecture.Backbone.checkpoints=./re_vi_layoutxlm_xfund_pretrained/best_accuracy \ Global.save_inference_dir=./inference/re_vi_layoutxlm_inferRE 推理需要同时加载 SER 与 RE 两个模型,且需显式关闭视觉骨干(--use_visual_backbone=False,即 VI 特性):
cd ppstructure python3 kie/predict_kie_token_ser_re.py \ --kie_algorithm=LayoutXLM \ --re_model_dir=../inference/re_vi_layoutxlm_infer \ --ser_model_dir=../inference/ser_vi_layoutxlm_infer \ --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"RE 可视化结果默认保存到./output文件夹中,效果示例如下:
从推理脚本 predict_kie_token_ser_re.py 源码可以看到 RE 的级联流程:SerRePredictor内部复用SerPredictor先得到 SER 结果与中间输入,通过make_input构造 RE 模型输入;当use_visual_backbone=False时移除图像输入项(re_input.pop(4)),随后执行 RE 推理并经VQAReTokenLayoutLMPostProcess后处理得到实体关系对,最后用draw_re_results绘制可视化并保存。该脚本同样支持仅加载 SER 模型(--re_model_dir为空时退化为 SER 预测)。
7.4 其他部署方式
- C++ 推理部署:暂不支持;
- Serving 服务化部署:暂不支持;
- 更多推理部署:暂不支持。
8. FAQ
Q1:训练模型转 inference 模型之后预测效果不一致?
A:该问题多为 trained model 预测时的预处理、后处理参数与 inference model 预测时的预处理、后处理参数不一致所致。可以对比训练使用的配置文件中的预处理、后处理与预测时的设置是否存在差异,确保两者一致。
9. 引用
VI-LayoutXLM 及所在算法家族的相关论文引用如下:
@article{DBLP:journals/corr/abs-2104-08836, author = {Yiheng Xu and Tengchao Lv and Lei Cui and Guoxin Wang and Yijuan Lu and Dinei Flor{\^e}ncio and Cha Zhang and Furu Wei}, title = {LayoutXLM: Multimodal Pre-training for Multilingual Visually-rich Document Understanding}, journal = {CoRR}, volume = {abs/2104.08836}, year = {2021}, url = {https://arxiv.org/abs/2104.08836} } @article{DBLP:journals/corr/abs-1912-13318, author = {Yiheng Xu and Minghao Li and Lei Cui and Shaohan Huang and Furu Wei and Ming Zhou}, title = {LayoutLM: Pre-training of Text and Layout for Document Image Understanding}, journal = {CoRR}, volume = {abs/1912.13318}, year = {2019}, url = {http://arxiv.org/abs/1912.13318} } @article{DBLP:journals/corr/abs-2012-14740, author = {Yang Xu and Yiheng Xu and Tengchao Lv and Lei Cui and Furu Wei and Guoxin Wang and Yijuan Lu and Dinei A. F. Flor{\^e}ncio and Cha Zhang and Wanxiang Che and Min Zhang and Lidong Zhou}, title = {LayoutLMv2: Multi-modal Pre-training for Visually-Rich Document Understanding}, journal = {CoRR}, volume = {abs/2012.14740}, year = {2020}, url = {https://arxiv.org/abs/2012.14740} }【免费下载链接】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),仅供参考