表格解析算法——PaddlePaddle之RARE
百度paddlepaddle
paddleocr下pp-structure包含了版面分析及表格解析两项工作,本文是对表格解析的技术详述。
代码:
https://github.com/PaddlePaddle/PaddleOCR
简要概览:
PaddleOCR新发版v2.2:开源版面分析与轻量化表格识别_飞桨PaddlePaddle的博客-CSDN博客
RARE
百度paddlepaddle包含表格解析功能,被称为RERE算法。RARE算法原本用于进行文本识别,是一个img2seq任务,修改该网络head部分,分成表格描述和单元格定位两个任务,这两个任务共享了backbone的输出及head中一部分attention信息。“图片由表格结构和cell坐标预测模型拿到表格的结构信息和单元格的坐标信息”,最后输出表格的HTML描述。
一个完整的表格解析工程需要用到四个模型:版面分析模型、文本定位模型、文本识别模型、表格结构解析模型。
版面分析模型:飞桨用到了yolov2检测模型,对文档图片中的文本、表格、图片、标题与列表区域进行检测。当前主流是用分割做。
文本定位模型、文本识别模型:可使用其他定位识别模型。
表格结构解析模型:该技术的精髓所在。
如何进行训练:
python3 tools/train.py -c configs/table/table_mv3.yml
所有的模型训练都会用到这个train文件,可以视为一个主分支,根据配置文件调用不同的次分支。
# 统一化的处理配置、创建文件夹等
config, device, logger, vdl_writer = program.preprocess(is_train=True)
# 加载数据集、后处理、搭建模型、损失、优化器、执行训练等
main(config, device, logger, vdl_writer)
如何进行推理:
python3 ppstructure/table/predict_table.py--det_model_dir=./inference/ch_PP-OCRv2_det_infer # 检测模型--rec_model_dir=./inference/ch_PP-OCRv2_rec_infer # 识别模型--table_model_dir=./inference/en_ppocr_mobile_v2.0_table_structure_infer # 表格结构识别模型--image_dir=./doc/imgs/163558403291484de11ac8c.jpg # 测试图片--rec_char_dict_path=./ppocr/utils/ppocr_keys_v1.txt # 识别词表,6623字符--table_char_dict_path=./ppocr/utils/dict/table_structure_dict.txt # 表格结构词表,实际只用其中28个表格描述符--det_limit_side_len=960 # 两个参数限制图像最短边为960,否则resize--det_limit_type=min--output ./output/table # 输出表格文件路径
推理中的det_limit_side_len与det_limit_type参数:
参数默认设置为`limit_type='max', det_limit_side_len=960`。表示网络输入图像的最长边不能超过960,如果超过这个值,会对图像做等宽比的resize操作,确保最长边为`det_limit_side_len`。
设置为`limit_type='min', det_limit_side_len=960` 则表示限制图像的最短边为960。
表格结构词表
table_structure_dict.txt 第0行是 277 28 1267 1186,第1行到277行为表格内字符,实际未用到,第278行开始28个为表格结构字符。限制了这个可解析表格的大小空间跨行跨列最大为10,没有跨1行或跨1列的字符。
词表中有28种表格结构符,模型为30分类,在分类中argmax=1,为<thead>,argmax=0、29 代表beg、end。
<thead>
<tr>
<td> 单元格开始
</td> 单元格结束
</tr>
</thead>
<tbody>
</tbody>
<td
colspan="5". # 横跨5列
>
colspan="2"
colspan="3"
rowspan="2"。 # 横跨2行
colspan="4"
colspan="6"
rowspan="3"
colspan="9"
colspan="10"
colspan="7"
rowspan="4"
rowspan="5"
rowspan="9"
colspan="8"
rowspan="8"
rowspan="6"
rowspan="7"
rowspan="10"
不包含的html描述:
<b>加粗文本
模型的结构
main函数调用build_model调用BaseModel,先后进行输入预处理(表格解析没有做这步)、backbone、neck(表格解析没有这一步)、head、输出
paddleocr/PaddleOCR-release-2.4/ppocr/modeling/architectures/__init__.py 调用BaseModel
配置文件模型参数为:
Architecture:model_type: tablealgorithm: TableAttnBackbone:name: MobileNetV3scale: 1.0model_name: largeHead:name: TableAttentionHeadhidden_size: 256l2_decay: 0.00001loc_type: 2max_text_length: 100max_elem_length: 800max_cell_num: 500
很多paper中经常把一个网络分为几个部分组成backbone、head、neck等深度学习中的术语解释_t20134297的博客-CSDN博客_深度学习neck
backbone:主干网络,经常是resnet、vgg这种成熟有预训练模型的结构
neck:放在backbone和head间,提取更好的特征
head:预测
bottleneck:瓶颈,输出维度小于输入维度,用于降维
backbone内部结构
为了轻量化,build_backbone为mobilenetv3,参考性不大
PaddleOCR-release-2.4/ppocr/modeling/backbones/rec_mobilenet_v3.py
Attention内部结构
PaddleOCR-release-2.4/ppocr/modeling/heads/table_att_head.py
self.head.out_channels= TableAttentionHead(
(structure_attention_cell): AttentionGRUCell(
(i2h): Linear(in_features=960, out_features=256, dtype=float32)
(h2h): Linear(in_features=256, out_features=256, dtype=float32)
(score): Linear(in_features=256, out_features=1, dtype=float32)
(rnn): GRUCell(990, 256)
)
(structure_generator): Linear(in_features=256, out_features=30, dtype=float32)
(loc_fea_trans): Linear(in_features=256, out_features=801, dtype=float32)
(loc_generator): Linear(in_features=1216, out_features=4, dtype=float32)
)
获取结构信息
第一步切片获取Attention:
(outputs, hidden), alpha = self.structure_attention_cell(hidden, fea, elem_onehots)
第二步将Attention结果进行cat:
output = paddle.concat(output_hiddens, axis=1)
第三步线性层获取结构信息:
structure_probs = self.structure_generator(output)
structure_probs = F.softmax(structure_probs)
输出维度为801*30
获取定位信息,比获取结构信息多了线性层:
第一步基于线性层处理出入特征:
loc_fea = self.loc_fea_trans(loc_fea)
第二步cat上面的Attention获得的output信息:
loc_concat = paddle.concat([output, loc_fea], axis=2)
第三步线性层获取坐标信息:
loc_preds = self.loc_generator(loc_concat)
loc_preds = F.sigmoid(loc_preds)
输出维度为801*4
坐标聚合
定位框和cell的对应关系基于下方2个度量计算,一个cell内多个定位框的排序按照先来后到排,推测是默认从上到下。
compute_iou函数计算Iou,distance函数计算角点距离
distances.append((distance(gt_box, pred_box), 1. - compute_iou(gt_box, pred_box)))
html转xlsx文件
后处理阶段build_post_process——TableLabelDecode
from tablepyxl import tablepyxl # tablepyxl将html读入excel
tablepyxl.document_to_xl(html_table, excel_path)
评估方式
理论上是用树编辑距离,但从build_metric——TableMetric来看,需要完全一致
for bno in range(batch_size):all_num += 1if (structure_probs[bno] == structure_labels[bno]).all():correct_num += 1
损失
TableAttentionLoss由2部分组成
structure_loss :nn.CrossEntropyLoss
loc_loss:F.mse_loss 均方损失
可用loc_loss_giou:GIoU详解_景唯acr-CSDN博客_giou iou
损失权重:
structure_weight: 100.0
loc_weight: 10000.0
数据加载方式
main函数调用build_dataloader
加粗文本
在源码中,用识别模型的<b>及</b>,用的是识别模型的加粗文本识别能,但ch_PP-OCRv2_rec_infer并没有识别加粗文本的能力
HTML填充复原:
class TableSystem(object):
根据单元格开始字符所在的cell定位信息进行坐标聚合,从而进行文本聚合
if text in ['<td>', '<td']:
文本信息填充到单元格结束字符前
if '</td>' in tag:
表格解析算法——PaddlePaddle之RARE相关推荐
- 5分钟理解CFG上下文无关文法的解析算法
本文是5分钟理解CFG上下文无关文法的续集,在5分钟理解CFG上下文无关文法这篇文章中已经讲解了CFG的基本概念,但是CFG的解析算法才是核心.由于它的解析算法极其复杂,网上很少有文章能把解析算法用大 ...
- 发布一个网页智能解析算法库
之前我写过几篇文章介绍过有关爬虫的智能解析算法,包括商业化应用 Diffbot.Readability.Newspaper 这些库,另外我有一位朋友之前还专门针对新闻正文的提取算法 GeneralNe ...
- 微课|中学生可以这样学Python(8.1节):解析算法例题讲解
适用教材: 董付国,应根球.<中学生可以这样学Python>.清华大学出版社,2017. 第8章 常用算法的Python实现 8.1 解析算法案例分析 京东购买链接:https://i ...
- python 庖丁科技pdflux的表格解析(精度很高)
最近有个人叫我把印刷版的pdf解析一下,我试了腾讯,阿里,百度的方法,都不太行,后面发现创业公司庖丁科技对这方面优化得还可以,所以买了API,这里分享一下我的python实现. 官网为:PDFlux ...
- 常用算法——解析算法
解析算法,即解析法(analysis algorithm)是指用解析的方法找出表示问题的前提条件与结果之间关系的数学表达式,并通过表达式的计算来实现问题求解,其解题流程见图1. 图1 解析算法流程图 ...
- bert 中文 代码 谷歌_ACL 2020 | 用BERT解决表格问答任务,谷歌提出弱监督表格解析器TaPas...
BERT 在自然语言上已经取得了非凡的成就.近日,谷歌一篇 ACL 2020 论文又将 BERT 模型应用到了基于表格的问答场景中,为弱监督式的表格解析性能带来了显著提升.此外,谷歌开源了相关代码和预 ...
- 快速了解日志概貌,详细解读13种日志模式解析算法
云智慧 AIOps 社区是由云智慧发起,针对运维业务场景,提供算法.算力.数据集整体的服务体系及智能运维业务场景的解决方案交流社区.该社区致力于传播 AIOps 技术,旨在与各行业客户.用户.研究者和 ...
- 依存句法分析解析算法之Chu-LiuEdmonds
依存句法分析解析算法之Chu-Liu/Edmonds 之前一直在学习依存句法分析的学习算法,也编程实现了一点.不过,因为当时没有学习解析算法,所以在训练特征权重时没有拿预测的依存树和正确的依存树比较, ...
- 爱奇艺视频cmd5x解析算法的移植分析和实现Nodejs(2019-08)
目录 爱奇艺视频cmd5x解析算法的移植分析和实现(2019-08). 什么是cmd5x算法 说明 大概 分析过程 首先 方案 关于调试 如何使用chromium的开发者工具对本地导入的代码进行断点调 ...
最新文章
- MacBook如何用Parallels Desktop安装windows7/8
- php开发自学经典.pdf_PHP从入门到精通(第3版) PDF扫描版[45MB]
- (19)C++项目练习二----------【音乐播放器】
- update 两个表关联_你真的了解全量表,增量表及拉链表吗?
- 讲解泊松融合文章推荐
- (不误正业)鼓励做题的时间陷阱
- Kubernetes集群上的Apache Ignite和Spring第3部分:测试应用程序
- input发送a.jax_JAX-RS 2.0中的透明PATCH支持
- leetcode 1143. 最长公共子序列(dp)
- linux环境安装tomcat8,启动时,报not touch:/user/tomcat/tomcat8/logs/catalina.out:not a file or directory...
- 前端打印样式乱了_皮具大百科之皮料上的3D打印,连花的阴影都能完美复刻!超美工艺...
- vue-cli 搭建的项目处理不同环境下请求不同域名的问题
- Netbeans Platform的Lookup -- 边学边记
- H3C 模拟器 pc与sw直连 开启telnet
- 营销工作的七项核心能力
- Php计算圆柱的表面积和体积,圆柱体的面积计算公式
- 解析力評測(1) MTF和SFR
- 【数据库】select、from、where、group by、having、order by、limit的组合用法
- 前端开发:JS获取当前日期方法
- 如何解决 vue 初始化页面闪动问题