深入了解LayoutLM:文档理解的强大工具
📖阅读时长:15分钟
🕙发布时间:2025-02-09
近日热文:全网最全的神经网络数学原理(代码和公式)直观解释
欢迎关注知乎和公众号的专栏内容
LLM架构专栏
知乎LLM专栏
知乎【柏企】
公众号【柏企科技说】【柏企阅文】
LayoutLM是微软开发的一款预训练模型,它能够从文本和图像输入中生成布局特征。该模型专为文档分析、图像字幕生成以及视觉问答等任务而设计。它通过利用文本和图像数据来理解文档的布局与内容,在各类文档人工智能应用中发挥着重要作用。
LayoutLM有多个版本,其中包括LayoutLMv2和LayoutLMv3。以LayoutLMv3为例,它采用补丁嵌入替代了CNN骨干网络,从而简化了架构,并基于掩码语言建模、掩码图像建模和字补丁对齐这三个目标进行预训练。
LayoutLM的架构
LayoutLM整合了文本和布局信息,以此来理解文档的内容与结构。下面详细介绍其不同版本的架构:
LayoutLMv1
- 文本嵌入:运用基于BERT的模型进行文本嵌入,能够捕捉文本的语义含义。
- 空间嵌入:添加空间嵌入,用于表示文档中每个标记的位置和大小。
- 标记嵌入:将文本和空间嵌入相结合,为每个标记创建统一的表示形式。
LayoutLMv2
- 文本嵌入:与v1类似,使用基于BERT的文本嵌入。
- 图像嵌入:整合了ResNet,用于从文档图像中提取视觉特征。
- 空间注意力:引入空间注意力机制,能更好地捕捉文本和布局之间的关系。
- 多模态融合:将文本、图像和空间信息相融合,实现对文档的全面理解 。
LayoutLMv3
- Patch Embeddings:用补丁嵌入替换了CNN骨干网络,类似于Vision Transformers。
三个训练前目标:
- 掩码语言建模(MLM):预测文本中的掩码标记。
- 掩码图像建模(MIM):预测图像中的掩码区域。
- 字面对齐(WPA):将文本标记与相应的图像面块对齐。
训练过程
LayoutLM在包含文档图像及其对应文本的大型数据集上进行预训练,其训练过程包含以下环节:
预训练
该模型在多种文档上进行预训练,涵盖发票、收据、表单以及其他各类文档。这有助于模型学习不同文档类型的通用结构和布局。
微调
针对特定任务,预训练模型会在任务特定的数据集上进行微调。具体做法是在与任务相关的标记数据上进一步训练模型,例如发票处理或表单识别任务。
优势
多模态功能
LayoutLM能够处理文本和图像数据,使其可以理解和分析文档的结构与布局。这种多模态能力让它超越了传统的纯文本模型。
在多样化数据上进行预训练
模型在庞大且多样化的数据集上进行预训练,这使得它在多种文档类型和任务中都有出色表现,包括发票处理、收据解析和表单识别等。
改进的OCR
通过利用布局信息,LayoutLM增强了光学字符识别(OCR)系统,进而实现更精准的文本提取和上下文理解。
多功能性
它可广泛应用于诸多领域,如文档分类、表格提取、内容组织以及视觉问答等,是文档AI任务的得力工具。
最先进的性能
LayoutLM在众多基准数据集上都达到了顶尖性能,充分证明了其在理解和处理文档布局方面的有效性。
局限性
资源密集型
训练和微调LayoutLM模型需要大量的计算资源,对强大的GPU和大量内存有较高要求。
复杂性
模型架构较为复杂,对于初学者来说,理解和有效实施具有一定难度,新用户可能需要花费较多时间学习。
数据依赖性
LayoutLM的性能在很大程度上依赖于训练数据的质量和多样性。若训练数据未能涵盖广泛的文档类型和布局,模型在处理不太常见的文档格式时可能会遇到困难。
预处理要求
对输入数据进行适当的预处理至关重要,比如将文档转换为合适的格式,并确保图像质量较高,这样才能使LayoutLM取得最佳效果。
域特异性
虽然LayoutLM在一般文档理解任务中表现良好,但针对特定领域的应用,可能还需要额外的微调和定制,这一过程既耗时又耗费资源。
LayoutLM的用例
LayoutLM用途广泛,在文档理解和分析领域应用众多。下面介绍一些典型用例:
发票处理
LayoutLM能够从扫描的发票中提取诸如发票编号、日期和金额等信息,实现发票流程的自动化,减少人为错误。
from transformers import LayoutLMv2ForTokenClassification, LayoutLMv2Processor
from PIL import Image
model = LayoutLMv2ForTokenClassification.from_pretrained("microsoft/layoutlmv2-base-uncased")
processor = LayoutLMv2Processor.from_pretrained("microsoft/layoutlmv2-base-uncased")
image = Image.open("invoice.png")
encoding = processor(image, return_tensors="pt")
outputs = model(**encoding)
predictions = outputs.logits.argmax(-1).squeeze().tolist()
tokens = processor.tokenizer.convert_ids_to_tokens(encoding['input_ids'].squeeze().tolist())
results = [(token, prediction) for token, prediction in zip(tokens, predictions)]
print(results)
收据解析
此应用涉及从收据中提取详细信息,如明细列表、价格和总计等,这些信息对费用跟踪和管理很有帮助。
from transformers import LayoutLMForTokenClassification, LayoutLMTokenizer
from PIL import Image
model = LayoutLMForTokenClassification.from_pretrained("microsoft/layoutlm-base-uncased")
tokenizer = LayoutLMTokenizer.from_pretrained("microsoft/layoutlm-base-uncased")
image = Image.open("receipt.jpg")
encoding = tokenizer(image, return_tensors="pt")
outputs = model(**encoding)
predictions = outputs.logits.argmax(-1).squeeze().tolist()
tokens = tokenizer.convert_ids_to_tokens(encoding['input_ids'].squeeze().tolist())
results = [(token, prediction) for token, prediction in zip(tokens, predictions)]
print(results)
表单识别
LayoutLM有助于从各类表单(如税表、调查问卷和申请表)中识别和提取信息,简化数据输入流程。
from transformers import LayoutLMv3ForTokenClassification, LayoutLMv3Processor
from PIL import Image
model = LayoutLMv3ForTokenClassification.from_pretrained("microsoft/layoutlmv3-base")
processor = LayoutLMv3Processor.from_pretrained("microsoft/layoutlmv3-base")
image = Image.open("form.pdf")
encoding = processor(image, return_tensors="pt")
outputs = model(**encoding)
predictions = outputs.logits.argmax(-1).squeeze().tolist()
tokens = processor.tokenizer.convert_ids_to_tokens(encoding['input_ids'].squeeze().tolist())
results = [(token, prediction) for token, prediction in zip(tokens, predictions)]
print(results)
文档分类
此用例是根据文档的内容和布局对不同类型的文档进行分类,例如区分发票和合同,或者识别特定类型的法律文档。
from transformers import LayoutLMForSequenceClassification, LayoutLMTokenizer
from PIL import Image
model = LayoutLMForSequenceClassification.from_pretrained("microsoft/layoutlm-base-uncased")
tokenizer = LayoutLMTokenizer.from_pretrained("microsoft/layoutlm-base-uncased")
image = Image.open("document.pdf")
encoding = tokenizer(image, return_tensors="pt")
outputs = model(**encoding)
predictions = outputs.logits.argmax(-1).squeeze().tolist()
labels = ["Invoice", "Contract", "Legal Document"]
result = labels[predictions[0]]
print(result)
表格提取
LayoutLM可以从文档中提取并处理表格,这在财务报告、研究论文和其他结构化文档中尤为实用。
from transformers import LayoutLMv3ForTokenClassification, LayoutLMv3Processor
from PIL import Image
model = LayoutLMv3ForTokenClassification.from_pretrained("microsoft/layoutlmv3-large")
processor = LayoutLMv3Processor.from_pretrained("microsoft/layoutlmv3-large")
image = Image.open("table.jpg")
encoding = processor(image, return_tensors="pt")
outputs = model(**encoding)
predictions = outputs.logits.argmax(-1).squeeze().tolist()
tokens = processor.tokenizer.convert_ids_to_tokens(encoding['input_ids'].squeeze().tolist())
results = [(token, prediction) for token, prediction in zip(tokens, predictions)]
print(results)
视觉问答
该用例是依据文档的视觉和文本内容回答问题,以此提升辅助功能和用户交互体验。
from transformers import LayoutLMv3ForQuestionAnswering, LayoutLMv3Processor
from PIL import Image
model = LayoutLMv3ForQuestionAnswering.from_pretrained("microsoft/layoutlmv3-large")
processor = LayoutLMv3Processor.from_pretrained("microsoft/layoutlmv3-large")
image = Image.open("document_with_question.jpg")
question = "What is the total amount?"
encoding = processor(image, question, return_tensors="pt")
outputs = model(**encoding)
answer_start = outputs.start_logits.argmax(-1).squeeze().item()
answer_end = outputs.end_logits.argmax(-1).squeeze().item() + 1
tokens = processor.tokenizer.convert_ids_to_tokens(encoding['input_ids'].squeeze().tolist())
answer = tokens[answer_start:answer_end]
print(answer)
内容组织
LayoutLM通过识别关键元素并进行相应排序,帮助组织和存档文档,便于管理大量文档。
from transformers import LayoutLMForTokenClassification, LayoutLMProcessor
from PIL import Image
model = LayoutLMForTokenClassification.from_pretrained("microsoft/layoutlm-large")
processor = LayoutLMProcessor.from_pretrained("microsoft/layoutlm-large")
image = Image.open("archive_document.jpg")
encoding = processor(image, return_tensors="pt")
outputs = model(**encoding)
predictions = outputs.logits.argmax(-1).squeeze().tolist()
tokens = processor.tokenizer.convert_ids_to_tokens(encoding['input_ids'].squeeze().tolist())
results = [(token, prediction) for token, prediction in zip(tokens, predictions)]
print(results)
OCR增强
LayoutLM利用布局信息提升光学字符识别(OCR)系统的准确性和上下文理解能力,从而获得更优的文本提取效果。
from transformers import LayoutLMv3ForTokenClassification, LayoutLMv3Processor
from PIL import Image
model = LayoutLMv3ForTokenClassification.from_pretrained("microsoft/layoutlmv3-base")
processor = LayoutLMv3Processor.from_pretrained("microsoft/layoutlmv3-base")
image = Image.open("ocr_document.jpg")
encoding = processor(image, return_tensors="pt")
outputs = model(**encoding)
predictions = outputs.logits.argmax(-1).squeeze().tolist()
tokens = processor.tokenizer.convert_ids_to_tokens(encoding['input_ids'].squeeze().tolist())
results = [(token, prediction) for token, prediction in zip(tokens, predictions)]
print(results)
实际应用
LayoutLM在多个行业中被用于自动化和优化与文档相关的任务:
- 金融:实现发票处理、费用跟踪和财务报告的自动化。
- 医疗保健:从医疗表格、患者记录和保险索赔中提取信息。
- 法律:分析和分类法律文档、合同及协议。
- 零售:解析收据和发票,改善库存管理和费用跟踪。
- 政府:处理税表、调查问卷和申请,提高效率和准确性 。
未来方向
- 与Vision Models集成:通过集成Vision Transformers等先进视觉模型,提升视觉理解能力。
- OCR独立性:开发不依赖外部OCR系统的端到端模型。
- 实时功能:优化模型,使其在实时场景中能够更快地进行推理。
- 跨语言功能:在多语言文档处理中,扩展对多种语言的支持。
- 特定于域的微调:为医疗保健、法律或金融等特定领域创建预训练版本。
结论
LayoutLM将文本、布局和视觉特征整合到统一框架中,是文档理解领域的重大进展。这种多模态能力使其在处理表单、发票和复杂文档结构等任务时表现卓越,因为在这些任务中,理解元素之间的空间和上下文关系至关重要。借助预训练变换器的优势,结合布局和视觉嵌入,LayoutLM不仅取得了领先的性能,还为跨行业的文档密集型工作流程自动化开辟了新途径。尽管面临计算需求高和依赖OCR质量等挑战,但随着不断创新,LayoutLM正逐步克服这些限制。它在金融、医疗保健、法律和公共管理等领域的实际应用效果显著,提高了生产力、准确性和效率。对LayoutLM的持续研究和优化凸显了其在推动文档AI发展中的关键作用,为数字时代更智能、更自动化的解决方案奠定了基础。
## 推荐阅读
1. DeepSeek-R1的顿悟时刻是如何出现的? 背后的数学原理
2. 微调 DeepSeek LLM:使用监督微调(SFT)与 Hugging Face 数据
3. 使用 DeepSeek-R1 等推理模型将 RAG 转换为 RAT
4. DeepSeek R1:了解GRPO和多阶段训练
5. 深度探索:DeepSeek-R1 如何从零开始训练
6. DeepSeek 发布 Janus Pro 7B 多模态模型,免费又强大!
本文由mdnice多平台发布
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。