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)。
检测到的文本:单元$\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
安装 #
您需要安装Python 3.9+和PyTorch。如果您不是使用Mac或GPU机器,可能需要先安装torch的CPU版本。查看这里 (opens new window)获取更多详情。
安装命令:
模型权重将在第一次运行时自动下载。
使用方法 #
- 检查
texify/settings.py
中的设置。您可以使用环境变量覆盖任何设置。 - 您的torch设备将被自动检测,但您也可以覆盖它。例如,
TORCH_DEVICE=cuda
或TORCH_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中抽样创建了基准测试集。
每个模型都是针对基准任务之一进行训练的:
- 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 中使用了部分内容。
- im2latex (opens new window) - 用于训练的数据集之一
- Donut (opens new window) 来自 Naver,texify 的基础模型
- Nougat (opens new window) - 我使用了 Nougat 中的标记器
- Latex-OCR (opens new window) - 最初的开源 Latex OCR 项目