【AI达人特训营】多模态技术在工业场景中的应用实践:表单识别重命名

P粉084495128
发布: 2025-07-21 17:22:25
原创
322人浏览过
计算机视觉在工业领域的应用覆盖文字识别、图像识别、视频识别等,在实际的工作中,有时候需要根据表单图片中的指定区域进行识别并重命名,通过多模态技术实现识别内容的精确提取。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

【ai达人特训营】多模态技术在工业场景中的应用实践:表单识别重命名 - php中文网

多模态技术在工业场景中的应用实践:表单识别重命名

1 项目说明

计算机视觉在工业领域的应用覆盖文字识别、图像识别、视频识别等,在实际的工作中,有时候需要根据表单图片中的指定区域进行识别并重命名,通过多模态技术实现识别内容的精确提取。

表单识别包含两大阶段:OCR阶段和文档视觉问答阶段。

其中,OCR阶段选取了PaddleOCR的PP-OCRv3模型,主要由文本检测和文本识别两个模块组成。DOC-VQA文档视觉问答阶段基于PaddleNLP自然语言处理算法库实现的LayoutXLM模型,支持基于多模态方法的语义实体识别(Semantic Entity Recognition, SER)以及关系抽取(Relation Extraction, RE)任务。

2 安装说明

下载PaddleOCR源码,本项目中已经帮大家打包好的PaddleOCR (已经修改好配置文件) ,无需下载解压即可,只需安装依赖环境~

In [1]
! unzip -q PaddleOCR.zip
登录后复制
In [2]
# 如仍需安装或安装更新,可以执行以下步骤# ! git clone https://gitee.com/PaddlePaddle/PaddleOCR
登录后复制
fatal: 目标路径 'PaddleOCR' 已经存在,并且不是一个空目录。
登录后复制
In [ ]
# 安装依赖包! pip install -r /home/aistudio/PaddleOCR/requirements.txt > install.log#! pip install paddleocr >> install.log# 安装nlp及其他包! pip install yacs gnureadline paddlenlp==2.2.1 >> install.log
! pip install xlsxwriter >> install.log
! pip install regex
登录后复制

3 数据准备

3.1 XFUND数据集

这里使用XFUND数据集做为实验数据集。 XFUND数据集是微软提出的一个用于KIE任务的多语言数据集,共包含七个数据集,每个数据集包含149张训练集和50张验证集

分别为:ZH(中文)、JA(日语)、ES(西班牙)、FR(法语)、IT(意大利)、DE(德语)、PT(葡萄牙)

本次实验选取中文数据集作为我们的演示数据集。法语数据集作为实践课程的数据集,数据集样例图如 图2 所示。

【AI达人特训营】多模态技术在工业场景中的应用实践:表单识别重命名 - php中文网
图2 数据集样例,左中文,右法语

3.1.1 XFUND - 下载处理好的数据集

处理好的XFUND中文数据集下载地址:https://paddleocr.bj.bcebos.com/dataset/XFUND.tar ,可以运行如下指令完成中文数据集下载和解压。

In [3]
# XFUN中文数据集可直接下载# ! wget https://paddleocr.bj.bcebos.com/dataset/XFUND.tar# ! tar -xf XFUND.tar# XFUN其他数据集使用类似下面的代码进行转换# 代码链接:https://github.com/PaddlePaddle/PaddleOCR/blob/release%2F2.5/ppstructure/vqa/helper/trans_xfun_data.py%cd /home/aistudio/PaddleOCR
! mkdir /home/aistudio/XFUND && mkdir /home/aistudio/XFUND/zh_train && mkdir /home/aistudio/XFUND/zh_val
! unzip -q /home/aistudio/data/data140302/XFUND_ori.zip  -d /home/aistudio/data/data140302/
! mv /home/aistudio/data/data140302/XFUND_ori/zh.train /home/aistudio/XFUND/zh_train/image
! mv /home/aistudio/data/data140302/XFUND_ori/zh.val /home/aistudio/XFUND/zh_val/image# 转为ser和re 可训练的格式! python3 ppstructure/vqa/tools/trans_xfun_data.py \
    --ori_gt_path='/home/aistudio/data/data140302/XFUND_ori/zh.train.json' \
    --output_path='/home/aistudio/XFUND/zh_train/xfun_normalize_train.json'! python3 ppstructure/vqa/tools/trans_xfun_data.py \
    --ori_gt_path='/home/aistudio/data/data140302/XFUND_ori/zh.val.json' \
    --output_path='/home/aistudio/XFUND/zh_val/xfun_normalize_val.json'
登录后复制
/home/aistudio/PaddleOCR
===ok====
===ok====
登录后复制

运行上述指令后在 /home/aistudio/XFUND 目录下有2个文件夹,目录结构如下所示:

/home/aistudio/XFUND
  └─ zh_train/        		 	训练集
      ├── image/				图片存放文件夹
      ├── xfun_normalize_train.json 	标注信息
  └─ zh_val/        		 	验证集
      ├── image/			图片存放文件夹
      ├── xfun_normalize_val.json 	标注信息
登录后复制

该数据集的标注格式为

{    "height": 3508, # 图像高度
    "width": 2480,  # 图像宽度
    "ocr_info": [
        {            "text": "邮政地址:",  # 单个文本内容
            "label": "question", # 文本所属类别
            "bbox": [261, 802, 483, 859], # 单个文本框
            "id": 54,  # 文本索引
            "linking": [[54, 60]], # 当前文本和其他文本的关系 [question, answer]
            "words": []
        },
        {            "text": "湖南省怀化市市辖区",            "label": "answer",            "bbox": [487, 810, 862, 859],            "id": 60,            "linking": [[54, 60]],            "words": []
        }
    ]
}
登录后复制

3.1.2 XFUND - 转换为PaddleOCR检测和识别格式

使用XFUND训练PaddleOCR检测和识别模型,需要将数据集格式改为训练需求的格式。

  • 文本检测 标注文件格式如下,中间用'\t'分隔:

" 图像文件名 json.dumps编码的图像标注信息" ch4_test_images/img_61.jpg [{"transcription": "MASA", "points": [[310, 104], [416, 141], [418, 216], [312, 179]]}, {...}]

json.dumps编码前的图像标注信息是包含多个字典的list,字典中的 points 表示文本框的四个点的坐标(x, y),从左上角的点开始顺时针排列。 transcription 表示当前文本框的文字,当其内容为“###”时,表示该文本框无效,在训练时会跳过。

  • 文本识别 标注文件的格式如下, txt文件中默认请将图片路径和图片标签用'\t'分割,如用其他方式分割将造成训练报错。
" 图像文件名                 图像标注信息 "train_data/rec/train/word_001.jpg   简单可依赖
train_data/rec/train/word_002.jpg   用科技让复杂的世界更简单
...
登录后复制

已经提供转换脚本,执行如下代码即可转换成功:

In [ ]
%cd /home/aistudio/
! python trans_xfund_data.py
登录后复制
/home/aistudio/XFUND/
├── det_gt_train.txt
├── det_gt_val.txt
├── rec_gt_train.txt
├── rec_gt_val.txt
├── rec_imgs
│   ├── zh_train_0_000.jpg
│   ├── zh_train_0_001.jpg
│   ├── ......
├── word_dict.txt
├── xfund_dict.txt
├── zh_train
│   ├── image
│   └── xfun_normalize_train.json
└── zh_val
    ├── image
    └── xfun_normalize_val.json
登录后复制

3.2 自制数据集XTOWER

由于篇幅和侧重点原因,本文使用制作好的数据集(XTOWER),数据集制作方法放在另一篇文章里——《巧用PPOCRLabel制作DOC-VAQ格式数据集》。

In [7]
# 解压XTOWER数据集%cd /home/aistudio/
! unzip -q -o /home/aistudio/data/data154392/tower_min.zip -d /home/aistudio 
# 查看数据集! tree -L 1 /home/aistudio/XTOWER/
登录后复制
/home/aistudio
/home/aistudio/XTOWER/
├── crop_img
├── Label_kie_no_word.txt
├── Label_kie_word.txt
├── Label.txt
├── rec_gt.txt
├── rec_train.txt
├── rec_val.txt
├── train_data
├── val_data
├── word_dict.txt
└── xtower_dict.txt

3 directories, 8 files
登录后复制

4 OCR

选用飞桨OCR开发套件PaddleOCR中的PP-OCRv3模型进行文本检测和识别。 PP-OCRv3在PP-OCRv2的基础上,针对检测模型和识别模型,进行了共计9个方面的升级:

  • PP-OCRv3检测模型对PP-OCRv2中的CML协同互学习文本检测蒸馏策略进行了升级,分别针对教师模型和学生模型进行进一步效果优化。其中,在对教师模型优化时,提出了大感受野的PAN结构LK-PAN和引入了DML蒸馏策略;在对学生模型优化时,提出了残差注意力机制的FPN结构RSE-FPN。
  • PP-OCRv3的识别模块是基于文本识别算法SVTR优化。SVTR不再采用RNN结构,通过引入Transformers结构更加有效地挖掘文本行图像的上下文信息,从而提升文本识别能力。PP-OCRv3通过轻量级文本识别网络SVTR_LCNet、Attention损失指导CTC损失训练策略、挖掘文字上下文信息的数据增广策略TextConAug、TextRotNet自监督预训练模型、UDML联合互学习策略、UIM无标注数据挖掘方案,6个方面进行模型加速和效果提升。

更多细节请参考PP-OCRv3技术报告。

4.1 OCR - 文本检测

我们使用2种方案进行训练、评估:

  • PP-OCRv3中英文超轻量检测预训练模型
  • XFUND数据集+finetune

4.1.1 文本检测(方案1):预训练模型

1)下载预训练模型

PaddleOCR已经提供了PP-OCR系列模型,PP-OCRv3中英文模型列表如下:

模型简介 模型名称 推荐场景 检测模型 方向分类器 识别模型
中英文超轻量PP-OCRv3模型(16.2M) ch_PP-OCRv3_xx 移动端&服务器端 推理模型 / 训练模型 推理模型 / 训练模型 推理模型 / 训练模型

更多模型下载(包括英文数字模型、多语言模型、Paddle-Lite模型等),可以参考PP-OCR 系列模型下载。

这里我们使用PP-OCRv3中英文超轻量检测模型,下载并解压预训练模型:

In [ ]
# 提供的PaddlePaddleOCR.zip压缩包,已经下载解压好,不需要再执行这个步骤;# 如果更换其他模型,更新下载链接和解压指令就可以%mkdir /home/aistudio/PaddleOCR/pretrain/
%cd /home/aistudio/PaddleOCR/pretrain/
! wget https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_det_distill_train.tar
! tar -xf ch_PP-OCRv3_det_distill_train.tar && rm -rf ch_PP-OCRv3_det_distill_train.tar
%cd ..
登录后复制

2)文本检测(方案1):模型评估

接着使用下载的超轻量检测模型在XFUND验证集上进行评估,由于蒸馏需要包含多个网络,甚至多个Student网络,在计算指标的时候只需要计算一个Student网络的指标即可,key字段设置为Student则表示只计算Student网络的精度。

Metric:  name: DistillationMetric  base_metric_name: DetMetric  main_indicator: hmean  key: "Student"
登录后复制

首先修改配置文件configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_cml.yml中的以下字段:

Eval.dataset.data_dir:指向验证集图片存放目录Eval.dataset.label_file_list:指向验证集标注文件
登录后复制

如果运行在Aistudio上,可能还需要调整:

train.reader.num_workers: 0train.reader.batch_size_per_card: 4Eval.reader.num_workers: 0
登录后复制

然后在XFUND和XTOWER的验证集上进行评估,具体代码如下:

In [ ]
#在XFUND数据集上进行评估%cd /home/aistudio/PaddleOCR
! python tools/eval.py \
    -c configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_cml-xfund.yml \
    -o Global.checkpoints=./pretrain/ch_PP-OCRv3_det_distill_train/best_accuracy.pdparams
登录后复制
In [ ]
# 在XTOWER数据集上进行评估%cd /home/aistudio/PaddleOCR
! CUDA_VISIBLE_DEVICES=0 ! python tools/eval.py \
    -c configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_cml.yml \
    -o Global.checkpoints=./pretrain/ch_PP-OCRv3_det_distill_train/best_accuracy.pdparams
登录后复制

使用预训练模型进行评估,指标如下所示:

方案 heman
PP-OCRv3中英文超轻量检测预训练模型在XFUND上评估 78.42%
PP-OCRv3中英文超轻量检测预训练模型在XTOWER上评估 83.96%

使用文本检测预训练模型在XFUND验证集上评估,达到78%左右,充分说明ppocr提供的预训练模型有一定的泛化能力。但在XTOWER上的recall太低了,需要使用XTOWER数据集训练一下

4.1.2 文本检测(方案2):XTOWER数据集+finetune

PaddleOCR提供的蒸馏预训练模型包含了多个模型的参数,我们提取Student模型的参数,在XFUND数据集上进行finetune,可以参考如下代码:

In [ ]
%cd /home/aistudio/PaddleOCR# 已经提供好提取Student参数的模型,不需要再执行这个步骤;# 如果更换其他模型,更新预训练模型路径和保存路径即可import paddle# 加载预训练模型all_params = paddle.load("pretrain/ch_PP-OCRv3_det_distill_train/best_accuracy.pdparams")# 查看权重参数的keysprint(all_params.keys())# 学生模型的权重提取s_params = {key[len("student_model."):]: all_params[key] for key in all_params if "student_model." in key}# 查看学生模型权重参数的keysprint(s_params.keys())# 保存paddle.save(s_params, "pretrain/ch_PP-OCRv3_det_distill_train/student.pdparams")
登录后复制

1) 文本检测(方案2): 模型训练

修改配置文件configs/det/ch_PP-OCRv3_det_student.yml中的以下字段:

Global.epoch_num: 1200:本实验设置为100Global.pretrained_model:指向预训练模型路径Train.dataset.data_dir:指向训练集图片存放目录Train.dataset.label_file_list:指向训练集标注文件Eval.dataset.data_dir:指向验证集图片存放目录Eval.dataset.label_file_list:指向验证集标注文件Optimizer.lr.learning_rate:调整学习率,本实验设置为0.005Train.dataset.transforms.EastRandomCropData.size:训练尺寸改为[1600, 1600]Eval.dataset.transforms.DetResizeForTest:评估尺寸,添加如下参数
       limit_side_len: 1600
       limit_type: 'min'
登录后复制

执行下面命令启动训练:

In [ ]
# ! CUDA_VISIBLE_DEVICES=0 python tools/train.py \#         -c configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_student.yml \#         -o Global.pretrained_model="./pretrain/ch_PP-OCRv3_det_distill_train/student.pdparams"
登录后复制

2)文本检测(方案2):模型评估

使用训练好的模型进行评估,更新模型路径Global.checkpoints,

In [ ]
# XTOWER数据集+微调! python tools/eval.py \
        -c configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_student.yml \
        -o Global.checkpoints="output/ch_PP-OCR_V3_det/best_accuracy"
登录后复制

使用训练好的模型进行评估,指标如下所示:

方案 heman
XTOWER数据集+finetune 96.71%

使用XTOWER数据集+finetune训练,在验证集上评估达到96%左右,finetune会提升垂类场景效果。

3)文本检测(方案2):导出模型

在模型训练过程中保存的模型文件是包含前向预测和反向传播的过程,在实际的工业部署则不需要反向传播,因此需要将模型进行导成部署需要的模型格式。 执行下面命令,即可导出模型。

In [33]
# inference模型保存在`./output/det_db_inference`目录下%cd /home/aistudio/PaddleOCR/
! python tools/export_model.py \
    -c configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_student.yml \
    -o Global.pretrained_model="output/ch_PP-OCR_V3_det/best_accuracy" \
    Global.save_inference_dir="./output/det_db_inference/"
登录后复制
/home/aistudio/PaddleOCR
W0629 08:18:28.004601  7269 gpu_context.cc:278] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 11.2, Runtime API Version: 10.1
W0629 08:18:28.008688  7269 gpu_context.cc:306] device: 0, cuDNN Version: 7.6.
[2022/06/29 08:18:31] ppocr INFO: load pretrain successful from output/ch_PP-OCR_V3_det/best_accuracy
[2022/06/29 08:18:34] ppocr INFO: inference model is saved to ./output/det_db_inference/inference
登录后复制

转换成功后,在目录下有三个文件:

/inference/rec_crnn/
    ├── inference.pdiparams         # 识别inference模型的参数文件
    ├── inference.pdiparams.info    # 识别inference模型的参数信息,可忽略
    └── inference.pdmodel           # 识别inference模型的program文件
登录后复制

4)文本检测(方案2):模型预测

加载上面导出的模型,执行如下命令对验证集或测试集图片进行预测:

det_model_dir:预测模型
image_dir:测试图片路径
use_gpu:是否使用GPU
登录后复制
In [ ]
%pwd
%cd /home/aistudio/PaddleOCR/
!python tools/infer/predict_det.py \
    --det_algorithm="DB" \
    --det_model_dir="./output/det_db_inference/" \
    --image_dir="/home/aistudio/XTOWER/val_data/image/" \
    --use_gpu=True
登录后复制

检测可视化结果保存在/home/aistudio/PaddleOCR/inference_results/目录下,查看检测效果。

【AI达人特训营】多模态技术在工业场景中的应用实践:表单识别重命名 - php中文网 文本检测效果图

总结,我们分别使用PP-OCRv3中英文超轻量检测预训练模型、XTOWER数据集+finetune 2种方案进行评估、训练等,指标对比如下:

方案 hmean 结果分析
PP-OCRv3中英文超轻量检测预训练模型 83.96% ppocr提供的预训练模型有一定的泛化能力
XTOWER数据集+finetune 96.71% finetune会提升垂类场景效果

4.2 OCR-文本识别

我们分别使用如下3种方案进行训练、评估:

  • PP-OCRv3中英文超轻量识别预训练模型
  • XTOWER数据集+finetune
  • XTOWER数据集+finetune+真实通用识别数据

4.2.1 文本识别(方案1):预训练模型

1)下载预训练模型

我们使用PP-OCRv3中英文超轻量文本识别模型,下载并解压预训练模型:

表单大师AI
表单大师AI

一款基于自然语言处理技术的智能在线表单创建工具,可以帮助用户快速、高效地生成各类专业表单。

表单大师AI 74
查看详情 表单大师AI
In [ ]
# 已经提供下载解压好的模型,不需要再执行这个步骤;# 如果更换其他模型,更新下载链接和解压指令就可以%cd /home/aistudio/PaddleOCR/pretrain/
! wget https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_rec_train.tar
! tar -xf ch_PP-OCRv3_rec_train.tar && rm -rf ch_PP-OCRv3_rec_train.tar
%cd ..
登录后复制

2)文本识别(方案1):模型评估

首先修改配置文件configs/rec/PP-OCRv3/ch_PP-OCRv3_rec_distillation.yaml中的以下字段:

Eval.dataset.data_dir:指向验证集图片存放目录Eval.dataset.label_file_list:指向验证集标注文件
登录后复制

我们使用下载的预训练模型进行评估:

In [ ]
%cd /home/aistudio/PaddleOCR
! CUDA_VISIBLE_DEVICES=0 python tools/eval.py \
    -c configs/rec/PP-OCRv3/ch_PP-OCRv3_rec_distillation.yml \
    -o Global.checkpoints=./pretrain/ch_PP-OCRv3_rec_train/best_accuracy
登录后复制

评估指标如下所示:

方案 acc
PP-OCRv3中英文超轻量识别预训练模型 0%

使用文本预训练模型在XTOWER验证集上评估.

4.2.2 文本识别(方案2):XTOWER数据集+finetune

同检测模型,我们提取Student模型的参数,在XTOWER数据集上进行finetune,可以参考如下代码:

In [ ]
# 已经提供好提取Student参数的模型,不需要再执行这个步骤;# 如果更换其他模型,更新预训练模型路径和保存路径即可import paddle# 加载预训练模型all_params = paddle.load("pretrain/ch_PP-OCRv3_rec_train/best_accuracy.pdparams")# 查看权重参数的keysprint(all_params.keys())# 学生模型的权重提取s_params = {key[len("Student."):]: all_params[key] for key in all_params if "Student." in key}# 查看学生模型权重参数的keysprint(s_params.keys())# 保存paddle.save(s_params, "pretrain/ch_PP-OCRv3_rec_train/student.pdparams")
登录后复制

1)文本识别(方案2):模型训练

修改配置文件configs/rec/PP-OCRv3/ch_PP-OCRv3_rec.yml中的以下字段:

Global.epoch_num:本实验设置为200Global.pretrained_model:指向预训练模型路径Global.character_dict_path: 字典路径,'/home/aistudio/XFUND/word_dict.txt'Optimizer.lr.values:学习率,本实验设置为[0.00025, 0.0001]Train.dataset.data_dir:指向训练集图片存放目录Train.dataset.label_file_list:指向训练集标注文件Eval.dataset.data_dir:指向验证集图片存放目录Eval.dataset.label_file_list:指向验证集标注文件
登录后复制

执行如下命令启动训练:

In [ ]
# # 开始训练# %cd /home/aistudio/PaddleOCR/# ! CUDA_VISIBLE_DEVICES=0 python tools/train.py \#         -c configs/rec/PP-OCRv3/ch_PP-OCRv3_rec.yml \#         -o Global.checkpoints=./output/rec_ppocr_v3/best_accuracy
登录后复制

2)文本识别(方案2):模型评估

使用训练好的模型进行评估,更新模型路径Global.checkpoints

In [ ]
%cd /home/aistudio/PaddleOCR/
! CUDA_VISIBLE_DEVICES=0 python tools/eval.py \
    -c configs/rec/PP-OCRv3/ch_PP-OCRv3_rec.yml \
    -o Global.checkpoints=./output/rec_ppocr_v3/best_accuracy
登录后复制

使用预训练模型进行评估,指标如下所示:

方案 acc
XTOWER数据集+finetune 93.74%

使用XTOWER数据集+finetune训练,在验证集上评估达到93%左右,说明 finetune会提升垂类场景效果。

3)文本识别(方案2):导出模型

导出模型只保留前向预测的过程:

In [ ]
!python tools/export_model.py \
    -c configs/rec/PP-OCRv3/ch_PP-OCRv3_rec.yml \
    -o Global.pretrained_model=output/rec_ppocr_v3/best_accuracy \
    Global.save_inference_dir=./output/rec_crnn_inference/
登录后复制

4)文本识别(方案2):模型预测

加载上面导出的模型,执行如下命令对验证集或测试集图片进行预测,检测可视化结果保存在/home/aistudio/inference_results/目录下,查看检测、识别效果。需要通过--rec_char_dict_path指定使用的字典路径

In [ ]
! python tools/infer/predict_system.py \
    --image_dir="../XTOWER/val_data/image/" \
    --det_model_dir="./output/det_db_inference/" \
    --rec_model_dir="./output/rec_crnn_inference/" \
    --rec_image_shape="3, 48, 320" \
    --rec_char_dict_path="../XFUND/word_dict.txt"
登录后复制
【AI达人特训营】多模态技术在工业场景中的应用实践:表单识别重命名 - php中文网

总结,我们分别使用PP-OCRv3中英文超轻量检测预训练模型、XTOWER数据集+finetune 2种方案进行评估、训练等,指标对比如下:

方案 acc 结果分析
PP-OCRv3中英文超轻量识别预训练模型 0%
XTOWER数据集+finetune 93.74% 真实识别数据对于性能提升很有帮助

5 文档视觉问答(DOC-VQA)

VQA指视觉问答,主要针对图像内容进行提问和回答,DOC-VQA是VQA任务中的一种,DOC-VQA主要针对文本图像的文字内容提出问题。

PaddleOCR中DOC-VQA系列算法基于PaddleNLP自然语言处理算法库实现LayoutXLM论文,支持基于多模态方法的 语义实体识别 (Semantic Entity Recognition, SER) 以及 关系抽取 (Relation Extraction, RE) 任务。

如果希望直接体验预测过程,可以下载我们提供的预训练模型,跳过训练过程,直接预测即可。

In [ ]
# ser和re预训练模型需要下载%cd pretrain#下载SER模型! wget https://paddleocr.bj.bcebos.com/pplayout/ser_LayoutXLM_xfun_zh.tar && tar -xvf ser_LayoutXLM_xfun_zh.tar
%rm -rf  ser_LayoutXLM_xfun_zh.tar#下载RE模型! wget https://paddleocr.bj.bcebos.com/pplayout/re_LayoutXLM_xfun_zh.tar && tar -xvf re_LayoutXLM_xfun_zh.tar
%rm -rf re_LayoutXLM_xfun_zh.tar
%cd ../
登录后复制

5.1 SER

SER: 语义实体识别 (Semantic Entity Recognition), 可以完成对图像中的文本识别与分类。

【AI达人特训营】多模态技术在工业场景中的应用实践:表单识别重命名 - php中文网
SER测试效果图

图 中不同颜色的框表示不同的类别,对于XFUND数据集,有QUESTION, ANSWER, HEADER 3种类别

  • 深紫色:HEADER
  • 浅紫色:QUESTION
  • 军绿色:ANSWER

在OCR检测框的左上方也标出了对应的类别和OCR识别结果。

XTOWER数据集采用了与XFUND相同的类别划分

5.1.1 SER:模型训练

启动训练之前,需要修改配置文件 configs/vqa/ser/layoutxlm.yml 以下四个字段:

1. Train.dataset.data_dir:指向训练集图片存放目录
2. Train.dataset.label_file_list:指向训练集标注文件
3. Eval.dataset.data_dir:指指向验证集图片存放目录
4. Eval.dataset.label_file_list:指向验证集标注文件
登录后复制
In [ ]
# #使用XTOWER数据集训练# %cd /home/aistudio/PaddleOCR/# ! CUDA_VISIBLE_DEVICES=0 python tools/train.py \#     -c configs/vqa/ser/layoutxlm.yml \#     -o Architecture.Backbone.pretrained=pretrain/ser_LayoutXLM_xfun_zh/
登录后复制

由于模型很大,这里在数据集中提供训练好的模型,以下命令解压模型:

In [4]
#解压训练好的LayoutXLM模型,模型较大请耐心等待(大约3分钟)%cd /home/aistudio/
!unzip -q /home/aistudio/data/data154392/output.zip -d PaddleOCR/
登录后复制
/home/aistudio
登录后复制

最终会打印出precision, recall, hmean等指标。 在./output/ser_layoutxlm/文件夹中会保存训练日志,最优的模型和最新epoch的模型。

5.1.2 SER:模型评估

我们使用下载的预训练模型进行评估,如果使用自己训练好的模型进行评估,将待评估的模型所在文件夹路径赋值给 Architecture.Backbone.checkpoints 字段即可。

In [ ]
#预训练模型评估! CUDA_VISIBLE_DEVICES=0 python tools/eval.py \
    -c configs/vqa/ser/layoutxlm.yml \
    -o Architecture.Backbone.checkpoints=pretrain/ser_LayoutXLM_xfun_zh
登录后复制
In [ ]
#XTOWER数据集评估! CUDA_VISIBLE_DEVICES=0 python tools/eval.py \
    -c configs/vqa/ser/layoutxlm.yml \
    -o Architecture.Backbone.checkpoints=output/ser_layoutxlm/best_accuracy
登录后复制

使用预训练模型进行评估,指标如下所示:

方案 hmean
预训练模型 75.06%
预训练模型+XTOWER数据集 99.38%

使用XTOWER数据集训练,在验证集上评估达到99%左右,效果非常好,现在是在小数据集(33张图)上训练,还需要看在模型的泛化能力。

5.1.3 SER:模型预测

使用如下命令即可完成OCR引擎 + SER的串联预测, 以SER预训练模型为例:

In [ ]
# SER+OCR预测%cd /home/aistudio/PaddleOCR
! CUDA_VISIBLE_DEVICES=0 python tools/infer_vqa_token_ser.py \
    -c configs/vqa/ser/layoutxlm.yml  \
    -o Architecture.Backbone.checkpoints=./output/ser_layoutxlm/best_accuracy \
    Global.infer_img=../XTOWER/val_data/image
登录后复制

最终会在config.Global.save_res_path字段所配置的目录下保存预测结果可视化图像以及预测结果文本文件,预测结果文本文件名为infer_results.txt。通过如下命令查看预测图片:

5.2 RE

基于 RE 任务,可以完成对图象中的文本内容的关系提取,如判断问题对(pair)。

【AI达人特训营】多模态技术在工业场景中的应用实践:表单识别重命名 - php中文网
图23 RE预测效果图

图中红色框表示问题,蓝色框表示答案,问题和答案之间使用绿色线连接。在OCR检测框的左上方也标出了对应的类别和OCR识别结果。

5.2.1 RE:模型训练

启动训练之前,需要修改配置文件configs/vqa/re/layoutxlm.yml中的以下四个字段

Train.dataset.data_dir:指向训练集图片存放目录
Train.dataset.label_file_list:指向训练集标注文件
Eval.dataset.data_dir:指指向验证集图片存放目录
Eval.dataset.label_file_list:指向验证集标注文件
登录后复制
In [ ]
# #训练模型# %cd  /home/aistudio/PaddleOCR/# ! CUDA_VISIBLE_DEVICES=0 python tools/train.py \#     -c configs/vqa/re/layoutxlm.yml \#     -o Architecture.Backbone.pretrained=pretrain/re_LayoutXLM_xfun_zh/
登录后复制

最终会打印出precision, recall, hmean等指标。 在./output/re_layoutxlm/文件夹中会保存训练日志,最优的模型和最新epoch的模型

5.2.2 RE:模型评估

我们使用下载的预训练模型进行评估,如果使用自己训练好的模型进行评估,将待评估的模型所在文件夹路径赋值给 Architecture.Backbone.checkpoints 字段即可。

In [ ]
%cd  /home/aistudio/PaddleOCR/#评估预训练模型! CUDA_VISIBLE_DEVICES=0 python tools/eval.py \
    -c configs/vqa/re/layoutxlm.yml \
    -o Architecture.Backbone.checkpoints=pretrain/re_LayoutXLM_xfun_zh/
登录后复制
In [ ]
# 预训练模型在XFUND验证集上评估! CUDA_VISIBLE_DEVICES=0 python3 tools/eval.py \
    -c configs/vqa/re/layoutxlm_xfund.yml \
    -o Architecture.Backbone.checkpoints=pretrain/re_LayoutXLM_xfun_zh/
登录后复制
In [ ]
# 预训练模型+XTOWER数据集 在XTOWER数据集上评估! CUDA_VISIBLE_DEVICES=0 python3 tools/eval.py \
    -c configs/vqa/re/layoutxlm.yml \
    -o Architecture.Backbone.checkpoints=output/re_layoutxlm/best_accuracy
登录后复制
方案 hmean 说明
预训练模型 65.44%
预训练模型(在XFUND验证集上评估 ) 74.83% 具备一定的泛化能力
预训练模型+XTOWER数据集 100% 说明在特定几种表格中表现超强
预训练模型+XTOWER数据集(在XFUND验证集上评估) 30.14% 但XTOWER只有2种表格,不具备泛化性

我们可以看到用XTOWER小数据集(33张)的hmean达到100%,这里是不是觉得可能过拟合了,我又在XTOWER大数据集(163张)再进行了评估,mean还是为100%。

5.2.3 RE:模型预测

从数据集中复制全部图片来检验预测模型效果,合并训练集与验证集用来与预测结果进行对比。

In [14]
%cd /home/aistudio/data/data154392/# 整理全量预测图片(163张)! unzip -q -o /home/aistudio/data/data154392/xtower.zip ! cp ./XTOWER/train_data/image/* ./XTOWER/image
! cp ./XTOWER/val_data/image/* ./XTOWER/image# ! ls -l XTOWER/image# 合并数据标注信息(与预测结果对比)! cat ./XTOWER/train_data/normalize_train.json ./XTOWER/val_data/normalize_val.json > ./XTOWER/normalize_all.json
登录后复制
/home/aistudio/data/data154392
登录后复制

使用如下命令即可完成OCR引擎 + SER + RE的串联预测,指定分别训练的SER和RE的best_accuracy模型。

In [ ]
%cd /home/aistudio/PaddleOCR#ocr+ser+re 预测! CUDA_VISIBLE_DEVICES=0 python3 tools/infer_vqa_token_ser_re.py \
    -c configs/vqa/re/layoutxlm.yml \
    -o Architecture.Backbone.checkpoints=output/re_layoutxlm/best_accuracy \
    Global.infer_img=/home/aistudio/data/data154392/XTOWER/image/ \
    -c_ser configs/vqa/ser/layoutxlm.yml \
    -o_ser Architecture.Backbone.checkpoints=output/ser_layoutxlm/best_accuracy
登录后复制

最终会在config.Global.save_res_path字段所配置的目录下保存预测结果可视化图像以及预测结果文本文件,预测结果文本文件名为infer_results.txt, 每一行表示一张图片的结果,每张图片的结果如下所示,前面表示测试图片路径,后面为测试结果:key字段及对应的value字段。

test_imgs/t131.jpg	{"政治面税": "群众", "性别": "男", "籍贯": "河北省邯郸市", "婚姻状况": "亏末婚口已婚口已娇", "通讯地址": "邯郸市阳光苑7号楼003", "民族": "汉族", "毕业院校": "河南工业大学", "户口性质": "口农村城镇", "户口地址": "河北省邯郸市", "联系电话": "13288888888", "健康状况": "健康", "姓名": "小六", "好高cm": "180", "出生年月": "1996年8月9日", "文化程度": "本科", "身份证号码": "458933777777777777"}
登录后复制
In [ ]
%cd /home/aistudio/PaddleOCRimport jsonimport copyimport numpy as npimport os#获取标注的数据with open('/home/aistudio/data/data154392/XTOWER/normalize_all.json', 'r', encoding='utf-8') as fin:
    lines = fin.readlines()
    i=1
    ocr_key = {}
    error_key={}    for line in lines:
        img_path, result = line.strip().split('\t')        # print(img_path)
        orc_infos = json.loads(result)['ocr_info']
        question=0
        qlinking=[]
        answers=""
        for ocrinfo in orc_infos:            if ocrinfo['text'] in ["铁塔名称","铁塔站点名称"]:
                question = ocrinfo['id']
                qlinking = ocrinfo['linking']
                qlinking = np.array(qlinking)
                qlinking = qlinking[:,-1]                # print(qlinking)
        for ocrinfo in orc_infos:            if ocrinfo['id'] in qlinking:                # answers.append(copy.deepcopy(ocrinfo['text']))
                answers += ocrinfo['text']        # print(answers) 
        ocr_key[img_path] = answers    print("标注数据:%d 个" % len(ocr_key))    # print(ocr_key)# #获取识别的情况rename_command =""with open('./output/re/infer_results.txt', 'r', encoding='utf-8') as fin:
    lines = fin.readlines()
    i=1
    result_key = {}
    error_key={}    for line in lines:
        img_path, result = line.strip().split('\t')
        img_path = img_path.replace('/home/aistudio/data/data154392/XTOWER/','')
        result = json.loads(result)['ser_result']        # print(img_path)
        answers=[]
        question=[]        for ocr_info_head, ocr_info_tail in result:   
            if ocr_info_head['text'] not in ["铁塔名称","铁塔站点名称"]:                continue
            if ocr_info_head['text'] not in result_key:
                question=ocr_info_head['text']
                answers.append(ocr_info_tail)            else:
                answers.append(ocr_info_tail)

            answers = sorted(answers, key=lambda keys: keys.get("bbox")[1], reverse=False) # 根据坐标top排序
            
            answer_text = ''
            for item in answers:
                answer_text += item['text']

            result_key[img_path]=answer_text        
        if img_path not in ocr_key:
            error_key[img_path] = "读取标注有误差"
        elif img_path not in result_key:
            error_key[img_path] = "未识别出名称"
            print(" %s: 识别错误❌:\t %s" % (img_path,"未识别出名称"))        elif result_key[img_path] == ocr_key[img_path]:            print("%s: 识别正确✅ :\t %s,%s" % (img_path,ocr_key[img_path], result_key[img_path]))
            rename_command +="mv %s image/%s.jpg\n" % (img_path,result_key[img_path])        else:
            error_key[img_path] = "识别错误,标注:"+ocr_key[img_path]+",识别:"+result_key[img_path]+""
            print("%s: 识别错误❌ :\t %s,%s" % (img_path,ocr_key[img_path], result_key[img_path]))       
    print('识别个数:%d,错误个数:%d' % (len(result_key),len(error_key)))    print("错误数据:\n")    print(error_key)    # 批量重命名命令
    with open('/home/aistudio/data/data154392/XTOWER/rename_info.sh', 'w', encoding='utf-8') as f:
        f.writelines(rename_command)
登录后复制

经过与全量数据集对比:163张图片中,:

  • 2张未找到“铁塔名称”文字。
  • 1张识别错误,将半角括号识别成了全角括号(根据数据集标注有关)。

准确率为:160/163 = 98.15%,超过项目要求(90%)。

In [ ]
# 重命名图片%cd /home/aistudio/data/data154392/XTOWER
! chmod +x ./rename_info.sh
! ./rename_info.sh
! ls -l ./image
登录后复制

以上就是【AI达人特训营】多模态技术在工业场景中的应用实践:表单识别重命名的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号