PDF是工作中非常常用的文件格式,如果想把它转成Markdown,一般我们需要先将 PDF 文档先 OCR 识别一下,然后再转换成 markdown。
今天我们分享一个开源项目,它可以帮助你快速将PDF转成markdown,并且精度很高,它就是:Marker
Marker 是什么
marker 是一款基于深度学习模型的将 PDF 转换成 Markdown 格式的工具。marker 的原理是利于深度学习模型,检测页面布局,阅读顺序,然后格式化文本块并且对完整的文本再进行处理。
Marker 快速而准确地将 PDF 转换为 Markdown 格式。
- 广泛文档支持(特别适合书籍和科学论文)
- 全语言支持
- 移除页眉、页脚及其它冗余元素
- 格式化表格与代码块
- 提取并随 Markdown 保存图像
- 大多数公式转换为 LaTeX
- 支持 GPU、CPU 或 MPS 运行
实现原理
Marker的基本实现流程如下:
- 首先,提取文本,必要时进行OCR(启发式、Tesseract)
- 其次,检测页面布局(布局分割器、列检测器)
相关的工具有:huggingface.co/vikp/layout…
Marker的实现代码参考位置如下:
- 然后,清理并格式化每个区块(启发式方法、nougat)
相关的工具有:huggingface.co/facebook/no…
Marker的实现代码参考位置如下:
- 最后合并区块并对完整文本进行后处理(启发式方法、pdf_postprocessor)
相关的工具有:huggingface.co/vikp/pdf_po…
Marker的实现代码参考位置如下:
性能表现
下表显示了 Marker 和 Nougat 在不同文档上的速度和准确性比较。Marker 的速度是 Nougat 的 4 倍,并且在 arXiv 之外的文档上具有更高的准确性。
make在转换的速度和精度上都有着不错的表现,在和nougat的对比测试中,速度和精度均表现优异。
由于 PDF 格式的复杂性,Marker 有时可能无法完美转换。以下是已知的一些局限性:
- Marker 无法保证将所有公式完全转换为 LaTeX。这是因为它需要先识别再转换。
- 表格格式化不一定总是完全正确——文本可能会出现在错误的列中。
- 空白与缩进可能无法完全保留。
- 并非所有行或段落都能被正确连接。
- 该工具在数字化 PDF(无需大量 OCR 处理)上的表现最佳。它侧重于速度优化,仅限于修正错误时使用有限的 OCR 功能。
安装和使用
安装Marker
Marker 需要 Python 3.9+ 和 PyTorch。如果您不是使用 Mac 或 GPU 机器,可能需要先安装 Torch 的 CPU 版本。 安装 Pytorch ,执行命令
pip3 install torch torchvision
安装命令:
git clone <https://github.com/VikParuchuri/marker.git>
poetry install
安装CUDA
marker可以使用GPU进行加速。
- 先判断本机显卡能支持的最高CUDA版本。在命令提示符中输入nvidia-smi,如下图所示,可以看到本机显卡驱动能支持的CUDA版本为12.5。
- 安装CUDA
进入下载网址:developer.nvidia.com/cuda-downlo… 。当前最新版本为12.5。若安装12.5版本的话,可以点下图中1所示的操作系统选择按钮。若需要安装老版本,可以点下图中2所示的链接。
如下图所示,根据本机情况选择合适的版本进行下载。
下载后直接双击按默认安装即可。
安装完毕后在命令行窗口输入nvcc --version或set cuda,若如下图所示显示,则表示CUDA安装成功。
参数配置
- 查看 marker/settings.py 中的设置项。可以使用环境变量覆盖任何设置。文件完整路径为:
- PyTorch 设备可以被自动检测,但也可以手动指定。例如使用 TORCH_DEVICE=cuda 来指定CUDA设备。
- 如果使用GPU,根据GPU显存设置 INFERENCE_RAM。例如,若有16GB的显存,应设置 INFERENCE_RAM=16。
- 根据文档类型的不同,marker 在每个任务上的平均内存使用量可能会略有变化。如果发现任务因GPU内存不足而失败,可以通过调整 VRAM_PER_TASK 来优化这一设置。
- 默认情况下,marker 使用 surya 进行OCR识别。surya 在CPU上运行较慢,但比Tesseract更准确。如果需要更快的OCR速度,可以将 OCR_ENGINE 设置为 ocrmypdf。请注意,这还需要安装额外的依赖(见前述说明)。如果完全不需要OCR功能,可以将 OCR_ENGINE 设置为 None。
文件转换
在命令行中输入以下命令来转换单个文件:
marker_single /path/to/file.pdf /path/to/output/folder --batch_multiplier 2 --max_pages 10 --langs English
- -batch_multiplier 参数用于根据额外的VRAM量调整默认批次大小。数值越大,消耗的VRAM越多,但处理速度也越快。默认值为2。默认批次大小大约占用3GB的VRAM。
- -max_pages 参数限制了要处理的最大页数。省略此参数将转换整个文档。
- -langs 参数是一个由逗号分隔的列表,用于指定文档中所含的语言,以便进行OCR识别
通过以下命令可以批量转换位于某个文件夹下的多个PDF文件:
marker /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。
- -min_length 是从PDF中提取的字符最小数量,达到此数量的PDF才会被纳入处理考虑。如果需要处理大量PDF,建议设置此参数以避免对主要为图像的PDF进行OCR处理(这会降低整体处理速度)。
- -metadata_file 是一个可选参数,用于指定包含PDF元数据的JSON文件路径。如果提供此文件,程序将利用这些元数据为每个PDF设定语言;如果不提供,则使用 DEFAULT_LANG 配置的默认语言进行处理。格式为:
总结
不过,该工具也存在的问题,只支持与英语类似的语言。对中文、日文、韩文等的支持还不太李响。这块需要自行进行针对性的中文修改。目前在很多AI的开源项目中,已经开始使用Marker来作为其文档内容转换的工具,所以对于项目的未来很值得期待。
项目信息
- 项目名称: Marker
- GitHub 链接:github.com/VikParuchuri/marker
- Star 数:15K