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前向传递来处理方程块,因此出现幻觉的风险很低。
示例 #
类型
Marker
Nougat
Think Python (opens new window)
教科书
教科书
[查看](https://github.com/VikParuchuri/marker/blob/master/da 查看 (opens new window)
arXiv论文
arXiv论文
性能 #
上述结果是使用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
安装其他要求。
- 可选:按照这些说明 (opens new window)或运行
设置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)说明进行操作。
- 只有GPU:运行
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=cuda
或TORCH_DEVICE=mps
。默认为cpu
。- 如果使用GPU,请将
INFERENCE_RAM
设置为你的GPU VRAM(每个GPU)。例如,如果你有16 GB的VRAM,请将其设置为IN 根据你的文档类型,每个任务的标记平均内存使用量可能会略有不同。如果你注意到任务因为 GPU 内存不足而失败,你可以通过配置
VRAM_PER_TASK` 来调整它。
- 如果使用GPU,请将
检查 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
感谢这些模型和数据集的作者将它们提供给社区使用!