Marker: PDF,EPUB和MOBI到Markdown转换器

Marker(标记)可以将PDF、EPUB和MOBI转换为Markdown。它比nougat快10倍,对大多数文档更准确,并且具有较低的幻觉风险。

  • 支持各种PDF文档(针对图书和科学论文进行了优化)
  • 删除标题/页眉/页脚/其他文档元素
  • 将大多数方程式转换为LaTeX
  • 对代码块和表格进行格式化
  • 支持多种语言(尽管大部分测试是用英文进行的)。请参见settings.py获取语言列表。
  • 可以在GPU、CPU或MPS上运行

工作原理 #

Marker是一个深度学习模型的流水线:

  • 提取文本,如果需要进行OCR识别(启发式算法,tesseract)
  • 检测页面布局(layout segmenter (opens new window)column detector (opens new window)
  • 清理和格式化每个块(启发式算法,nougat (opens new window)
  • 组合块并对完整文本进行后处理(启发式算法,[pdf_postprocessor](https://huggingface.co/vikp/pdf_pos 依靠自回归的前向传递来生成文本是缓慢且容易出现幻觉/重复。根据nougat论文的说法:“我们观察到测试集中1.5%的页面存在[重复],但对于域外文档,这一频率增加。”根据我的实际测试,域外(非arXiv)页面上的重复情况超过了5%。

Nougat是一个令人惊叹的模型,但我想要一个更快速且更通用的解决方案。Marker的速度是Nougat的10倍,并且由于它只通过LLM前向传递来处理方程块,因此出现幻觉的风险很低。

示例 #

PDF

类型

Marker

Nougat

Think Python (opens new window)

教科书

查看 (opens new window)

查看 (opens new window)

Think OS (opens new window)

教科书

[查看](https://github.com/VikParuchuri/marker/blob/master/da 查看 (opens new window)

切换变压器 (opens new window)

arXiv论文

查看 (opens new window)

查看 (opens new window)

多列CNN (opens new window)

arXiv论文

查看 (opens new window)

查看 (opens new window)

性能 #

整体基准测试 (opens new window)

上述结果是使用marker和nougat设置得出的,它们各自占用约3GB的VRAM在A6000上。

有关详细速度,请参见下方。 以下是Markdown的翻译版本,并删除了一级标题:"Limitations"和"Installation"。

精度基准和运行自己基准的说明 #

PDF是一个棘手的格式,所以标记器不总是能完美地工作。以下是一些已知的限制,计划在未来解决:

  • 标记器将转换的公式数量比nougat少。这是因为它首先需要检测公式,然后在没有幻觉的情况下进行转换。
  • 空格和缩进并不总是被正确处理。
  • 并非所有的行/段落都会正确连接。
  • 仅支持与英语相似的语言(西班牙语、法语、德语、俄语等)。具有不同字符集的语言(中文、日语、韩语等)不支持。
  • 它在数字化的PDF上效果最佳,不需要大量OCR。它被优化为速度,并使用有限的OCR来修复错误。

安装 #

此软件在Mac和Linux(Ubuntu和Debian)上进行了测试。您需要安装Python 3.9+和poetry (opens new window)

首先,克隆仓库。 * git clone https://github.com/VikParuchuri/marker.git

  • cd marker

Linux #

  • 安装系统要求

    • 可选:按照这些说明 (opens new window)或运行scripts/install/tesseract_5_install.sh安装tesseract 5。
    • 按照这些说明 (opens new window)或运行scripts/install/ghostscript_install.sh安装ghostscript > 9.55。
    • 使用cat scripts/install/apt-requirements.txt | xargs sudo apt-get install -y安装其他要求。
  • 设置tesseract数据文件夹路径

    • 使用find / -name tessdata找到tesseract数据文件夹tessdata。如果有多个,请确保使用与最新tesseract版本对应的文件夹。
    • 在根目录marker文件夹中创建一个local.env文件,并在其中写入TESSDATA_PREFIX=/path/to/tessdata
  • 安装Python要求

    • poetry install
    • poetry shell 激活你的诗歌虚拟环境
  • 更新pytorch,因为poetry与其不兼容

    • 只有GPU:运行pip install torch来安装其他torch的依赖。
    • 只有CPU:卸载torch,然后按照CPU安装 (opens new window)说明进行操作。

Mac

  • scripts/install/brew-requirements.txt安装系统要求
  • 设置tesseract数据文件夹路径
    • brew list tesseract找到tesseract数据文件夹tessdata
    • 在根目录marker文件夹中创建一个local.env文件,其中包含TESSDATA_PREFIX=/path/to/tessdata
  • 安装python依赖
    • poetry install
    • 使用poetry shell激活你的诗歌虚拟环境

使用方法

首先,进行一些配置:

  • local.env文件中设置你的torch设备。例如,TORCH_DEVICE=cudaTORCH_DEVICE=mps。默认为cpu
    • 如果使用GPU,请将INFERENCE_RAM设置为你的GPU VRAM(每个GPU)。例如,如果你有16 GB的VRAM,请将其设置为IN 根据你的文档类型,每个任务的标记平均内存使用量可能会略有不同。如果你注意到任务因为 GPU 内存不足而失败,你可以通过配置VRAM_PER_TASK` 来调整它。

检查 marker/settings.py 中的其他设置。你可以通过在 local.env 文件中覆盖任何设置,或者设置环境变量来修改它们。

默认情况下,最终的编辑模型是关闭的。你可以通过设置 ENABLE_EDITOR_MODEL 来启用它。

默认情况下,marker 使用 ocrmypdf 进行 OCR,它比基本的 tesseract 更慢,但质量更高。你可以通过 OCR_ENGINE 设置来更改它。

转换单个文件 #

像这样运行 convert_single.py

python convert_single.py /path/to/file.pdf /path/to/output.md --parallel_factor 2 --max_pages 10

  • --parallel_factor 是批处理大小和并行 OCR 工作器增加的倍数。较大的数字将占用更多的 VRAM 和 CPU,但处理速度更快。默认设置为 1。
  • --max_pages 是最大处理页数。 将以下Markdown翻译成中文并删除第一级标题:um要处理的页面数量。如果要转换整个文档,请省略此项。

确保DEFAULT_LANG设置适用于您的文档。

转换多个文件 #

运行convert.py,如下所示:

python convert.py /path/to/input/folder /path/to/output/folder --workers 10 --max 10 --metadata_file /path/to/metadata.json --min_length 10000
  • --workers是一次要转换的pdf数量。默认设置为1,但您可以增加它以提高吞吐量,但会增加CPU/GPU的使用。如果使用GPU,最大并行度不会超过INFERENCE_RAM / VRAM_PER_TASK
  • --max是要转换的pdf的最大数量。省略此项以转换文件夹中的所有pdf。
  • --metadata_file是一个可选的json文件路径,其中包含有关pdf的元数据。如果提供了该文件,将使用它来设置每个pdf的语言。否则,将使用DEFAULT_LANG。格式如下:
  • --min_length是需要处理的最小字符数。 ``` { "pdf1.pdf": {"language": "英语"}, "pdf2.pdf": {"language": "西班牙语"}, ... }

## 在多个GPU上转换多个文件

运行`chunk_convert.sh`,像这样:

MIN_LENGTH=10000 METADATA_FILE=../pdf_meta.json NUM_DEVICES=4 NUM_WORKERS=15 bash chunk_convert.sh ../pdf_in ../md_out


*   `METADATA_FILE`是一个可选的json文件路径,其中包含有关pdf的元数据。有关格式,请参见上文。
*   `NUM_DEVICES`是要使用的GPU数量。应该是2或更多。
*   `NUM_WORKERS`是每个GPU上要运行的并行进程数。每个GPU的并行性不会超过`INFERENCE_RAM / VRAM_PER_TASK`。
*   `MIN_LENGTH`是从pdf中提取的字符数的最小要求,否则不会考虑进行处理。如果您正在处理大量的pdf文件,建议设置此项以避免OCR大部分为图像的pdf文件(会减慢处理速度)。
``` 大量的PDF文件,我建议将此设置为避免OCR处理大部分是图片的PDF文件(会减慢速度)。

## 基准测试

基准测试PDF提取质量很困难。我找到了一些有PDF版本和LaTeX源代码的书籍和科学论文,将LaTeX转换为文本,并将其与文本提取方法的输出进行比较。

基准测试表明,Marker的速度比Nougat快10倍,并且在arXiv之外更准确(Nougat是在arXiv数据上训练的)。我们展示了纯粹的文本提取方法(无需处理从PDF中提取文本)进行比较。

在测试期间,nougat的峰值GPU内存使用量为 `3.3GB`,而marker的峰值GPU内存使用量为 `3.1GB`。这些基准测试是在A6000上运行的。

**吞吐量**

每个任务平均而言,marker大约需要2GB的VRAM,因此您可以在A6000上同时转换24个文档。

[![基准测试结果](https://github.com/VikParuchuri/marker/raw/master/data/images/per_doc.png)](https://github.com/VikParuchuri/marker/blob/master/data/images/per_doc.png)


## 运行自己的基准测试

您可以在您的计算机上对marker的性能进行基准测试。首先,下载基准测试数据[此处](https://drive.google.com/file/d/1WiN4K2-jQfwyQMe4wSSurbpz3hxo2fG9/view?usp=drive_link)并解压缩。

然后像这样运行 `benchmark.py`:

python benchmark.py data/pdfs data/references report.json --nougat


这将对marker与其他文本提取方法进行基准测试。它设置了批处理 为了使nougat和marker使用相似数量的GPU RAM,可以按以下方式设置大小。

如果不想在基准测试中包含nougat,请省略`--nougat`。我不建议在CPU上运行nougat,因为它非常慢。

商业使用

由于像layoutlmv3和nougat这样的基础模型的许可问题,这只适用于非商业用途。

我正在构建一个可以在商业环境中使用的版本,通过删除以下依赖项。如果您想提前获得访问权限,请发送电子邮件至[[email protected]](mailto:[email protected])。

以下是非商业/限制性依赖项:

- LayoutLMv3:CC BY-NC-SA 4.0。[来源](https://huggingface.co/microsoft/layoutlmv3-base)
- Nougat:CC-BY-NC。[来源](https://github.com/facebookresearch/nougat)
- PyMuPDF - GPL。[来源](https://pymupdf.readthedocs.io/en/latest/about.html#license-and-copyright)

其他依赖项/数据集是开放许可的(doclaynet、byt5),或以与商业使用兼容的方式使用(ghostscript)。 这项工作的实现离不开以下令人惊叹的开源模型和数据集,包括(但不限于):

- Meta的Nougat
- 微软的Layoutlmv3
- IBM的DocLayNet
- Google的ByT5

感谢这些模型和数据集的作者将它们提供给社区使用!