OCR增值税发票关键信息抽取-完整示例

197 阅读21分钟

1. 背景介绍

关键信息抽取在文档场景中被广泛使用,如身份证中的姓名、住址信息抽取,快递单中的姓名、联系方式等关键字段内容的抽取,如下所示。

image image

注:图片来源于网上

传统基于模板匹配的方案需要针对不同的场景制定模板并进行适配,较为繁琐,不够鲁棒。此外,关键信息抽取任务涉及到OCR检测、OCR识别。为实现关键信息抽取,通常会采取文本检测+文本识别+语义实体识别+关系抽取的方案:

第一步,使用文本检测模型定位出发票中的文本位置。

第二步,使用文本识别模型,获取准确的文本内容。

第三步,使用语义实体识别模型,获取每个文本检测框所属的类别(key、value或者other)

第四步,使用关系抽取模型,获取所有key与所有value之间的映射关系。

本项目,主要基于PaddleOCR,介绍如何基于PP-StructureV2中的VI-LayoutXLM模型完成第三步与第四步的语义实体识别、关系抽取部分。

2. 快速体验

2.1 环境搭建

PaddleOCR 旨在打造一套丰富、领先、且实用的OCR工具库,助力开发者训练出更好的模型,并应用落地。

本项目基于PaddleOCR开源套件,以VI-LayoutXLM模型为基础,针对增值税发票场景进行优化,首先需要下载PaddleOCR代码,并安装环境。

import os
os.chdir("/home/aistudio/")
# 首先git官方的PaddleOCR项目,安装需要的依赖
# 第一次运行打开该注释
!git clone https://gitee.com/PaddlePaddle/PaddleOCR.git
os.chdir("/home/aistudio/PaddleOCR/")
# 安装PaddleOCR的依赖
!pip install -r requirements.txt --user
# 安装关键信息抽取任务的依赖
!pip install -r ./ppstructure/kie/requirements.txt --user

安装成功后,输出内容如下所示。

Successfully installed PyWavelets-1.3.0 attrdict-2.0.1 cssselect-1.1.0 cssutils-2.4.0 imgaug-0.4.0 lmdb-1.3.0 lxml-4.8.0 opencv-contrib-python-4.4.0.46 paddleocr-2.5.0.3 premailer-3.10.0 pyclipper-1.3.0.post2 python-Levenshtein-0.12.2 scikit-image-0.19.2 scipy-1.7.3 shapely-1.8.2 tifffile-2021.11.2

然后将数据解压到train_data目录下。

!tar -xf  ~/data/data165561/zzsfp.tar
!mkdir train_data
!mv zzsfp train_data/
mkdir: 无法创建目录"train_data": 文件已存在
mv: 无法将'zzsfp' 移动至'train_data/zzsfp': 目录非空

2.2 模型推理

将下载好的预训练模型放置在fapiao目录下,使用下面的命令,即可加载标注好的OCR文本检测与识别结果,并完成语义实体识别模型的预测过程。

!python3 tools/infer_kie_token_ser.py \
    -c /home/aistudio/work/ser_vi_layoutxlm.yml \
    -o Architecture.Backbone.checkpoints="./fapiao/ser_vi_layoutxlm_fapiao_trained/best_accuracy/" \
    Global.infer_img=./train_data/zzsfp/val.json \
    Global.infer_mode=False

运行成功后,可看到如下提示。

[2022/11/25 11:59:48] ppocr INFO: process: [0/8], save result to ./output/debug/ser_fapiao/b33_ser.jpg
[2022/11/25 11:59:49] ppocr INFO: process: [1/8], save result to ./output/debug/ser_fapiao/b26_ser.jpg
[2022/11/25 11:59:50] ppocr INFO: process: [2/8], save result to ./output/debug/ser_fapiao/b139_ser.jpg
[2022/11/25 11:59:51] ppocr INFO: process: [3/8], save result to ./output/debug/ser_fapiao/b201_ser.jpg

最终可视化结果保存在./output/debug/ser_fapiao/目录下,示例输出结果如下。

code

预测的结果也保存在文件./output/debug/ser_fapiao/infer_results.txt里面。

使用下面的命令,即可加载标注好的OCR文本检测与识别结果,并完成语义实体识别与关系抽取模型的预测过程。

# -c 后面的是RE任务的配置文件
# -o 后面的字段是RE任务的配置
# -c_ser 后面的是SER任务的配置文件
# -c_ser 后面的字段是SER任务的配置
!python3 tools/infer_kie_token_ser_re.py -c /home/aistudio/work/re_vi_layoutxlm.yml \
    -o Architecture.Backbone.checkpoints="fapiao/re_vi_layoutxlm_fapiao_trained/best_accuracy/" \
    Global.infer_img=./train_data/zzsfp/val.json \
    Global.infer_mode=False \
    -c_ser /home/aistudio/work/ser_vi_layoutxlm.yml \
    -o_ser Architecture.Backbone.checkpoints="fapiao/ser_vi_layoutxlm_fapiao_trained/best_accuracy/"

运行成功后,可看到如下提示。

[2022/11/22 10:11:00] ppocr INFO: process: [0/8], save result to ./output/debug/re/b33_ser_re.jpg
[2022/11/22 10:11:02] ppocr INFO: process: [1/8], save result to ./output/debug/re/b26_ser_re.jpg
[2022/11/22 10:11:03] ppocr INFO: process: [2/8], save result to ./output/debug/re/b139_ser_re.jpg
[2022/11/22 10:11:04] ppocr INFO: process: [3/8], save result to ./output/debug/re/b201_ser_re.jpg

最终结果保存在./output/debug/re/目录下,示例输出结果如下。

code

预测的结果也保存在文件./output/debug/re/infer_results.txt里面。

3. 数据准备

3.1 数据来源

本项目数据集202张增值税普通发票,其中38张包含关键信息抽取所需的标注,可以用于发票关键信息抽取任务训练。 该数据来源于公开数据集,原始数据下载链接为:下载链接

本项目对有标注的数据集重新进行整理,整理后的数据集压缩包挂载在目录/home/aistudio/data/data165561/zzsfp.tar下。

3.2 数据标注

该数据集包含语义实体识别(SER)与关系抽取(RE)2种标注。分别的示意图如下所示。

  • SER数据集标注样例:对于待包含关键信息的文本行,需要标注其具体的类别信息(key或者value)。

  • RE数据集标注样例:需要标注所有key与value文本行之间的对应关系。

3.3 数据集划分

为方便后续实验对比,我们将数据集中的30张图片作为训练集,8张图片作为验证集,方便在训练过程中实时了解模型的训练与收敛情况。

4. 针对语义实体识别模型的优化

基于文档图像的关键信息抽取包含3个部分:(1)文本检测(2)文本识别(3)关键信息抽取,包括语义实体识别或者关系抽取

本文重点关注发票的关键信息抽取模型训练与预测过程,因此在关键信息抽取过程中,直接使用标注的文本检测与识别标注信息进行测试,如果你希望自定义该场景的文本检测与识别模型,完成端到端的关键信息抽取部分,请参考

语义实体识别指的是给定一段文本行,确定其类别(如姓名住址等类别)。PaddleOCR中提供了基于VI-LayoutXLM的多模态语义实体识别方法,融合文本、位置与版面信息,相比LayoutXLM多模态模型,去除了其中的视觉骨干网络特征提取部分,引入符合阅读顺序的文本行排序方法,同时使用UDML联合互蒸馏方法进行训练,最终在精度与速度方面均超越LayoutXLM。更多关于VI-LayoutXLM的算法介绍与精度指标,请参考:VI-LayoutXLM算法介绍

4.1 数据准备

对于增值税发票数据,我们首先需要标注出其中的关键字段,我们将其标注为问题-答案的key-value pair,如下,编号No为12270830,则No字段标注为question,12270830字段标注为answer。如下图所示。

注意:

  • 如果文本检测模型数据标注过程中,没有标注 非关键信息内容 的检测框,那么在标注关键信息抽取任务的时候,也不需要标注该部分,如上图所示;如果标注的过程,如果同时标注了非关键信息内容 的检测框,那么我们需要将该部分的label记为other。
  • 标注过程中,需要以文本行为单位进行标注,无需标注单个字符的位置信息。

已经处理好的增值税发票数据集从这里下载:增值税发票数据集下载链接

如果你在快速开始阶段已经准备好数据集,这里无需执行下面的数据准备命令。

如果之前没有准备数据集,需要将数据集解压在train_data目录下,命令如下。

!tar -xf /home/aistudio/data/data165561/zzsfp.tar
!mkdir train_data
!mv zzsfp train_data/
mkdir: 无法创建目录"train_data": 文件已存在

目录结构如下所示。

train_data
  |--zzsfp
       |---class_list.txt
       |---imgs/
       |---train.json
       |---val.json

其中class_list.txt是包含otherquestionanswer,3个种类的的类别列表(不区分大小写),imgs目录底下,train.jsonval.json分别表示训练与评估集合的标注文件。训练集中包含30张图片,验证集中包含8张图片。部分标注如下所示。

b33.jpg [{"transcription": "No", "label": "question", "points": [[2882, 472], [3026, 472], [3026, 588], [2882, 588]], }, {"transcription": "12269563", "label": "answer", "points": [[3066, 448], [3598, 448], [3598, 576], [3066, 576]], ]}]

相比于OCR检测的标注,仅多了label字段。

4.2 模型训练、评估与预测

VI-LayoutXLM的配置为ser_vi_layoutxlm_xfund_zh_udml.yml,需要修改数据路径、类别数目以及类别配置文件

Architecture:
  model_type: &model_type "kie"
  name: DistillationModel
  algorithm: Distillation
  Models:
    Teacher:
      pretrained:
      freeze_params: false
      return_all_feats: true
      model_type: *model_type
      algorithm: &algorithm "LayoutXLM"
      Transform:
      Backbone:
        name: LayoutXLMForSer
        pretrained: True
        # one of base or vi
        mode: vi
        checkpoints:
        # 定义类别数目
        num_classes: &num_classes 5
   ...
PostProcess:
  name: DistillationSerPostProcess
  model_name: ["Student", "Teacher"]
  key: backbone_out
  # 定义类别文件
  class_path: &class_path train_data/zzsfp/class_list.txt
Train:
  dataset:
    name: SimpleDataSet
    # 定义训练数据目录与标注文件
    data_dir: train_data/zzsfp/imgs
    label_file_list:
      - train_data/zzsfp/train.json
  ...
Eval:
  dataset:
    # 定义评估数据目录与标注文件
    name: SimpleDataSet
    data_dir: train_data/zzsfp/imgs
    label_file_list:
      - train_data/zzsfp/val.json
  ...

示例配置文件存储在文件/home/aistudio/work/ser_vi_layoutxlm_udml.yaml中。运行下面的命令可以完成训练过程。

!python tools/train.py -c /home/aistudio/work/ser_vi_layoutxlm_udml.yml

运行成功后,会输出下面的内容。

[2022-11-22 13:24:04,172] [    INFO] - Already cached /home/aistudio/.paddlenlp/models/vi-layoutxlm-base-uncased/model_state.pdparams
[2022/11/22 13:24:07] ppocr INFO: train dataloader has 8 iters
[2022/11/22 13:24:07] ppocr INFO: valid dataloader has 1 iters
[2022/11/22 13:24:07] ppocr INFO: During the training process, after the 0th iteration, an evaluation is run every 10 iterations
[2022/11/22 13:24:12] ppocr INFO: epoch: [1/50], global_step: 8, lr: 0.000004, loss_ser_Student: 1.303022, loss_ser_Teacher: 1.692582, loss_dml_ser_0: 0.159417, loss_5_l2_Student_Teacher_0: 0.038144, loss_8_l2_Student_Teacher_0: 0.045179, loss: 3.238946, avg_reader_cost: 0.15133 s, avg_batch_cost: 0.52787 s, avg_samples: 3.0, ips: 5.68322 samples/s, eta: 0:04:18

最终在output目录下面会生成保存的预训练模型。

我们对LayoutXLM与VI-LayoutXLM均进行训练,精度对比如下。

模型迭代轮数Hmean
LayoutXLM50100%
VI-LayoutXLM50100%

可以看出,由于当前数据量较少,场景比较简单,因此2个模型的Hmean均达到了100%。

模型训练过程中,使用的是知识蒸馏的策略,最终保留了学生模型的参数,在评估时,我们需要针对学生模型的配置文件进行修改,这里保存在:/home/aistudio/work/ser_vi_layoutxlm.yml,修改内容与训练配置相同,包括类别数、类别映射文件、数据目录

这里我们使用提供的预训练模型进行评估。下载好之后,将模型在fapiao路径下解压缩,最终模型存在于fapiao/ser_vi_layoutxlm_fapiao_trained/best_accuracy

准备好模型与配置文件后,执行下面的命令完成评估过程。

# 注意:需要根据你的配置文件地址与保存的模型地址,对评估命令进行修改
!python3 tools/eval.py \
    -c /home/aistudio/work/ser_vi_layoutxlm.yml \
    -o Architecture.Backbone.checkpoints="fapiao/ser_vi_layoutxlm_fapiao_trained/best_accuracy/"

运行成功后,输出内容如下所示。

[2022/11/22 11:29:57] ppocr INFO: resume from fapiao/ser_vi_layoutxlm_fapiao_trained/best_accuracy/
[2022/11/22 11:29:57] ppocr INFO: metric in ckpt ***************
[2022/11/22 11:29:57] ppocr INFO: hmean:1.0
[2022/11/22 11:29:57] ppocr INFO: precision:1.0
[2022/11/22 11:29:57] ppocr INFO: recall:1.0
[2022/11/22 11:29:57] ppocr INFO: Teacher_precision:1.0
[2022/11/22 11:29:57] ppocr INFO: Teacher_recall:1.0
[2022/11/22 11:29:57] ppocr INFO: Teacher_hmean:1.0
[2022/11/22 11:29:57] ppocr INFO: fps:17.428981476816283
[2022/11/22 11:29:57] ppocr INFO: best_epoch:27
[2022/11/22 11:29:57] ppocr INFO: start_epoch:28
eval model:: 100%|████████████████████████████████| 1/1 [00:03<00:00,  3.59s/it]
[2022/11/22 11:30:01] ppocr INFO: metric eval ***************
[2022/11/22 11:30:01] ppocr INFO: precision:1.0
[2022/11/22 11:30:01] ppocr INFO: recall:1.0
[2022/11/22 11:30:01] ppocr INFO: hmean:1.0
[2022/11/22 11:30:01] ppocr INFO: fps:6.93361921005616

也可以使用下面的命令,加载标注中的OCR文本检测与识别结果进行预测。

!python3 tools/infer_kie_token_ser.py \
    -c /home/aistudio/work/ser_vi_layoutxlm.yml \
    -o Architecture.Backbone.checkpoints="./fapiao/ser_vi_layoutxlm_fapiao_trained/best_accuracy/" \
    Global.infer_img=./train_data/zzsfp/val.json \
    Global.infer_mode=False

运行成功后,输出内容如下所示。

[2022/11/22 11:30:52] ppocr INFO: resume from ./fapiao/ser_vi_layoutxlm_fapiao_trained/best_accuracy/
[2022-11-22 11:30:53,044] [    INFO] - Already cached /home/aistudio/.paddlenlp/models/layoutxlm-base-uncased/sentencepiece.bpe.model
[2022-11-22 11:30:53,764] [    INFO] - tokenizer config file saved in /home/aistudio/.paddlenlp/models/layoutxlm-base-uncased/tokenizer_config.json
[2022-11-22 11:30:53,765] [    INFO] - Special tokens file saved in /home/aistudio/.paddlenlp/models/layoutxlm-base-uncased/special_tokens_map.json
[2022/11/22 11:30:55] ppocr INFO: process: [0/8], save result to ./output/debug/ser_fapiao/b33_ser.jpg
[2022/11/22 11:30:56] ppocr INFO: process: [1/8], save result to ./output/debug/ser_fapiao/b26_ser.jpg
[2022/11/22 11:30:58] ppocr INFO: process: [2/8], save result to ./output/debug/ser_fapiao/b139_ser.jpg
[2022/11/22 11:30:59] ppocr INFO: process: [3/8], save result to ./output/debug/ser_fapiao/b201_ser.jpg

预测结果会保存在配置文件中的Global.save_res_path目录中。

部分预测结果如下所示。

  • 注意:在预测时,使用的文本检测与识别结果为标注的结果,直接从json文件里面进行读取。

如果希望使用OCR引擎结果得到的结果进行推理,则可以使用下面的命令进行推理。

!python3 tools/infer_kie_token_ser.py \
    -c /home/aistudio/work/ser_vi_layoutxlm.yml \
    -o Architecture.Backbone.checkpoints="./fapiao/ser_vi_layoutxlm_fapiao_trained/best_accuracy/" \
    Global.infer_img=./train_data/zzsfp/imgs/b25.jpg \
    Global.infer_mode=True

运行成功后,输出内容如下所示。

[2022-10-24 12:04:49,177] [    INFO] - Already cached /home/aistudio/.paddlenlp/models/layoutxlm-base-uncased/sentencepiece.bpe.model
[2022-10-24 12:04:50,083] [    INFO] - tokenizer config file saved in /home/aistudio/.paddlenlp/models/layoutxlm-base-uncased/tokenizer_config.json
[2022-10-24 12:04:50,084] [    INFO] - Special tokens file saved in /home/aistudio/.paddlenlp/models/layoutxlm-base-uncased/special_tokens_map.json
[2022/10/24 12:04:53] ppocr INFO: process: [0/1], save result to ./output/debug/ser_fapiao/b25_ser.jpg

结果如下所示。

它会使用PP-OCRv3的文本检测与识别模型进行获取文本位置与内容信息。

可以看出,由于训练的过程中,没有标注额外的字段为other类别,所以大多数检测出来的字段被预测为question或者answer。

如果希望构建基于你在垂类场景训练得到的OCR检测与识别模型,可以使用下面的方法传入检测与识别的inference 模型路径,即可完成OCR文本检测与识别以及SER的串联过程。指定OCR检测与识别模型的方法如下。

!python3 tools/infer_kie_token_ser.py \
    -c /home/aistudio/work/ser_vi_layoutxlm.yml \
    -o Architecture.Backbone.checkpoints="./fapiao/ser_vi_layoutxlm_fapiao_trained/best_accuracy/" \
    Global.infer_img=./train_data/zzsfp/imgs/b25.jpg \
    Global.infer_mode=True \
    Global.kie_rec_model_dir="your_rec_model" \
    Global.kie_det_model_dir="your_det_model"

5. 针对关系抽取模型的优化

使用语义实体识别模型,可以获取图像中所有的question与answer的字段,基于这些字段的类别,我们需要进一步获取question与answer之间的映射关系,因此需要进一步训练关系抽取模型,解决该问题。本章节基于VI-LayoutXLM多模态预训练模型,进行下游关系抽取任务的模型训练。

5.1 数据准备

以发票场景为例,相比于SER任务,RE中还需要标记每个文本行的id信息以及链接关系linking,如下所示。

标注文件的部分内容如下所示。

b33.jpg [{"transcription": "No", "label": "question", "points": [[2882, 472], [3026, 472], [3026, 588], [2882, 588]], "id": 0, "linking": [[0, 1]]}, {"transcription": "12269563", "label": "answer", "points": [[3066, 448], [3598, 448], [3598, 576], [3066, 576]], "id": 1, "linking": [[0, 1]]}]

相比与SER的标注,多了idlinking的信息,分别表示唯一标识以及连接关系。

5.2 模型训练、评估与预测

基于VI-LayoutXLM的RE任务存储在/home/aistudio/work/re_vi_layoutxlm_udml.yml文件中,需要修改数据路径、类别列表文件

Train:
  dataset:
    name: SimpleDataSet
    # 定义训练数据目录与标注文件
    data_dir: train_data/zzsfp/imgs
    label_file_list:
      - train_data/zzsfp/train.json
    transforms:
      - DecodeImage: # load image
          img_mode: RGB
          channel_first: False
      - VQATokenLabelEncode: # Class handling label
          contains_re: True
          algorithm: *algorithm
          class_path: &class_path train_data/zzsfp/class_list.txt
  ...
Eval:
  dataset:
    # 定义评估数据目录与标注文件
    name: SimpleDataSet
    data_dir: train_data/zzsfp/imgs
    label_file_list:
      - train_data/zzsfp/val.json
  ...

运行下面的命令,启动训练过程。

!python tools/train.py -c /home/aistudio/work/re_vi_layoutxlm_udml.yml

运行成功后,输出内容如下所示。

[2022/11/22 13:19:39] ppocr INFO: train dataloader has 8 iters
[2022/11/22 13:19:39] ppocr INFO: valid dataloader has 1 iters
[2022/11/22 13:19:39] ppocr INFO: During the training process, after the 0th iteration, an evaluation is run every 19 iterations
[2022/11/22 13:20:03] ppocr INFO: epoch: [1/50], global_step: 8, lr: 0.000002, loss_re_Student: 2.555970, loss_re_Teacher: 3.207622, loss_5_l2_Student_Teacher_0: 0.036509, loss_8_l2_Student_Teacher_0: 0.043716, loss: 5.874118, avg_reader_cost: 0.14967 s, avg_batch_cost: 2.38507 s, avg_samples: 3.0, ips: 1.25782 samples/s, eta: 0:19:28
[2022/11/22 13:20:16] ppocr INFO: save model in ./output/re_vi_layoutxlm_fapiao_udml/latest
[2022/11/22 13:20:20] ppocr INFO: epoch: [2/50], global_step: 10, lr: 0.000003, loss_re_Student: 2.329556, loss_re_Teacher: 3.014125, loss_5_l2_Student_Teacher_0: 0.036509, loss_8_l2_Student_Teacher_0: 0.044422, loss: 5.425570, avg_reader_cost: 1.48705 s, avg_batch_cost: 1.68593 s, avg_samples: 0.8, ips: 0.47452 samples/s, eta: 0:26:27

最终模型保存在output目录下。我们也对比了LayoutXLM与VI-LayoutXLM的模型效果,二者针对该场景的训练结果如下所示。

模型迭代轮数Hmean
LayoutXLM5098.0%
VI-LayoutXLM5099.3%

可以看出,对于VI-LayoutXLM相比LayoutXLM的Hmean高了1.3%。

注意:这里训练得到的模型精度不高,是因为我们训练过程中就终止了,模型没有充分迭代。您可以下载最优的模型进行体验或者等待模型训练完成。

模型训练过程中,使用的是知识蒸馏策略,最终保留了学生模型的参数,在评估时,我们需要针对学生模型的配置文件进行修改: re_vi_layoutxlm_xfund_zh.yml,修改内容与训练配置相同,包括类别映射文件、数据目录

修改完成后,执行下面的命令完成评估过程。

# 注意:需要根据你的配置文件地址与保存的模型地址,对评估命令进行修改
!python3 tools/eval.py -c /home/aistudio/work/re_vi_layoutxlm.yml \
    -o Architecture.Backbone.checkpoints="fapiao/re_vi_layoutxlm_fapiao_trained/best_accuracy/"

运行成功后,输出内容如下所示。

[2022/11/22 13:25:05] ppocr INFO: resume from fapiao/re_vi_layoutxlm_fapiao_trained/best_accuracy/
[2022/11/22 13:25:05] ppocr INFO: metric in ckpt ***************
[2022/11/22 13:25:05] ppocr INFO: hmean:0.9936305732484078
[2022/11/22 13:25:05] ppocr INFO: precision:1.0
[2022/11/22 13:25:05] ppocr INFO: recall:0.9873417721518988
[2022/11/22 13:25:05] ppocr INFO: Teacher_precision:1.0
[2022/11/22 13:25:05] ppocr INFO: Teacher_recall:1.0
[2022/11/22 13:25:05] ppocr INFO: Teacher_hmean:1.0
[2022/11/22 13:25:05] ppocr INFO: fps:7.513122605578457
[2022/11/22 13:25:05] ppocr INFO: best_epoch:50
[2022/11/22 13:25:05] ppocr INFO: start_epoch:51
eval model:: 100%|████████████████████████████████| 1/1 [00:04<00:00,  4.93s/it]
[2022/11/22 13:25:10] ppocr INFO: metric eval ***************
[2022/11/22 13:25:10] ppocr INFO: precision:1.0
[2022/11/22 13:25:10] ppocr INFO: recall:0.9873417721518988
[2022/11/22 13:25:10] ppocr INFO: hmean:0.9936305732484078
[2022/11/22 13:25:10] ppocr INFO: fps:3.913134979727273

可以使用下面的命令进行模型预测。

# -c 后面的是RE任务的配置文件
# -o 后面的字段是RE任务的配置
# -c_ser 后面的是SER任务的配置文件
# -c_ser 后面的字段是SER任务的配置
!python3 tools/infer_kie_token_ser_re.py -c /home/aistudio/work/re_vi_layoutxlm.yml \
    -o Architecture.Backbone.checkpoints="fapiao/re_vi_layoutxlm_fapiao_trained/best_accuracy/" \
    Global.infer_img=./train_data/zzsfp/val.json \
    Global.infer_mode=False \
    -c_ser /home/aistudio/work/ser_vi_layoutxlm.yml \
    -o_ser Architecture.Backbone.checkpoints="fapiao/ser_vi_layoutxlm_fapiao_trained/best_accuracy/"

运行成功后,输出内容如下所示。

[2022/11/22 13:25:31] ppocr INFO: resume from fapiao/ser_vi_layoutxlm_fapiao_trained/best_accuracy/
[2022-11-22 13:25:32,325] [    INFO] - Already cached /home/aistudio/.paddlenlp/models/layoutxlm-base-uncased/sentencepiece.bpe.model
[2022-11-22 13:25:33,070] [    INFO] - tokenizer config file saved in /home/aistudio/.paddlenlp/models/layoutxlm-base-uncased/tokenizer_config.json
[2022-11-22 13:25:33,071] [    INFO] - Special tokens file saved in /home/aistudio/.paddlenlp/models/layoutxlm-base-uncased/special_tokens_map.json
[2022/11/22 13:25:36] ppocr INFO: resume from fapiao/re_vi_layoutxlm_fapiao_trained/best_accuracy/
[2022/11/22 13:25:38] ppocr INFO: process: [0/8], save result to ./output/debug/re/b33_ser_re.jpg
[2022/11/22 13:25:40] ppocr INFO: process: [1/8], save result to ./output/debug/re/b26_ser_re.jpg
[2022/11/22 13:25:41] ppocr INFO: process: [2/8], save result to ./output/debug/re/b139_ser_re.jpg

预测过程中,会加载标注的OCR文本检测与识别信息,然后使用语义实体识别模型获取所有的question与answer,最终使用关系抽取模型获取question与answer之间的映射关系。

预测结果会保存在配置文件中的Global.save_res_path目录中。

部分预测结果如下所示。

  • 注意:在预测时,使用的文本检测与识别结果为标注的结果,直接从json文件里面进行读取。

如果希望使用OCR引擎结果得到的结果进行推理,则可以使用下面的命令进行推理。

In [ ]

# -c 后面的是RE任务的配置文件
# -o 后面的字段是RE任务的配置
# -c_ser 后面的是SER任务的配置文件
# -c_ser 后面的字段是SER任务的配置
!python3 tools/infer_kie_token_ser_re.py -c /home/aistudio/work/re_vi_layoutxlm.yml \
    -o Architecture.Backbone.checkpoints="fapiao/re_vi_layoutxlm_fapiao_trained/best_accuracy/" \
    Global.infer_img=./train_data/zzsfp/imgs/b26.jpg \
    Global.infer_mode=True \
    -c_ser /home/aistudio/work/ser_vi_layoutxlm.yml \
    -o_ser Architecture.Backbone.checkpoints="fapiao/ser_vi_layoutxlm_fapiao_trained/best_accuracy/"

运行成功后,输出内容如下所示。

[2022-11-22 13:26:02,838] [    INFO] - Already cached /home/aistudio/.paddlenlp/models/layoutxlm-base-uncased/sentencepiece.bpe.model
[2022-11-22 13:26:03,580] [    INFO] - tokenizer config file saved in /home/aistudio/.paddlenlp/models/layoutxlm-base-uncased/tokenizer_config.json
[2022-11-22 13:26:03,581] [    INFO] - Special tokens file saved in /home/aistudio/.paddlenlp/models/layoutxlm-base-uncased/special_tokens_map.json
[2022/11/22 13:26:07] ppocr INFO: resume from fapiao/re_vi_layoutxlm_fapiao_trained/best_accuracy/
[2022/11/22 13:26:10] ppocr INFO: process: [0/1], save result to ./output/debug/re/b26_ser_re.jpg

预测结果保存在output目录中,可以看出,文本检测与识别结果的准确性对于最终关系抽取的结果准确性影响很大。

如果希望构建基于你在垂类场景训练得到的OCR检测与识别模型,可以使用下面的方法传入,即可完成SER + RE的串联过程。

In [ ]

# -c 后面的是RE任务的配置文件
# -o 后面的字段是RE任务的配置
# -c_ser 后面的是SER任务的配置文件
# -c_ser 后面的字段是SER任务的配置
!python3 tools/infer_kie_token_ser_re.py -c /home/aistudio/work/re_vi_layoutxlm.yml \
    -o Architecture.Backbone.checkpoints="fapiao/re_vi_layoutxlm_fapiao_trained/best_accuracy/" \
    Global.infer_img=./train_data/zzsfp/imgs/b26.jpg \
    Global.infer_mode=True \
    -c_ser /home/aistudio/work/ser_vi_layoutxlm.yml \
    -o_ser Architecture.Backbone.checkpoints="fapiao/ser_vi_layoutxlm_fapiao_trained/best_accuracy/" \
    Global.kie_rec_model_dir="your_rec_model" \
    Global.kie_det_model_dir="your_det_model"

6. 总结

本项目提供了基于LayoutXLM与VI-LayoutXLM的关键信息抽取方法,在2个子任务(语义实体识别与关系抽取)上的速度与精度对比如下。

任务模型F1-scoreGPU推理速度(ms)
语义实体识别LayoutXLM100%59.35
语义实体识别VI-LayoutXLM100%15.49
语义实体识别LayoutXLM98.0%59.35
语义实体识别VI-LayoutXLM99.3%15.49

可以看出,相比于LayoutXLM模型,PP-StructureV2中的VI-LayoutXLM模型精度平均提升0.65%,速度提升约2.8倍,同时本项目也给出了关键信息抽取模型串联方法以及替换文本检测与识别模型的方案。

7. 模型下载地址

《动手学OCR》、《OCR产业范例20讲》电子书、OCR垂类模型、PDF2Word软件以及其他学习大礼包领取链接:百度网盘 PaddleOCR 开源大礼包,提取码:4232