深入探索:AI 驱动的 PDF 布局检测引擎源代码解析 [译]

2023 年 12 月 10 日 • Shrijith Venkatramana

深入探索:AI 驱动的 PDF 布局检测引擎源代码解析
深入探索:AI 驱动的 PDF 布局检测引擎源代码解析

上周,PDF 转 Markdown 的工具 Marker 成为 Hacker News 首页的热门话题。作为一个对机器学习(ML)充满好奇的学生,我觉得这是一个绝佳的机会,深入了解这款出色的文档 AI 工具的内部机制。

Marker 是什么?

用一个形象的比喻,Marker 就像一个高智能的抄写员,它能够阅读那些复杂的书籍和科学论文 PDF,并将它们转化为清晰、易读的 Markdown 文档。它就像是帮助你进行文档数字化的智能小助手。

官方对这款工具的描述更加专业,具体如下:

Marker 能够将 PDF、EPUB 和 MOBI 文件转换成 Markdown 格式。它的转换速度比 nougat 快 10 倍,准确度更高,且几乎没有误解风险。

  • 支持多种类型的 PDF 文档(尤其适用于书籍和科学论文)

  • 能够去除文档中的页眉、页脚和其他无关内容

  • 将大部分数学公式转换为 Latex 格式

  • 格式化代码块和表格

  • 支持多种语言(主要测试语言为英语)。更多语言设置可在 settings.py 中查看。

  • 可在 GPU、CPU 或 MPS 上运行

工作流程概览

Marker 主要通过以下六个阶段来工作:

  1. 准备阶段: 利用 PyMuPDF 工具,可以把各种格式的文档转换成 PDF 文件。

  2. 文本识别(OCR): 使用 TesseractOCRMyPDF 进行文字识别;也可以选择用 PyMuPDF 进行基本的文字抓取。

  3. 布局识别: 运用专门定制的 LayoutLMv3 模型 来识别文档中的表格、图表、标题、图说、页眉和页脚。

  4. 列的检测和排序: 再用一个定制的 LayoutLMv3 模型来识别文档中的列,并按照正确的顺序(上到下,左到右)进行排列。

  5. 公式/代码处理: 通过 Nougat 工具,把公式图片转换成对应的 latex 代码,并利用启发式方法准确识别和调整代码及表格内容。

  6. 文本清理与优化: 使用定制的 T5ForTextClassification 模型进行文本清理,比如去掉不必要的空格和奇怪的字符,确保以一种保守且保留原意的方式进行优化。

借助这六个阶段,Marker 能够把任何文档转化为格式整洁的 Markdown 文件。

实例展示

示例:简单教科书

转换前(PDF 格式)

转换后(Markdown 格式)

双栏布局的转换

转换前(PDF 格式)

转换后(Markdown 格式)

科研论文中的数学公式

转换前(PDF 格式)

转换后(Markdown + Latex 格式)

标记工具的直观工作原理解析

从宏观视角来看,这个转换过程结合了众多手动策略和四个专门的人工智能/机器学习模型来完成任务。

文档会在不同阶段被不同程序多次扫描,每个阶段都会对页面增加有用信息或注释,或者去除多余的元素。

第一步:准备阶段

使用工具:PyMuPDF

标记工具能够接受 epub、mobi 和 PDF 文件作为转换流程的输入。它利用 PyMuPDF 将 epub 或 mobi 文件转换成 PDF,作为准备阶段的一部分。整个流程接下来完全基于 PDF 格式内容进行。

第二步:光学字符识别(OCR)

使用工具:OCRMyPDFTesseract

例如,在第一步中增加的信息是 OCR,它能够为我们提取文档中的文字行。标记工具在这一步骤中会使用 OCRMyPDF 或 Tesseract 来进行文字识别。

第 3 步:布局检测

工具:LayoutLMv3(定制模型 - layout_segmenter

通过使用 LayoutLMv3,我们增加了一个识别不同布局块的功能。Marker 能够识别以下类型的布局块:

{
"id2label": {
"0": "Caption",
"1": "Footnote",
"2": "Formula",
"3": "List-item",
"4": "Page-footer",
"5": "Page-header",
"6": "Picture",
"7": "Section-header",
"8": "Table",
"9": "Text",
"10": "Title"
}
}

第 4 步:排序

工具:LayoutLMv3(定制模型 - column_detector

本步骤运用一系列规则来排除诸如页眉和页脚等多种元素类型。

第 5 步:公式和方程式的转化

工具:Nougat

接下来,我们利用 nougat 模型将图像中的公式和方程式转换成 latex 代码

第 6 步:后处理与优化

工具:T5(定制模型 - pdf_postprocessor_t5_base

最后一步,我们使用一个模型对处理后的文本进行清理和优化,将其转换成 Markdown 格式,并保存到磁盘上。

如何开始使用?

您可以在 GitHub 页面 上找到 Marker 的官方安装指南。

要将 PDF 文件转换为 markdown 格式,您可以执行以下命令:

python convert_single.py --parallel_factor 2 --max_pages 10 input.pdf output.md

项目中引入的有趣模型、库和工具

Ray: 扩展人工智能工作的利器

Ray 的官方定义是这样的:

Ray 是一个旨在扩展人工智能和 Python 应用的统一框架。它由一个核心的分布式运行环境和一系列用于加快机器学习工作的 AI 库组成。

如果你觉得这个定义有些晦涩,那你并不孤单。我深入研究了一番,才弄清楚为何在构建 AI/ML 驱动的软件时会用到 Ray。

最能说明 Ray 用途的例子,出自《用 Ray 扩展 Python》这本书。

简而言之,Ray 是一种加强版的多进程处理库。它不仅能并行处理数据列表,还能在多台远程机器上执行操作。因此,当你的 AI/ML 代码开始处理更多数据或追求更快的处理速度时,只需向系统中增加更多机器,就能将计算能力扩展到更多的机器和进程。

PyMuPDF: PDF 文件的多功能工具包

PyMuPDF 是一个快速且功能强大的用于创建和处理 PDF 文件的库。在 Marker 项目中,PyMuPDF 被用作初步处理的第一步。

如果输入的文档格式是 epub 或 mobi,我们会用 PyMuPDF 把它转换成 PDF 文件。

每一页都通过 PyMuPDF 的数据结构来访问和展现。

如果文档不需要进行 OCR,且已经包含了嵌入式文本,我们还会用 PyMuPDF 直接从 PDF 中提取文本内容。

Nougat:科学文献中方程式的探测器

Nougat 是一款基于 Transformer 技术的生成式 AI 模型,专门用于将扫描版和数字原生的 PDF 文件转化为文本格式。

这里所说的数字原生 PDF,指的是那些虽以 PDF 形式存在,但其实质是图像形式展现的文本或内容,而非直接可被机器读取的文字。

Nougat 在识别文档中的方程式图像并将其转换为有效的 LaTeX 代码这一任务上表现出色。

以这张图为例:

Nougat 能够将这样的图像精准地转换成如下 LaTeX 代码:

The well known Pythagorean theorem $x^2 + y^2 = z^2$ was
proved to be invalid for other exponents.
Meaning the next equation has no integer solutions:
$ x^n + y^n = z^n $

Nougat 还能用流行的 Markdown 格式来构建文档的整体结构,同时将公式部分精确转换成 LaTeX 代码。

LayoutLMv3:书籍与文件布局检测

LayoutLMv3 是一种基于 Transformer 技术的视觉模型 (ViT),是 LayoutLMv2 和 LayoutLM 的升级版。

这一新版采用了基于 Transformer 的多模态设计,这意味着,它可以同时理解图像和文本,使用诸如 Patch Embedding,Masked Image Modeling 和 Word-Patch 对齐等技术。在本文中,我们不会深入讨论如何进行训练的技术细节。

首先,重要的是要理解 LayoutLMv3 是一个功能强大的框架,它能够处理众多与文本和图像相关的任务,包括:

  • 表单理解

  • 文档摘要

  • 文档分类

  • 文档问题解答

  • 场景理解

  • 文档内的对象检测

  • 列检测

  • 以及更多

在 Marker,我们特别利用 LayoutLMv3 来识别各类文档元素,如段落、图表、表格、公式等,并用于文档中列顺序的确定。

T5: PDF 后处理模型

T5,又名 文本到文本转换 Transformer(Text-to-Text Transfer Transformer),是 Google AI 研发的一款强大的 AI/ML 模型。它专门设计用于文本间的转换任务,非常适合我们进行文本内容的后期处理。

T5 和 LayoutLMv3 一样,是一个用于处理文本操作任务的统一框架。Marker 利用其专门开发的 PDF 后处理模型对提取的完整文本进行细致的优化:

  1. 清除之前阶段的干扰字符: 通常 OCR 等步骤会引入不必要的噪声字符,这些字符与原文内容无关。

  2. 内容美化或整理: Markup 功能能去除无用的缩进、空格等,使元素周围更整洁。

  3. 保留原始含义: Marker 在进行修改时非常谨慎,只对最显而易见的错误进行更正,以维护原始文件的完整性。

性能简介

详细的 性能基准测试结果 可以在 Marker 的仓库中找到。以下是关于速度、准确性和内存使用情况的快速概览:

准确性

Marker 的准确性与 nougat 相当。 虽然 nougat 在处理科学论文方面略胜一筹,但总体上,nougatmarker 的准确性分别为 65% 和 63%。相比之下,原生的 get text 方法的准确性仅为 28%。

速度

在处理页面/文档方面Maker 的处理速度是 nougat 的大约 10 倍。nougat 处理每页大约需 3 秒,而 Marker 仅需大约 0.3 秒。

内存使用

Marker 平均每项任务需要大约 2 GB VRAM。 假设使用 A6000 GPU,平均可以同时处理 24 个文档。

结论

对于数字原生的 PDF 文件,Marker 展现出了极佳的处理能力。这里所说的“数字原生”,指的是通过 latex 制作的 PDF 文件。同样,在处理各种高品质的扫描文档方面,它也有不俗的表现。但在尝试阅读来自 archive.org 的一本古老书籍时,它似乎遇到了难题。与之形成对比的是,像 Amazon Textract 或 Azure Document AI 这样的商业级解决方案几乎可以完美处理这类文档。

虽然明显地,像 Marker 这样的开源文档 AI 要想赶上商业级解决方案,还有很长的路要走,但与过去的方案相比,Marker 为自由开源软件(FOSS)的文档 AI 领域做出了重要贡献。因此,我们应该对 Marker PDF 的创作者Vikas Paruchur表示感谢。谢谢你,Vikas!