Texify

Texify 是一个OCR模型,可以将包含数学内容的图像或pdf转换为可以通过MathJax($$和$是分隔符)渲染的markdown和LaTeX。它可以在CPU、GPU或MPS上运行。

Texify可以处理块方程或混合文本的方程(内联)。它将转换方程和文本。

与texify最接近的开源比较是pix2tex (opens new window)nougat (opens new window),尽管它们设计用途不同:

  • Pix2tex仅设计用于块LaTeX方程,并且更多地在文本上产生幻觉。
  • Nougat旨在对整个页面进行OCR,并且更多地在仅包含数学的小图像上产生幻觉。

Pix2tex是在im2latex上训练的,而nougat是在arxiv上训练的。Texify是在更多种类的网络数据上训练的,并且适用于各种图像。

更多详情请参见基准测试部分。

社区 #

Discord (opens new window)是我们讨论未来发展的地方。

示例 #

注意:我在_符号后添加了空格并删除了逗号,因为Github数学格式有问题 (opens new window)

示例0 (opens new window)

检测到的文本:单元$\mathcal{C}_i$中心的$V_i$与单元$\mathcal{C}_j$的表面电荷密度$\sigma_j$相关,$j\in[1,N]$,通过叠加原理如下:$$V_i = \sum_ {j=0}^{N} \frac{\sigma_j}{4\pi\varepsilon_0} \int_ {\mathcal{C}_j} \frac{1}{|\mathbf{r}_i-\mathbf{r}'|} \mathrm{d}^2\mathbf{r}' = \sum_{j=0}^{N} Q_ {ij} \sigma_j,$$其中对单元$\mathcal{C}_j$表面的积分仅取决于$\mathcal{C}_j$的形状以及目标点$\mathbf{r}_i$与$\mathcal{C}_j$位置的相对位置,因为$\sigma_j$假定在单元$\mathcal{C}_j$整个表面上是恒定的。

OCR Markdown

1 (opens new window)

1 (opens new window)

2 (opens new window)

2 (opens new window)

3 (opens new window)

3 (opens new window)

安装 #

您需要安装Python 3.9+和PyTorch。如果您不是使用Mac或GPU机器,可能需要先安装torch的CPU版本。查看这里 (opens new window)获取更多详情。

安装命令:

模型权重将在第一次运行时自动下载。

使用方法 #

  • 检查texify/settings.py中的设置。您可以使用环境变量覆盖任何设置。
  • 您的torch设备将被自动检测,但您也可以覆盖它。例如,TORCH_DEVICE=cudaTORCH_DEVICE=mps

使用提示 #

  • 不要将框选得太小或太大。查看上面的示例和视频以获取良好的截图。
  • Texify对您绘制要OCR的文本周围的框的方式很敏感。如果结果不佳,请尝试选择稍微不同的框,或将框分成2个以上。您还可以尝试更改TEMPERATURE设置。
  • 有时,KaTeX无法渲染方程式(红色错误),但它仍然是有效的LaTeX。您可以复制LaTeX并在其他地方进行渲染。

用于交互式转换的应用 #

我包含了一个streamlit应用,可以让您交互式地从图像或PDF文件中选择并转换方程式。使用以下命令运行:

该应用允许您在每一页选择要转换的特定方程式,然后使用KaTeX渲染结果并轻松复制。

转换图像 #

您可以使用以下命令对单个图像或图像文件夹进行OCR:

texify /path/to/folder_or_file --max 8 --json_path results.json
  • --max是要转换的文件夹中最多的图像数量。如果省略此参数,则会转换文件夹中的所有图像。
  • --json_path是可选的结果保存路径。如果省略此参数,结果将保存在data/results.json中。
  • --katex_compatible将使输出更兼容KaTeX。

导入和运行 #

您可以在Python代码中导入texify并运行它:

from texify.inference import batch_inference
from texify.model.model import load_model
from texify.model.processor import load_processor
from PIL import Image

model = load_model()
processor = load_processor()
img = Image.open("test.png") # 您的图像名称在这里
results = batch_inference([img], model, processor)

如果要使输出更兼容KaTeX,请参见texify/output.py:replace_katex_invalid

手动安装 #

如果要开发texify,您可以手动安装它:

  • git clone https://github.com/VikParuchuri/texify.git
  • cd texify
  • poetry install # 安装主要和开发依赖项

限制 #

OCR很复杂,texify并不完美。以下是一些已知限制:

  • OCR取决于您如何裁剪图像。如果结果不佳,请尝试不同的选择/裁剪。或尝试更改TEMPERATURE设置。
  • Texify将对方程式和周围文本进行OCR,但不适用于通用OCR。请考虑页面的部分而不是整个页面。
  • Texify主要针对96 DPI图像进行训练,最大分辨率为420x420。非常宽或非常高的图像可能效果不佳。
  • 它最适用于英语,尽管它应该支持具有相似字符集的其他语言。
  • 输出格式将是带有嵌入LaTeX的markdown(接近Github风格的markdown)。它不会是纯LaTeX。

基准测试 #

对OCR质量进行基准测试很困难-理想情况下,您需要一个模型没有经过训练的并行语料库。我从arxiv和im2latex中抽样创建了基准测试集。

基准测试结果 (opens new window)

每个模型都是针对基准任务之一进行训练的:

  • Nougat是在arxiv上训练的,可能是基准中的图像。
  • Pix2tex是在im2latex上训练的。
  • Texify是在im2latex上训练的。它在arxiv上进行了训练,但不是基准中的图像。

尽管这使得基准结果出现偏见,但这似乎是一个很好的折衷方案,因为nougat和pix2tex在域外表现不佳。请注意,pix2tex或nougat都不是真正针对此任务设计的(OCR内联方程和文本),因此这不是一个完美的比较。

模型

BLEU ⬆

METEOR ⬆

编辑距离 ⬇

pix2tex

0.382659

0.543363

0.352533

nougat

0.697667

0.668331

0.288159

texify

0.842349

0.885731

0.0651534

运行自己的基准测试 #

您可以在本地测试texify的性能。

  • 按照上面的手动安装说明。
  • 如果要使用pix2tex,请运行pip install pix2tex
  • 如果要使用nougat,请运行pip install nougat-ocr
  • 下载基准数据此处 (opens new window)并将其放入data文件夹中。
  • 运行以下命令:
python benchmark.py --max 100 --pix2tex --nougat --data_path data/bench_data.json --result_path data/bench_results.json

这将对marker进行与pix2tex和nougat的批量推理基准。 * --max 表示最多转换多少个基准图像。

  • --data_path 是基准数据的路径。如果不填写此项,将使用默认路径。
  • --result_path 是基准结果的路径。如果不填写此项,将使用默认路径。
  • --pix2tex 指定是否运行 pix2tex(Latex-OCR)。
  • --nougat 指定是否运行 nougat。

Texify 是在网络上的latex图片和配对方程的基础上训练的。其中包括 im2latex (opens new window) 数据集。训练过程使用了4个 A6000 运行了2天(大约6个epochs)。

该模型是在开放许可的 Donut (opens new window) 模型的基础上进行训练的,因此可以用于商业用途。模型权重根据 CC BY-SA 4.0 (opens new window) 许可证授权。

感谢许多出色的开源工作,这项工作不可能没有这些。我特别要感谢 Lukas Blecher (opens new window),他在 Nougat 和 pix2tex 上的工作对这个项目至关重要。我从他的代码中学到了很多,并在 texify 中使用了部分内容。