ernie-layout笔记

文章介绍了使用OCR技术和Document-Layout解析方法来处理复杂文档结构,通过Layot-Parser工具识别段落、列表、表格和图像。关键点包括TextEmbedding、VisualEmbedding和LayoutEmbedding,尤其是利用DeBERTa模型处理相对位置信息。此外,提到了数据标注需求,包括图像、宽度、高度和特定内容标签。

1: 识别文档中文字以及准确的对这些文字排序是必须的一步骤

     采用 OCR技术识别文字以及对应的图像坐标信息,光栅扫描以生成输入序列按照从左到右,从上到下的顺序;但是以上方法针对复杂的结构就会出现问题;因此文章使用了Document-Parase方法来解析文档使用的是Layot-Parser工具箱:

···https://github.com/Layout-Parser/layout-parser

基于OCR识别的文字以及对应的坐标,first 识别文档的元素(paragraphs,lists,tables,fugures)然后使用特殊的算法识别所在不同文档元素的字符之间的逻辑关系,从而获得准确的阅读顺序;

   Text Embedding.:与正常的bert输入一致不再叙述

   

 Visual Embedding:

       不仔细深究,其实也比较简单,就是把图像resize到224 通过Faseter-Rcnn转化为一个feature-map特征=[W,H,256],实际代码可以使用resnet模型替代,实际代码W==H=7,最终通过flatten以及映射层转化为与text相同维度,然后增加一维positon以及token type embedding

position  embedding就是模型最终输出的feature-map(7*7)对应的位置信息,源代码细看

 Layout Embedding. 

       这是本篇的核心之一,对于每一个字符 增加其对应得坐标信息,转化为对应的embedding加入到字符特征中去,坐标全部转到【0,1000】中去;这个容易理解,但目前有疑问不懂得是visual对应的bbox信息获取,令人费解,谁懂可以在评论告诉我,谢谢;

具体实现如下步骤:

          

首先以1000为间隔,获取image_feature_pool_shape[1]=7个数列表,

tmp= [0   , 1000, 2000, 3000, 4000, 5000, 6000, 7000]然偶整除获得7的倍数获得结果为:

[0   , 142 , 285 , 428 , 571 , 714 , 857 , 1000]从结果来看,7个x坐标恰巧落在0--1000范围内,所以猜测这样缩放feature-map 7*7 坐标到0-1000范围内,与字符坐标对应。同理visual_bbox_y的取值范围为[0   , 142 , 285 , 428 , 571 , 714 , 857 , 1000],最终通过各种变换把7*7的feature-map坐标映射到0-1000范围内visual_bbox.shape=[2, 49, 4],而 4个数值分别表示每一个feature-map的左上角坐标以及右下角的坐标,为了通俗易懂,举例:first 的feature-map 坐标为 [0  , 0  , 142, 142] ,第二个feature-map坐标为[142, 0  , 285, 142],我们画图来表示这两个位置,大家就理解了

由于我对图像方面相对较弱所以讲解稍微详细写便于理解,正好与所生成的坐标一致,说明理解是正确的。

然后分别把对应的两个坐标信息以及对应的宽高转化为embedding,具体的作者是分别水平的和垂直的信息分别embedding然后相加的

具体代码实现分别把所有整型坐标信息映射为hidden-size的embedding 

embeddings = visual_embeddings + position_embeddings + x1 + y1 + x2 + y2 + w + h

得到最终的embedding信息;然后把visual的embedding拼接到每一个token对应的embeddeding信息中

 

对应的代码为 final_emb = paddle.concat([text_layout_emb, visual_emb], axis=1)

Multi-modal Transformer、

    本次模型使用了DeBERTa的相对距离算法,具体的一维为例:

也就是在2k范围内有效,具体的在坐标表示为:

 我们引入三个相对position 的embedding表分别表示1Dposition和2D x轴y轴的position,然后映射为相对位置的voctor在处理attention计算时,把原始的attention的权重分离为4个部分,包含了1D/2D和content特征:

 对应的权重scores获取表示为:

 具体实现:

  rel_pos_mat = position_ids.unsqueeze(-2) - position_ids.unsqueeze(-1)首先形成相对位置矩阵

relative_position_bucket函数实现起来相对复杂,但是最终实现的结果为公式5,所以可以直接使用函数实现,而不需要知道怎么实现。最终获取相对位置的权重信息,shape-=【batch_size,num_heads,seq_len,seq_len】,相对来说论文模型结构比较不错,很好的融合了文档图像信息。

其中相对位置的矩阵获取函数

def relative_position_bucket(relative_position,
                             bidirectional=True,
                             num_buckets=32,
                             max_distance=128):

具体实现说实话有点费解,但最终结果为:

Tensor(shape=[561, 561], dtype=int64, place=Place(gpu:0), stop_gradient=True,
       [[0 , 17, 18, ..., 29, 29, 29],
        [1 , 0 , 17, ..., 28, 29, 29],
        [2 , 1 , 0 , ..., 28, 28, 29],
        ...,
        [13, 12, 12, ..., 0 , 17, 18],
        [13, 13, 12, ..., 1 , 0 , 17],
        [13, 13, 13, ..., 2 , 1 , 0 ]])

从结果来看符合

的规则,因此不再研究具体实现了,反正就是得到相对位置的ids矩阵。由于该实现代码最大相对位置self.rel_pos_bias=32,下一步映射为相对位置的权重,设置了一个可学习的参数self.rel_pos_bias,同理获得字符图片坐标的相对位置权重对应论文中的,其中rel_2d_pos为对应 二位图像坐标的相对坐标位置的权重,与rel_pos的shape相同。这两个输出最终参与attention的操作,具体与论文的公式对应

对应代码为:


if self.has_relative_attention_bias:
    attention_scores += rel_pos
if self.has_spatial_attention_bias:
    attention_scores += rel_2d_pos

 最终获取到每一个字符对应的类别预测,与正常的实体识别操作一致,不再赘述。

总结:

     如果需要训练我们自己的数据,那么数据形式和需要哪些数据如下:

    由于超参设定的overwrite_cache=False,所以每次运行需要把/root/.cache/huggingface/datasets/xfund_zh/xfund_zh/1.0.0/605be507733d039d6d0f638e56c7dd4e6ae1b8aad9a52a7ead77ab6cff743bf7路径下的cache文件删除。

image:        整个文档的图片,shape=[3, 224, 224],是图片整个缩放归一化的图片大小;
["width"]:   原始图像的宽 
["height"]“: 原始图像的高
对应的question:
              ['QUESTION', 'ANSWER', 'HEADER'] 表示对应文档中内容的标签,例如那些字符是QUESTION,QUESTION的含义就是文档中key的位置,例如,身份证:410.....,question就是”身份证“,
 其中每一个标签包含的内容为:
    answer_end :文本内容在ocr识别内容的结束位置
    answer_start
    text  :ocr识别内容

我们只需要标注以上内容即可,其实际需要人标注的就是
             ['QUESTION', 'ANSWER', 'HEADER']

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值