计算机视觉在工业领域的应用覆盖文字识别、图像识别、视频识别等,在实际的工作中,有时候需要根据表单图片中的指定区域进行识别并重命名,通过多模态技术实现识别内容的精确提取。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

表单识别包含两大阶段:OCR阶段和文档视觉问答阶段。
其中,OCR阶段选取了PaddleOCR的PP-OCRv3模型,主要由文本检测和文本识别两个模块组成。DOC-VQA文档视觉问答阶段基于PaddleNLP自然语言处理算法库实现的LayoutXLM模型,支持基于多模态方法的语义实体识别(Semantic Entity Recognition, SER)以及关系抽取(Relation Extraction, RE)任务。
下载PaddleOCR源码,本项目中已经帮大家打包好的PaddleOCR (已经修改好配置文件) ,无需下载解压即可,只需安装依赖环境~
! unzip -q PaddleOCR.zip
# 如仍需安装或安装更新,可以执行以下步骤# ! git clone https://gitee.com/PaddlePaddle/PaddleOCR
fatal: 目标路径 'PaddleOCR' 已经存在,并且不是一个空目录。
# 安装依赖包! 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
这里使用XFUND数据集做为实验数据集。 XFUND数据集是微软提出的一个用于KIE任务的多语言数据集,共包含七个数据集,每个数据集包含149张训练集和50张验证集
分别为:ZH(中文)、JA(日语)、ES(西班牙)、FR(法语)、IT(意大利)、DE(德语)、PT(葡萄牙)
本次实验选取中文数据集作为我们的演示数据集。法语数据集作为实践课程的数据集,数据集样例图如 图2 所示。

处理好的XFUND中文数据集下载地址:https://paddleocr.bj.bcebos.com/dataset/XFUND.tar ,可以运行如下指令完成中文数据集下载和解压。
# 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": []
}
]
}使用XFUND训练PaddleOCR检测和识别模型,需要将数据集格式改为训练需求的格式。
" 图像文件名 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 表示当前文本框的文字,当其内容为“###”时,表示该文本框无效,在训练时会跳过。
" 图像文件名 图像标注信息 "train_data/rec/train/word_001.jpg 简单可依赖 train_data/rec/train/word_002.jpg 用科技让复杂的世界更简单 ...
已经提供转换脚本,执行如下代码即可转换成功:
%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由于篇幅和侧重点原因,本文使用制作好的数据集(XTOWER),数据集制作方法放在另一篇文章里——《巧用PPOCRLabel制作DOC-VAQ格式数据集》。
# 解压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
选用飞桨OCR开发套件PaddleOCR中的PP-OCRv3模型进行文本检测和识别。 PP-OCRv3在PP-OCRv2的基础上,针对检测模型和识别模型,进行了共计9个方面的升级:
更多细节请参考PP-OCRv3技术报告。
我们使用2种方案进行训练、评估:
1)下载预训练模型
PaddleOCR已经提供了PP-OCR系列模型,PP-OCRv3中英文模型列表如下:
| 模型简介 | 模型名称 | 推荐场景 | 检测模型 | 方向分类器 | 识别模型 |
|---|---|---|---|---|---|
| 中英文超轻量PP-OCRv3模型(16.2M) | ch_PP-OCRv3_xx | 移动端&服务器端 | 推理模型 / 训练模型 | 推理模型 / 训练模型 | 推理模型 / 训练模型 |
更多模型下载(包括英文数字模型、多语言模型、Paddle-Lite模型等),可以参考PP-OCR 系列模型下载。
这里我们使用PP-OCRv3中英文超轻量检测模型,下载并解压预训练模型:
# 提供的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的验证集上进行评估,具体代码如下:
#在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# 在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数据集训练一下
PaddleOCR提供的蒸馏预训练模型包含了多个模型的参数,我们提取Student模型的参数,在XFUND数据集上进行finetune,可以参考如下代码:
%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'执行下面命令启动训练:
# ! 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,
# 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):导出模型
在模型训练过程中保存的模型文件是包含前向预测和反向传播的过程,在实际的工业部署则不需要反向传播,因此需要将模型进行导成部署需要的模型格式。 执行下面命令,即可导出模型。
# 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
%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/目录下,查看检测效果。
文本检测效果图总结,我们分别使用PP-OCRv3中英文超轻量检测预训练模型、XTOWER数据集+finetune 2种方案进行评估、训练等,指标对比如下:
| 方案 | hmean | 结果分析 |
|---|---|---|
| PP-OCRv3中英文超轻量检测预训练模型 | 83.96% | ppocr提供的预训练模型有一定的泛化能力 |
| XTOWER数据集+finetune | 96.71% | finetune会提升垂类场景效果 |
# 已经提供下载解压好的模型,不需要再执行这个步骤;# 如果更换其他模型,更新下载链接和解压指令就可以%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:指向验证集标注文件
我们使用下载的预训练模型进行评估:
%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验证集上评估.
同检测模型,我们提取Student模型的参数,在XTOWER数据集上进行finetune,可以参考如下代码:
# 已经提供好提取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:指向验证集标注文件
执行如下命令启动训练:
# # 开始训练# %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
%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):导出模型
导出模型只保留前向预测的过程:
!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指定使用的字典路径
! 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"
总结,我们分别使用PP-OCRv3中英文超轻量检测预训练模型、XTOWER数据集+finetune 2种方案进行评估、训练等,指标对比如下:
| 方案 | acc | 结果分析 |
|---|---|---|
| PP-OCRv3中英文超轻量识别预训练模型 | 0% | |
| XTOWER数据集+finetune | 93.74% | 真实识别数据对于性能提升很有帮助 |
VQA指视觉问答,主要针对图像内容进行提问和回答,DOC-VQA是VQA任务中的一种,DOC-VQA主要针对文本图像的文字内容提出问题。
PaddleOCR中DOC-VQA系列算法基于PaddleNLP自然语言处理算法库实现LayoutXLM论文,支持基于多模态方法的 语义实体识别 (Semantic Entity Recognition, SER) 以及 关系抽取 (Relation Extraction, RE) 任务。
如果希望直接体验预测过程,可以下载我们提供的预训练模型,跳过训练过程,直接预测即可。
# 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 ../
SER: 语义实体识别 (Semantic Entity Recognition), 可以完成对图像中的文本识别与分类。

图 中不同颜色的框表示不同的类别,对于XFUND数据集,有QUESTION, ANSWER, HEADER 3种类别
在OCR检测框的左上方也标出了对应的类别和OCR识别结果。
XTOWER数据集采用了与XFUND相同的类别划分
启动训练之前,需要修改配置文件 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:指向验证集标注文件
# #使用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/
由于模型很大,这里在数据集中提供训练好的模型,以下命令解压模型:
#解压训练好的LayoutXLM模型,模型较大请耐心等待(大约3分钟)%cd /home/aistudio/ !unzip -q /home/aistudio/data/data154392/output.zip -d PaddleOCR/
/home/aistudio
最终会打印出precision, recall, hmean等指标。 在./output/ser_layoutxlm/文件夹中会保存训练日志,最优的模型和最新epoch的模型。
我们使用下载的预训练模型进行评估,如果使用自己训练好的模型进行评估,将待评估的模型所在文件夹路径赋值给 Architecture.Backbone.checkpoints 字段即可。
#预训练模型评估! CUDA_VISIBLE_DEVICES=0 python tools/eval.py \
-c configs/vqa/ser/layoutxlm.yml \
-o Architecture.Backbone.checkpoints=pretrain/ser_LayoutXLM_xfun_zh#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张图)上训练,还需要看在模型的泛化能力。
使用如下命令即可完成OCR引擎 + SER的串联预测, 以SER预训练模型为例:
# 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。通过如下命令查看预测图片:
基于 RE 任务,可以完成对图象中的文本内容的关系提取,如判断问题对(pair)。

图中红色框表示问题,蓝色框表示答案,问题和答案之间使用绿色线连接。在OCR检测框的左上方也标出了对应的类别和OCR识别结果。
启动训练之前,需要修改配置文件configs/vqa/re/layoutxlm.yml中的以下四个字段
Train.dataset.data_dir:指向训练集图片存放目录 Train.dataset.label_file_list:指向训练集标注文件 Eval.dataset.data_dir:指指向验证集图片存放目录 Eval.dataset.label_file_list:指向验证集标注文件
# #训练模型# %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的模型
我们使用下载的预训练模型进行评估,如果使用自己训练好的模型进行评估,将待评估的模型所在文件夹路径赋值给 Architecture.Backbone.checkpoints 字段即可。
%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/# 预训练模型在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/# 预训练模型+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%。
从数据集中复制全部图片来检验预测模型效果,合并训练集与验证集用来与预测结果进行对比。
%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模型。
%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"}%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张图片中,:
准确率为:160/163 = 98.15%,超过项目要求(90%)。
# 重命名图片%cd /home/aistudio/data/data154392/XTOWER ! chmod +x ./rename_info.sh ! ./rename_info.sh ! ls -l ./image
以上就是【AI达人特训营】多模态技术在工业场景中的应用实践:表单识别重命名的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号