基于paddleocr的表单关键信息抽取

全流程如下:

数据集

XFUND数据集是微软提出的一个用于KIE任务的多语言数据集,共包含七个数据集,每个数据集包含149张训练集和50张验证集分别为:

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

选取中文数据集,链接如下

GitHub - doc-analysis/XFUND: XFUND: A Multilingual Form Understanding Benchmark

进行下面这两步,命令行如下:

! wget https://paddleocr.bj.bcebos.com/dataset/XFUND.tar
! tar -xf XFUND.tar

目录结构

数据集标注格式

转换数据格式

转换脚本

按我这个来,他那个有些bug

import os
import cv2
import json
import shutil
from PIL import Image,ImageDrawtrain_path = '/home/aistudio/data/data140302/XFUND_ori/zh.train/'
eval_path = '/home/aistudio/data/data140302/XFUND_ori/zh.val/'
drawImg = False
if drawImg:os.makedirs('draw_imgs')rec_save_path = '/home/aistudio/XFUND/rec_imgs/'
if not os.path.exists(rec_save_path):os.makedirs(rec_save_path)def transfer_xfun_data(json_path=None, det_output_file=None, rec_output_file=None, di=set()):with open(json_path, "r", encoding='utf-8') as fin:lines = fin.readlines()json_info = json.loads(lines[0])documents = json_info["documents"]if 'train' in json_path:path = '/zh.train/'else:path = '/zh.val/'det_file = open(det_output_file, "w")rec_file = open(rec_output_file, "w")for idx, document in enumerate(documents):img_info = document["img"]document = document["document"]image_path = img_info["fname"]img = cv2.imread('data/data140302/XFUND_ori'+path+image_path)# 保存信息到检测文件中det_info = []if drawImg:img_pil = Image.fromarray(img)draw = ImageDraw.Draw(img_pil)num=0for doc in document:# 检测文件信息det_info.append({"transcription":doc["text"], "points":[[doc["box"][0],doc["box"][1]],[doc["box"][2],doc["box"][1]],[doc["box"][2],doc["box"][3]],[doc["box"][0],doc["box"][3]]]})# 保存识别图片pic = img[doc["box"][1]:doc["box"][3], doc["box"][0]:doc["box"][2]]rec_save_dir = rec_save_path + os.path.splitext(image_path)[0]+'_'+str(num).zfill(3)+".jpg"cv2.imwrite(rec_save_dir,pic)# 识别文件信息rec_line = '/'.join(rec_save_dir.split('/')[-2:]) + '\t' + doc["text"] + '\n'rec_file.write(rec_line)# 字典di = di | set(doc["text"])num+=1if drawImg:draw.polygon([(doc["box"][0],doc["box"][1]), (doc["box"][2],doc["box"][1]), (doc["box"][2],doc["box"][3]), (doc["box"][0],doc["box"][3])], outline=(255,0,0))if drawImg:img_pil.save('./draw_imgs/'+image_path)det_line = path+ image_path + '\t' + json.dumps(det_info,ensure_ascii=False) +'\n'det_file.write(det_line)det_file.close() rec_file.close()return di# =================检测文件=================
det_train = '/home/aistudio/XFUND/det_gt_train.txt'
det_test = '/home/aistudio/XFUND/det_gt_val.txt'# =================识别文件=================
rec_train = '/home/aistudio/XFUND/rec_gt_train.txt'
rec_test = '/home/aistudio/XFUND/rec_gt_val.txt'di_xfund = set()
di_xfund = transfer_xfun_data("/home/aistudio/data/data140302/XFUND_ori/zh.train.json", det_train, rec_train, di_xfund)
di_xfund = transfer_xfun_data("/home/aistudio/data/data140302/XFUND_ori/zh.val.json", det_test, rec_test, di_xfund)

文本检测的标注格式

中间用’\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’分割,如用其他方式分割将造成训练报错

文本检测

方案1:• PP-OCRv2中英文超轻量检测预训练模型

下载模型

%mkdir /home/aistudio/PaddleOCR/pretrain/
%cd /home/aistudio/PaddleOCR/pretrain/
! wget https://paddleocr.bj.bcebos.com/PP-OCRv2/chinese/ch_PP-OCRv2_det_distill_train.tar
! tar -xf ch_PP-OCRv2_det_distill_train.tar && rm -rf ch_PP-OCRv2_det_distill_train.tar
% cd ..

修改配置,主要是改路径

评估如下

%cd /home/aistudio/PaddleOCR
! python tools/eval.py \-c configs/det/ch_PP-OCRv2/ch_PP-OCRv2_det_cml.yml

精度达到77%

finetune

100epoch,我直接用训练好的权重文件了

%cd /home/aistudio/PaddleOCR/
! python tools/eval.py \-c configs/det/ch_PP-OCRv2/ch_PP-OCRv2_det_student.yml \-o Global.checkpoints="pretrain/ch_db_mv3-student1600-finetune/best_accuracy"

未finetune的如下,效果略微差了一点

导出模型

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

%cd /home/aistudio/PaddleOCR/
! python tools/export_model.py \-c configs/det/ch_PP-OCRv2/ch_PP-OCRv2_det_student.yml \-o Global.pretrained_model="pretrain/ch_db_mv3-student1600-finetune/best_accuracy" \Global.save_inference_dir="./output/det_db_inference/"

会有这些文件

文本识别

预训练模型

%cd /home/aistudio/PaddleOCR/pretrain/
! wget https://paddleocr.bj.bcebos.com/PP-OCRv2/chinese/ch_PP-OCRv2_rec_train.tar
! tar -xf ch_PP-OCRv2_rec_train.tar && rm -rf ch_PP-OCRv2_rec_train.tar
% cd ..

下载预训练模型,评估结果如下

XFUND数据集+finetune

训练代码如下,喜欢自己去跑,太慢了,玩不起

 %cd /home/aistudio/PaddleOCR/! CUDA_VISIBLE_DEVICES=0 python tools/train.py \-c configs/rec/ch_PP-OCRv2/ch_PP-OCRv2_rec.yml

用人训练好的结果如下

XFUND数据集+finetune+真实通用识别数据

这部分数据人家没公开,公开了26W我也跑不动,还行,权重文件给了

下面就跟检测那部分一样导出模型就行了

文档视觉问答

主要分为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

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

对于XFUND数据集,有QUESTION, ANSWER, HEADER 3种类别

用下面的命令下载数据集,不要用他环境提供的,会报错,数据格式有问题

! wget https://paddleocr.bj.bcebos.com/dataset/XFUND.tar
! tar -xf XFUND.tar

进行训练,命令行如下

%cd /home/aistudio/PaddleOCR/
! CUDA_VISIBLE_DEVICES=0 python3 tools/train.py -c configs/vqa/ser/layoutxlm.yml

进行评估,代码如下

! CUDA_VISIBLE_DEVICES=0 python tools/eval.py \-c configs/vqa/ser/layoutxlm.yml \-o Architecture.Backbone.checkpoints=pretrain/ser_LayoutXLM_xfun_zh/

完成ocr+SER串联

! CUDA_VISIBLE_DEVICES=0 python tools/infer_vqa_token_ser.py \-c configs/vqa/ser/layoutxlm.yml  \-o Architecture.Backbone.checkpoints=pretrain/ser_LayoutXLM_xfun_zh/ \Global.infer_img=doc/vqa/input/zh_val_42.jpg

结果如下

import cv2
from matplotlib import pyplot as plt
# 在notebook中使用matplotlib.pyplot绘图时,需要添加该命令进行显示
%matplotlib inlineimg = cv2.imread('output/ser/zh_val_42_ser.jpg')
plt.figure(figsize=(48,24))
plt.imshow(img)

RE

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

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

训练命令如下

 ! CUDA_VISIBLE_DEVICES=0 python tools/train.py \-c configs/vqa/re/layoutxlm.yml

进行评估

! CUDA_VISIBLE_DEVICES=0 python3 tools/eval.py \-c configs/vqa/re/layoutxlm.yml \-o Architecture.Backbone.checkpoints=pretrain/re_LayoutXLM_xfun_zh/

串联全部

%cd /home/aistudio/PaddleOCR
! CUDA_VISIBLE_DEVICES=0 python3 tools/infer_vqa_token_ser_re.py \-c configs/vqa/re/layoutxlm.yml \-o Architecture.Backbone.checkpoints=pretrain/re_LayoutXLM_xfun_zh/ \Global.infer_img=test_imgs/ \-c_ser configs/vqa/ser/layoutxlm.yml \-o_ser Architecture.Backbone.checkpoints=pretrain/ser_LayoutXLM_xfun_zh/

结果大概这样

红色是问题,蓝色是答案,用绿线连接表示关系

修改文件,导出excel

vim /home/aistudio/PaddleOCR/tools/infer_vqa_token_ser_re.py

为了输出信息匹配对,我们修改tools/infer_vqa_token_ser_re.py文件中的line 194-197

 fout.write(img_path + "\t" + json.dumps({"ser_resule": result,}, ensure_ascii=False) + "\n")

更改为

result_key = {}
for ocr_info_head, ocr_info_tail in result:result_key[ocr_info_head['text']] = ocr_info_tail['text']fout.write(img_path + "\t" + json.dumps(result_key, ensure_ascii=False) + "\n")
import json
import xlsxwriter as xwworkbook = xw.Workbook('output/re/infer_results.xlsx')
format1 = workbook.add_format({'align': 'center','valign': 'vcenter','text_wrap': True,
})
worksheet1 = workbook.add_worksheet('sheet1')
worksheet1.activate()
title = ['姓名', '性别', '民族', '文化程度', '身份证号码', '联系电话', '通讯地址']
worksheet1.write_row('A1', title)
i = 2with open('output/re/infer_results.txt', 'r', encoding='utf-8') as fin:lines = fin.readlines()for line in lines:img_path, result = line.strip().split('\t')result_key = json.loads(result)# 写入Excelrow_data = [result_key['姓名'], result_key['性别'], result_key['民族'], result_key['文化程度'], result_key['身份证号码'], result_key['联系电话'], result_key['通讯地址']]row = 'A' + str(i)worksheet1.write_row(row, row_data, format1)i+=1
workbook.close()

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/69312.shtml

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    AIGC视频扩散模型新星:Video 版本的SD模型

    大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细介绍慕尼黑大学携手 NVIDIA 等共同推出视频生成模型 Video LDMs。NVIDIA 在 AI 领域的卓越成就家喻户晓,而慕尼黑大学同样不容小觑,…

    深度解析:基于Vue 3的教育管理系统架构设计与优化实践

    一、项目架构分析 1. 技术栈全景 项目采用 Vue 3 TypeScript Tailwind CSS 技术组合,体现了现代前端开发的三大趋势: 响应式编程:通过Vue 3的Composition API实现细粒度响应 类型安全:约60%的组件采用TypeScript编写 原子化…

    运用python进行多任务学习过程中,手动调整权重时,如何选择项目并确定合适的权重值?

    在手动调整多任务学习中不同任务的损失权重时,确定合适的权重值是一个需要细致考虑的问题。以下是一些基于最新研究和实践的方法和策略: 第一部分:手动调整权重确定合适的权重值 1. 基于任务的重要性 方法:根据任务的重要性手动分配权重。例如,如果一个任务对最终性能的影…

    aws(学习笔记第二十六课) 使用AWS Elastic Beanstalk

    aws(学习笔记第二十六课) 使用aws Elastic Beanstalk 学习内容: AWS Elastic Beanstalk整体架构AWS Elastic Beanstalk的hands onAWS Elastic Beanstalk部署node.js程序包练习使用AWS Elastic Beanstalk的ebcli 1. AWS Elastic Beanstalk整体架构 官方的guide AWS…

    视频多模态模型——视频版ViT

    大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细解读多模态论文《ViViT: A Video Vision Transformer》,2021由google 提出用于视频处理的视觉 Transformer 模型,在视频多模态领域有…

    【ArcGIS微课1000例】0141:提取多波段影像中的单个波段

    文章目录 一、波段提取函数二、加载单波段导出问题描述:如下图所示,img格式的时序NDVI数据有24个波段。现在需要提取某一个波段,该怎样操作? 一、波段提取函数 首先加载多波段数据。点击【窗口】→【影像分析】。 选择需要处理的多波段影像,点击下方的【添加函数】。 在多…

    讨论:延迟双删,要延迟多久呢?

    这个延迟双删,其实是保证数据库和缓存数据一致性的一种方案来的。大家觉得应该如何回答更好呢?我觉得可以先从最基础的开始聊起,比如什么是一致性,然后从串联起来。我聊聊我的思路。 首先,先回归基础,什么…

    SQL Server查询计划操作符(7.3)——查询计划相关操作符(5)

    7.3. 查询计划相关操作符 38)Flow Distinct:该操作符扫描其输入并对其去重。该操作符从其输入得到每行数据时即将其返回(除非其为重复数据行,此时,该数据行会被抛弃),而Distinct操作符在产生任何输出前将消费所有输入。该操作符为逻辑操作符。该操作符具体如图7.2-38中…

    智慧消防营区一体化安全管控 2024 年度深度剖析与展望

    在 2024 年,智慧消防营区一体化安全管控领域取得了令人瞩目的进展,成为保障营区安全稳定运行的关键力量。这一年,行业在政策驱动、技术创新应用、实践成果及合作交流等方面呈现出多元且深刻的发展态势,同时也面临着一系列亟待解决…

    关于圆周率的新认知

    从自然对数底 的泰勒展开, 可以得出 的展开式, 它可以被认为是,以 0 为周期的单位 1 ,以 1 为周期的单位 1 ,以 2 为周期的单位 1 等所有自然数为周期的单位 1 分阶段合成(体现为阶乘的倒数)之…

    Flutter使用Flavor实现切换环境和多渠道打包

    在Android开发中通常我们使用flavor进行多渠道打包,flutter开发中同样有这种方式,不过需要在原生中配置 具体方案其实flutter官网个了相关示例(https://docs.flutter.dev/deployment/flavors),我这里记录一下自己的操作 Android …

    通过亚马逊云科技Bedrock打造自定义AI智能体Agent(上)

    大家对于智能体代理Agent一定已经非常熟悉,自主代理(Autonomous Agents) 目前在AI行业极其热门并具有巨大的潜力,能够显著提升开发者日常的工作效率、自动化日常琐碎、重复性任务,并生成全新的内容。Agent可以理解用户…

    基于STM32的阿里云智能农业大棚

    目录 前言: 项目效果演示: 一、简介 二、硬件需求准备 三、硬件框图 四、CubeMX配置 4.1、按键、蜂鸣器GPIO口配置 4.2、ADC输入配置 4.3、IIC——驱动OLED 4.4、DHT11温湿度读取 4.5、PWM配置——光照灯、水泵、风扇 4.6、串口——esp8266模…

    游戏与硬件深度协同,打造更精细的体验优化

    高画质的游戏往往带来手机的发热和卡顿从而影响游戏体验。开发者希望能够获取到手机运行的实时状态,从而能够进行主动的负载调节,将手机发热时游戏体验影响降到最低;同时手机也可以通过游戏传入的关键场景如"正在下载资源"“团战中…

    14-7C++STL的stack容器

    (一)stack容器的入栈与出栈 (1)stack容器的简介 stack堆栈容器,“先进后出”的容器,且stack没有迭代器 (2)stack对象的默认构造 stack采用模板类实现,stack对象的默认…

    使用.NET 8构建高效的时间日期帮助类

    使用.NET 8构建高效的时间日期帮助类 在现代Web应用程序中,处理日期和时间是一个常见的需求。无论是记录日志、生成报告还是进行数据分析,正确处理日期和时间对于确保数据的准确性和一致性至关重要。本文将详细介绍如何使用ASP.NET Core和C#构建一个高效…

    Python从0到100(八十五):神经网络-使用迁移学习完成猫狗分类

    前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能…

    C动态库的生成与在Python和QT中的调用方法

    目录 一、动态库生成 1)C语言生成动态库 2)c类生成动态库 二、动态库调用 1)Python调用DLL 2)QT调用DLL 三、存在的一些问题 1)python调用封装了类的DLL可能调用不成功 2)DLL格式不匹配的问题 四、…

    JVM学习指南(48)-JVM即时编译

    文章目录 即时编译(Just-In-Time Compilation, JIT)概述为什么JVM需要即时编译?即时编译与传统的静态编译的区别JVM中的即时编译器HotSpot VM中的C1和C2编译器编译器的作用和位置即时编译的工作流程代码的加载和解释执行热点代码检测编译优化编译优化技术公共子表达式消除循…

    flutter_学习记录_00_环境搭建

    1.参考文档 Mac端Flutter的环境配置看这一篇就够了 flutter的中文官方文档 2. 本人环境搭建的背景 本人的电脑的是Mac的,iOS开发,所以iOS开发环境本身是可用的;外加Mac电脑本身就会配置Java的环境。所以,后面剩下的就是&#x…