【文档智能】符合人类阅读顺序的文档模型-LayoutReader原理及权重开源

引言

阅读顺序检测旨在捕获人类读者能够自然理解的单词序列。现有的OCR引擎通常按照从上到下、从左到右的方式排列识别到的文本行,但这并不适用于某些文档类型,如多栏模板、表格等。LayoutReader模型使用seq2seq模型捕获文本和布局信息,用于阅读顺序预测,在实验中表现出色,并显著提高了开源和商业OCR引擎在文本行排序方面的表现。

一、LayoutReader模型

1.1 编码器(Encoder)

LayoutReader使用LayoutLM的布局模型作为编码器。在编码阶段,LayoutReader将源序列和目标序列打包成一个连续的输入序列,并设计了自注意力掩码来控制token之间的可见性。具体来说,LayoutReader允许源序列中的标记相互关注,同时阻止目标序列中的标记关注右侧上下文。

自注意力掩码 M M M的设计:
M i , j = { 1 if  i < j  or  i , j ∈ src 0 otherwise M_{i,j} = \begin{cases} 1 & \text{if } i < j \text{ or } i, j \in \text{src} \\ 0 & \text{otherwise} \end{cases} Mi,j={10if i<j or i,jsrcotherwise
其中, i i i j j j是打包输入序列中的索引,可能来自源或目标序列; i , j ∈ s r c i, j ∈ src i,jsrc表示两个标记都来自源序列。

1.2 解码器(Decoder)

在解码阶段,由于源序列和目标序列是重新排序的序列,预测候选可以被限制在源序列内。因此,模型被要求预测源序列中的索引。概率计算如下:

其中, i i i是源序列中的索引;$e_i 和 和 e_j 分别是源序列的第 分别是源序列的第 分别是源序列的第i 个和第 个和第 个和第j 个输入嵌入 ( i n p u t e m b e d d i n g s ) ; 个输入嵌入(input embeddings); 个输入嵌入(inputembeddings)h_k 是第 是第 是第k 步的隐藏状态 ( h i d d e n s t a t e s ) ; 步的隐藏状态(hidden states); 步的隐藏状态(hiddenstates)b_k 是第 是第 是第k$步的偏置(bias)。

二、实验

进行了三个实验来评估LayoutReader在ReadingBank上的表现,包括阅读顺序检测、输入顺序研究和对OCR引擎的适应性

实验结果表明,LayoutReader在阅读顺序检测任务上超越了其他基线方法,并且可以显著提高OCR引擎的文本行排序。

三、非官方开源权重

  • huggingface:https://huggingface.co/yujunhuinlp/LayoutReader-only-layout-large

  • github code(only layout):https://github.com/yujunhuics/LayoutReader

  • bbox排序

    import torch
    from model import LayoutLMv3ForBboxClassification
    from collections import defaultdict
    
    CLS_TOKEN_ID = 0
    UNK_TOKEN_ID = 3
    EOS_TOKEN_ID = 2
    
    
    def BboxesMasks(boxes):
        bbox = [[0, 0, 0, 0]] + boxes + [[0, 0, 0, 0]]
        input_ids = [CLS_TOKEN_ID] + [UNK_TOKEN_ID] * len(boxes) + [EOS_TOKEN_ID]
        attention_mask = [1] + [1] * len(boxes) + [1]
        return {
            "bbox": torch.tensor([bbox]),
            "attention_mask": torch.tensor([attention_mask]),
            "input_ids": torch.tensor([input_ids]),
        }
    
    
    def decode(logits, length):
        logits = logits[1: length + 1, :length]
        orders = logits.argsort(descending=False).tolist()
        ret = [o.pop() for o in orders]
        while True:
            order_to_idxes = defaultdict(list)
            for idx, order in enumerate(ret):
                order_to_idxes[order].append(idx)
            order_to_idxes = {k: v for k, v in order_to_idxes.items() if len(v) > 1}
            if not order_to_idxes:
                break
            for order, idxes in order_to_idxes.items():
                idxes_to_logit = {}
                for idx in idxes:
                    idxes_to_logit[idx] = logits[idx, order]
                idxes_to_logit = sorted(
                    idxes_to_logit.items(), key=lambda x: x[1], reverse=True
                )
                for idx, _ in idxes_to_logit[1:]:
                    ret[idx] = orders[idx].pop()
        return ret
    
    
    def layoutreader(bboxes):
        inputs = BboxesMasks(bboxes)
        logits = model(**inputs).logits.cpu().squeeze(0)
        orders = decode(logits, len(bboxes))
        return orders
    
    
    if __name__ == '__main__':
        bboxes = [[584, 0, 595, 1], [35, 120, 89, 133],
                  [35, 140, 75, 152]]
        model_path = ""
        model = LayoutLMv3ForBboxClassification.from_pretrained()
    
        print(layoutreader(bboxes))
    # [1, 2, 0]
    
  • 效果样例

参考文献

  • paper:LayoutReader: Pre-training of Text and Layout for Reading Order Detection,https://arxiv.org/pdf/2108.11591
  • Official code:https://github.com/microsoft/unilm/tree/master/layoutreader

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

libcef.dll丢失的解决方法-多种libcef.dll亲测有效解决方法分享

libcef.dll是Chromium Embedded Framework (CEF)的核心动态链接库&#xff0c;它为开发者提供了一个将Chromium浏览器嵌入到本地桌面应用程序中的解决方案。这个库使得开发者能够利用Chromium的强大功能&#xff0c;如HTML5、CSS3、JavaScript等&#xff0c;来创建跨平台的应用…

Llama(一):Mac M1芯片运行Llama3

目录 安装Ollama for Mac 下载Llama 3模型 运行Llama3 试用Llama3 在命令行中使用Llama3 背景 本地环境&#xff1a;Mac M1,16GB内存 安装Ollama for Mac 官方地址 https://ollama.com/download/Ollama-darwin.zip 链接: 百度网盘 提取码: 8wqx 下载Llama 3模型 oll…

jmeter性能优化之tomcat配置与基础调优

一、 修改tomcat初始和最大堆内存 进入到/usr/local/tomcat7-8083/bin目录下&#xff0c;编辑catalina.sh文件&#xff0c;&#xff0c;默认堆内存是600m&#xff0c;初始堆内存和最大堆内存保持一致&#xff0c; 可以更改到本机内存的70%&#xff0c;对于Linux系统&#xff0…

《平渊》· 柒 —— 大道至简?真传一句话,假传万卷书!

《平渊》 柒 "真传一句话, 假传万卷书" 对于 "大道至简"&#xff0c;不少专家可能会说出一大堆乱七八糟的名词, 比如这样&#xff1a; 所谓 "大道" 即支撑天地运转的 "系统自动力"&#xff0c;更具体地来说&#xff0c;即是天地人以…

前端Vue小兔鲜儿电商项目实战Day07

一、会员中心 - 整体功能梳理和路由配置 1. 整体功能梳理 ①个人中心 - 个人信息和猜你喜欢数据渲染②我的订单 - 各种状态下的订单列表展示 2. 路由配置&#xff08;包括三级路由配置&#xff09; ①准备个人中心模板组件 - src/views/Member/index.vue <script setup&g…

【Leetcode 705 】设计哈希集合——数组嵌套链表(限制哈希Key)

题目 不使用任何内建的哈希表库设计一个哈希集合&#xff08;HashSet&#xff09;。 实现 MyHashSet 类&#xff1a; void add(key) 向哈希集合中插入值 key 。bool contains(key) 返回哈希集合中是否存在这个值 key 。void remove(key) 将给定值 key 从哈希集合中删除。如果…

构建智慧银行保险系统的先进技术架构

随着科技的不断发展&#xff0c;智慧银行保险系统正日益受到关注。在这个数字化时代&#xff0c;构建一个先进的技术架构对于智慧银行保险系统至关重要。本文将探讨如何构建智慧银行保险系统的先进技术架构&#xff0c;以提升服务效率、降低风险并满足客户需求。 ### 1. 智慧银…

德克萨斯大学奥斯汀分校自然语言处理硕士课程汉化版(第五周) - Transformer

Transformer 1. 注意力机制 在语言建模中&#xff0c;注意力(attention)是一个关键机制&#xff0c;用于在给定上下文中访问相关信息以进行预测。注意力机制允许模型根据输入上下文中的重要信息来加权关注不同的部分&#xff0c;并根据其重要性来决定对不同部分的关注程度。 …

短视频毫无营养:四川京之华锦信息技术公司

短视频毫无营养&#xff1a;现象背后的深度剖析 在数字时代&#xff0c;短视频以其短小精悍、易于传播的特点迅速崛起&#xff0c;成为社交媒体上的热门内容。然而&#xff0c;随着短视频的泛滥&#xff0c;关于其内容质量参差不齐、缺乏营养价值的争议也日益加剧。四川京之华…

【代码随想录训练营】【Day 37】【贪心-4】| Leetcode 840, 406, 452

【代码随想录训练营】【Day 37】【贪心-4】| Leetcode 840, 406, 452 需强化知识点 python list sort的高阶用法&#xff0c;两个key&#xff0c;另一种逆序写法python list insert的用法 题目 860. 柠檬水找零 思路&#xff1a;注意 20 块找零&#xff0c;可以找3张5块升…

jpeg压缩算法学习(1)——离散余弦变换

离散余弦变换是jpeg压缩算法的关键步骤 思想 离散余弦变换的基本原理是&#xff1a;每一组离散的数据都可以由一组不同频率的余弦波来表示。 应用于图片上就是&#xff1a;将像素值转换为不同频率的余弦函数的系数&#xff08;权重&#xff09; 像素值——>权重 一维离…

52.WEB渗透测试-信息收集-CDN识别绕过(5)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;51.WEB渗透测试-信息收集-CDN识别绕过&#xff08;4&#xff09; 端口扫描其他内容参考&…

在 GPU 上实现全规模文件系统加速

摘要 现代高性能计算和人工智能计算解决方案经常使用 GPU 作为其主要计算能力来源。这就为 GPU 应用程序的存储操作造成了严重的不平衡&#xff0c;因为每一个此类存储操作都必须向 CPU 发出信号并由 CPU 处理。在 GPU4FS 中&#xff0c;我们针对这种不平衡提出了一个彻底的解决…

11. RBAC权限管理从零到一实现(二)

前端页面已提交至git https://github.com/SJshenjian/cloud-web默认用户名密码admin 1

18 跨团队 没有汇报线的人和事就是推不动?

在“05 | 大项目&#xff1a;把握关键点&#xff0c;谋定而后动”和“11 | 勤沟通&#xff1a;在信任的基础上&#xff0c;让沟通简单”两讲中&#xff0c;我提过“跨团队”这件事&#xff0c;很多同学带团队之后&#xff0c;无法回避的一个问题就是“跨团队协作”&#xff0c;…

SSM与Mamba模型学习

transformer的缺陷 自注意力机制的计算范围只限于窗口内&#xff0c;不能直接处理窗口外的元素&#xff0c;不能照顾到整个序列。 由于计算复杂度随着窗口的长度呈几何平方式增长&#xff0c;所以不能一味地增加窗口长度来解决。 Transformer本质上是通过位置编码将序列数据空…

【自然语言处理】【Scaling Law】Observational Scaling Laws:跨不同模型构建Scaling Law

相关博客 【自然语言处理】【Scaling Law】Observational Scaling Laws&#xff1a;跨不同模型构建Scaling Law 【自然语言处理】【Scaling Law】语言模型物理学 第3.3部分&#xff1a;知识容量Scaling Laws 【自然语言处理】Transformer中的一种线性特征 【自然语言处理】【大…

关于苹果发布IOS18系统,以及Siri升级贾维斯

随着科技的不断进步&#xff0c;手机操作系统也在持续升级&#xff0c;为用户提供更加智能化、便捷化的体验。近期&#xff0c;苹果公司即将推出的iOS 18系统引起了广泛关注。作为iPhone历史上的重大更新&#xff0c;iOS 18系统带来了众多新功能&#xff0c;将进一步提升iPhone…

美国科技股为何突然崩了?

英伟达毛利率那么高&#xff0c;谁来“买单”&#xff1f;高盛认为&#xff0c;投资AI的成本巨大&#xff0c;引发了市场对科技股盈利能力和估值合理性的担忧。软件股今年以来的疲态&#xff0c;可能也反映了投资者对AI的担忧。 直到最近还势不可挡的科技股突然崩塌。 隔夜美…

Java基础知识点(标识符、数据类型、变量、运算符、包机制、流程控制、方法、数组)

文章目录 标识符数据类型强弱类型语言数据类型基础类型 类型转换 常量与变量变量的定义变量作用域变量命名规范常量 运算符包机制流程控制选择结构循环结构 方法&#xff08;Method&#xff09;数组概述申明创建java.util.Arrays类 标识符 Java标识符的命名规则如下&#xff1…