PPStructure核心源码研究(五)TableSystem类详解

news2024/9/22 14:26:04

总论中对PPStructure核心类做了概要介绍,本文旨在详解核心类之一:TableSystem类。回顾下总论中的内容,TableSystem类负责表格结构识别与表格内容匹配,代码在paddleocr/ppstructure/table/predict_table.py文件中。何谓表格结构识别?何谓表格内容匹配?
表格结构识别,就是在给定图片中识别出表头、表体等主体结构,并详细到表头包含多少列、表体包含多少行、哪些单元格跨列、哪些单元格跨行、每个单元格在什么位置。如总论中所述,开源团队选择了用html文本来表达一个表格结构。例如,用<thead>来表示表头,用<tbody>来表示表体,用<tr>表示,用<colspan><rowspan>来表示跨行跨列。 如果希望了解到所有支持的表格要素,可以查看官方字典。
表格内容匹配,就是在给定图片中进行文本检测与识别,然后通过一定的匹配算法,将文本内容填入表格结构识别结果,形成既含结构又有内容的返回值。常用的匹配算法,是基于文本框与单元格的距离,找到距离最近的单元格,填入文本内容到格子中。
本文首先详细解释TableSystem类的__init__与__call__方法,接着通过应用场景代码实践,进一步了解该类的实现原理与用法。

构造函数__init__方法

构造函数用于构造TableSystem类的实例,是使用该类的前提。构造函数位于predict_table.py文件的第59行,定义如下:

def __init__(self, args, text_detector=None, text_recognizer=None)

传入参数有三个,分别解释如下:

  • args参数,代表模型配置,类型无约束,但也有属性最小集要求。至少应该包含如下设置:

    • args.show_log代表是否显示日志信息
    • args.benchmark 代表是否启用基准测试
    • args.table_algorithm代表表格匹配算法
    • args.det_model_dir代表文本检测模型路径
    • args.rec_model_dir代表文本识别模型路径
    • args.table_model_dir代表表格识别模型路径
    • args.rec_char_dict_path代表文本识别模型配套字典路径
    • args.table_char_dict_path代表表格识别模型配套字典路径

    为了保持与源码的一致性,推荐使用parse_args函数来构造args参数实例,该函数的解释参照PPStructure核心源码研究(二)。

  • text_detector参数,代表指定文本检测模型实例,默认为None。如果未指定模型,系统将从args配置中构造文本检测模型实例,类型为predict_det.TextDetector。

  • text_recognizer参数,代表指定文本识别模型实例,默认为None。如果未指定模型,系统将从args配置中构造文本检测模型实例,类型为predict_rec.TextRecognizer。

魔法函数__call__

上节的构造函数完成了模型基础设置,真正体现功能的地方在魔法函数__call__。函数位于predict_table.py文件的第92行,定义如下:

def __call__(self, img, return_ocr_result_in_table=False)

传入参数解释如下:

  • img参数,图像数据三维张量,形状为[h,w,3],分别代表图像高度、图像宽度、通道数(RGB)
  • return_ocr_result_in_table参数,是否返回ocr识别结果,默认为False。如果改为True,那么不仅返回表格识别的html结果,还要返回表格中每个文本要素。文本要素包括边界框、文本、置信度等信息。

观察魔法函数__call__的代码,主干过程只有两个部分:结构识别与内容匹配。结构识别时,利用配置的表格预测模型与配套字典,完成输入图像到html结构代码的输出;内容匹配时,利用配置的文本检测与识别模型,得到所有文本框,再利用匹配算法,将文本填入html结构代码。返回值包含result与time_dict两项:

  • result
    第一项返回值result是解析结果,字典dict类型,最多包含cell_bbox、boxes、rec_res、html四个属性。以下详细解释各项属性:
    • cell_bbox属性,单元格边界框集合,列表list类型,每一项代表一个单元格位置,用八个数值的数组表示边界框四个顶点的x、y坐标
    • boxes属性,文本检测结果集,列表list类型,每一项代表一个文本边界框,用四个数值的数组表示边界框的左上角与右下角x、y坐标。注意,此属性只在传入参数return_ocr_result_in_table为True时才返回。
    • rec_res属性,文本识别结果集,列表list类型,每一项代表一个文本识别结果,用二元组表示。前者是文本,后者是置信度。注意,此属性只在传入参数return_ocr_result_in_table为True时才返回。
    • html属性,表格结构与内容识别结果,文本str类型,用标准HTML语言描述表头、表体、单元格等。
  • time_dict
    第二项返回值为耗时统计,字典dict类型,包含det、rec、table、match、all五个属性,分别代表文本检测、文本识别、表格预测、表格匹配、全部耗时,用于分析模型性能瓶颈,单位为秒。

返回值的理解中,有一点值得关注,同样是返回边界框,cell_bbox属性用的8数值,boxes属性用的4数值。初看时以为,开源团队在边界框的理解上并没有统一,有时用左上角、右上角、右下角、左下角四顶点坐标,有时用左上角、右下角两顶点坐标。细细品味,其实两者的应用场景不同,四顶点坐标适用于所有边界框描述场景,包含矩形和非矩形;而两顶点坐标,只适用于矩形边界框描述场景。所以,TableSystem类描述单元格时使用的四顶点,描述文本时使用的两顶点。

实验一:获取文本结果

第一个实验的目标,是获取表格模型的返回值,通过日志的形式输出结果。主要代码如下:

args = construct_engine_params()
source_img = './img/table1.jpg'
img = cv2.imread(source_img)
ts = TableSystem(args)
result, time_dict = ts(img, return_ocr_result_in_table=True)
logger.debug(f"table system model executed,time elapse {
     time_dict['all']:.3f}s,of which table={
     time_dict['table']:.3f}s rec={
     time_dict['rec']:.3f}s")
logger.debug(result['html'])
txt = [line[0] for line in result['rec_res']] 
conf = [line[1] for line in result['rec_res']] 
boxes = [b for b in result['boxes']]
for i in range(len(txt)):
   logger.debug(f'extract text in bbox top&left:({
     int(boxes[i][0])},{
     int(boxes[i][1])}),get text:{
     txt[i]} with confidence:{
     conf[i]:.4f}')

目标图片与总论一致。执行后输出如下:

[2024/09/20 15:23:17] ppocr DEBUG: dt_boxes num : 78, elapse : 0.1508955955505371
[2024/09/20 15:23:19] ppocr DEBUG: rec_res num  : 78, elapse : 1.687302827835083
[2024/09/20 15:23:19] ppocr DEBUG: table system model executed,time elapse 2.516s,of which table=0.522s rec=1.687s
[2024/09/20 15:23:19] ppocr DEBUG: <html><body><table><tbody><tr><td>Methods</td><td>R</td><td>P</td><td>F</td><td>FPS</td></tr><tr><td>SegLink[26]</td><td>70.0</td><td>86.0</td><td>77.0</td><td>8.9</td></tr><tr><td>PixelLink [4]</td><td>73.2</td><td>83.0</td><td>77.8</td><td></td></tr><tr><td>TextSnake[18]</td><td>73.9</td><td>83.2</td><td>78.3</td><td>1.1</td></tr><tr><td>TextField [37]</td><td>75.9</td><td>87.4</td><td>81.3</td><td>5.2</td></tr><tr><td>MSR[38]</td><td>76.7</td><td>87.4</td><td>81.7</td><td>-</td></tr><tr><td>FTSN [3]</td><td>77.1</td><td>87.6</td><td>82.0</td><td>-</td></tr><tr><td>LSE[30]</td><td>81.7</td><td>84.2</td><td>82.9</td><td>-</td></tr><tr><td>CRAFT [2]</td>

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

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

相关文章

数据结构之栈(python)

栈&#xff08;顺序栈与链栈&#xff09; 1.栈存储结构1.1栈的基本介绍1.2进栈和出栈1.3栈的具体实现1.4栈的应用例一例二例三 2.顺序栈及基本操作&#xff08;包含入栈和出栈&#xff09;2.1顺序栈的基础介绍2.2顺序栈元素入栈2.3顺序栈元素出栈2.4顺序栈的表示和实现 3.链栈及…

IDEA去除掉虚线,波浪线,和下划线实线的方法

初次安装使用IDEA&#xff0c;总是能看到导入代码后&#xff0c;出现很多的波浪线&#xff0c;下划线和虚线&#xff0c;这是IDEA给我们的一些提示和警告&#xff0c;但是有时候我们并不需要&#xff0c;反而会让人看着很不爽&#xff0c;这里简单记录一下自己的调整方法&#…

Linux:权限管理

基本权限和归属 权限和归属 基本权限与归属 • 访问权限 – 读取&#xff1a;允许查看内容-read – 写入&#xff1a;允许修改内容-write – 可执行&#xff1a;允许运行和切换-excute对于文本文件&#xff1a;r读取权限&#xff1a;cat、less、grep、head、tailw写入权限&am…

linux下共享内存的3种使用方式

进程是资源封装的单位&#xff0c;内存就是进程所封装的资源的一种。一般情况下&#xff0c;进程间的内存是相互隔离的&#xff0c;也就是说一个进程不能访问另一个进程的内存。如果一个进程想要访问另一个进程的内存&#xff0c;那么必须要进过内核这个桥梁&#xff0c;这就是…

中国雕塑—孙溟㠭凿刻印《自然贼》

中国雕塑孙溟㠭凿刻作品《自然贼》 孙溟㠭凿刻印《自然贼》 遵循自然之法谓之道&#xff0c;脱离自然之道谓之贼&#xff0c;道法自然。丙申秋月溟展刊。 孙溟㠭凿刻印《自然贼》 这方《自然贼》&#xff0c;红木章料&#xff0c;半尺见方&#xff0c;自然古朴&#xff0c;浑…

摆脱困境并在iPhone手机上取回删除照片的所有解决方案

您是否无意中从 iPhone 中删除了照片&#xff1f;您&#xff0c;无需惊慌&#xff0c;因为您可以使用以下方法恢复所有照片。 如果您长时间使用 iPhone&#xff0c;您应该知道 iOS 提供了许多 Android 不提供的备份功能。例如&#xff0c;您的所有照片都会自动备份到 iCloud 存…

【机器学习(七)】分类和回归任务-K-近邻 (KNN)算法-Sentosa_DSML社区版

文章目录 一、算法概念二、算法原理&#xff08;一&#xff09;K值选择&#xff08;二&#xff09;距离度量1、欧式距离2、曼哈顿距离3、闵可夫斯基距离 &#xff08;三&#xff09;决策规则1、分类决策规则2、回归决策规则 三、算法优缺点优点缺点 四、KNN分类任务实现对比&am…

音视频生态下Unity3D和虚幻引擎(Unreal Engine)的区别

技术背景 好多开发者跟我们做技术交流的时候&#xff0c;会问我们&#xff0c;为什么有Unity3D的RTMP|RTSP播放模块&#xff0c;还有RTMP推送和轻量级RTSP服务模块&#xff0c;为什么不去支持虚幻引擎&#xff1f;二者区别在哪里&#xff1f;本文就Unity3D和虚幻引擎之间的差异…

idea上传jar包到nexus

注意&#xff1a;确保idea中项目为maven项目&#xff0c;并且在nexus中已经创建了maven私服。 1、配置pom.xml中推送代码配置 <distributionManagement> <repository> <id>releases</id> <url>http://127.0.0.1:8001/repository/myRelease/<…

鼻咽癌中三级淋巴结构的单细胞与空间转录组分析|文献精析·24-09-22

小罗碎碎念 研究团队通过单细胞和空间转录组分析&#xff0c;揭示了与鼻咽癌进展和免疫治疗反应相关的三级淋巴结构。 作者角色作者姓名单位&#xff08;中文&#xff09;第一作者Yang Liu/通讯作者Jin-Xin Bei国家癌症中心南方肿瘤学重点实验室&#xff0c;鼻咽癌诊断治疗广东…

机器学习04-逻辑回归(python)-02原理与损失函数

​​​​​​​ 1. 逻辑回归概念 逻辑回归&#xff08;Logistic Regression&#xff09; 是一种 分类模型&#xff0c;主要用于解决 二分类问题&#xff08;即分成两类&#xff0c;如是否通过、是否患病等&#xff09;。逻辑回归的目标是根据输入的特征预测一个 概率&#xff0…

C++——关联式容器(4):set和map

在接触了诸如二叉搜索树、AVL树、红黑树的树形结构之后&#xff0c;我们对树的结构有了大致的了解&#xff0c;现在引入真正的关联式容器。 首先&#xff0c;先明确了关联式容器的概念。我们之前所接触到的如vector、list等容器&#xff0c;我们知道他们实际上都是线性的数据结…

C++门迷宫

目录 开头程序程序的流程图程序游玩的效果下一篇博客要说的东西 开头 大家好&#xff0c;我叫这是我58。 程序 #include <iostream> using namespace std; void printmaze(const char strmaze[11][11]) {int i 0;int ia 0;for (; i < 11; i) {for (ia 0; ia <…

部署林风社交论坛/社交论坛linfeng-community遇到问题集合

部署开源版本遇到的问题 1.管理端前端部署 npm install报错 “ERR! gyp verb ensuring that file exists: C:\Python27\python.exe” “ERR! gyp ERR! node -v v20.10.0” “ ERR! gyp ERR! node-gyp -v v3.8.0” 原因:node版本和node-gyp版本不匹配 解决方法: 1&…

航拍房屋检测系统源码分享

航拍房屋检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

基于stm32物联网身体健康检测系统

在当今社会&#xff0c;由于经济的发展带来了人们生活水平不断提高&#xff0c;但是人们的健康问题却越来越突出了&#xff0c;各种各样的亚健康随处可在&#xff0c;失眠、抑郁、焦虑症&#xff0c;高血压、高血糖等等侵袭着人们的健康&#xff0c;人们对健康的关注达到了一个…

职业发展如何进入人工智能领域

基础知识和技能 进入人工智能领域需要学习一系列的基础知识和技能&#xff0c;以下是一些关键的步骤和领域&#xff1a; 基础数学知识&#xff1a;人工智能领域涉及到大量的数学概念&#xff0c;包括线性代数、概率论、统计学和微积分。这些数学工具对于理解和设计算法至关重要…

Java流程控制语句——跳转语句详解:break 与 continue 有什么区别?

&#x1f310;在Java编程中&#xff0c;break和continue是两个重要的控制流语句&#xff0c;它们允许开发者根据特定条件改变程序的执行流程。虽然两者都用于中断当前的行为&#xff0c;但它们的作用方式不同。本文将通过生动的例子来详细解释这两个语句&#xff0c;并使用流程…

[Redis][Set]详细讲解

目录 0.前言1.常用命令1.SADD2.SMEMBERS3.SISMEMBER4.SCARD5.SPOP6.SMOVE7.SREM 2.集合间操作0.是什么&#xff1f;1.SINTER2.SINTERSTORE3.SUNION4.SUNIONSTORE5.SDIFF6.SDIFFSTORE 3.内部编码1.intset(整数集合)2.hashtable(哈希表) 4.使用场景 0.前言 集合类型也是保存多个字…

SpringBoot 整合 Caffeine 实现本地缓存

目录 1、Caffeine 简介1.1、Caffeine 简介1.2、对比 Guava cache 的性能主要优化项1.3、常见的缓存淘汰算法1.4、SpringBoot 集成 Caffeine 两种方式 2、SpringBoot 集成 Caffeine 方式一2.1、缓存加载策略2.1.1、手动加载2.1.2、自动加载【Loading Cache】2.1.3、异步加载【As…