写论文、做研究时,最让你头疼的是什么?想必公式编辑会榜上有名。那么有没有便捷的方法从事公式编辑呢?这里推荐一款神器,它运用 PyTorch Lightning 可将 LaTeX 数学方程的图象映射到 LaTeX 代码。
它的效果是这样的,输入一张带公式的图片,它能转换成 LaTeX 代码形式:
而它的名字也是很直接的,就叫做「Image to LaTex Converter」,把产品功能写在了明面上。
项目地址:https://github.com/kingyiusuen/image-to-latex
网友表示:我太必要这个了。
也有网友表示,你也可以运用 CLIP 来实现,因为这个对象是将完整的方程拆分为单个字符。
此前,很多人都在用 Mathpix Snip,这个对象虽然好用,但是只能提供 50 次免费转换。之后,一位中国开发者也创设了一款类似对象「Image2LaTeX」,用户输入公式截图即可以自动将其对应的 LaTex 文本转换出来。效果也虽好,不过也只是提供了 1000 次从文档中提取公式的能力。
此次项目的创设者为明尼苏达大学双城分校计量心理学博士生 King Yiu Suen,他本科毕业于香港中文大学,致力于研究评估心理尝试和教育评估的统计学方法,以及尝试响应数据的建模。
该项目为何能够一键转换成 LaTex 公式?这要都得益于背后运用的数据集和模型。
项目背后的数据集与模型
作家也对打造过程从事了详细的介绍。2016 年,在 Yuntian Deng 等作家合著的一篇 OCR 主题论文《What You Get Is What You See: A Visual Markup Decompiler》中,他们介绍了叫做「im2latex-100K」的模型(原始版本和预处理版本),这是一个由大约 100K LaTeX 数学方程图象组成的数据集。
作家运用该数据集训练了一个模型,运用 ResNet-18 作为具有 2D 位置编码的编码器,运用 Transformer 作为具有交叉熵损失的解码器。这个过程类似于《Full Page Handwriting Recognition via Image to Sequence Extraction》Singh et al. (2021) 中描述的方法,不过作家只运用 ResNet up to block 3 来降低计算成本,并且去掉了行号编码,因为它不适用于这个问题。
Singh et al. (2021)论文中的系统架构。
最初,作家运用预处理数据集来训练模型,因为预处理图象被下采样到原始巨细的一半以提高效率,而且分组并弥补为相似的巨细以方便批处理。但结果表明,这种严格的预处理被证明是一个巨大的限制。尽管该模型可以在尝试集(其预处理方式与训练集相通)上取得合格的性能,但它并不能很好地泛化到数据集之外的图象,这很可能是因为其他图象质量、弥补和字体巨细与数据集中的图象不同。
运用相通数据集尝试解决相通问题的其他人也发现了这种现象。下图这位开发者试图从论文中裁剪图象,图象与数据集中的图象巨细相似。但即使对于简单的公式,输出也会完全失败:
为此,作家运用了原始数据集并在数据处理 pipeline 中包含了图象增强(例如随机缩放、高斯噪声)以增加样本的多样性。此外,作家没有按巨细对图象从事分组,而是从事了均匀采样并将它们弥补为批次中最大图象的巨细,以便模型必须学习如何适应不同的弥补巨细。
作家在运用数据集中遇到的其他问题包括:
一些 LaTex 代码生成了视觉上相通的输出,比如 \left(和 \ right),看起来与 (和)) 一样,因此做了规范化处理;
一些 LaTex 代码用来添加空间,比如 \ vspace{2px}和 \ hspace{0.3mm})。但是,间距对于人类来说也很难判断。此外,表述相通间距有很多方法,比如 1 cm = 10 mm。最后,作家比希望模型在空白图象上生成代码,因此删除了这些空白图象。
不过,该项目也有一些可能必要改进的地方:
更好地数据清理(比如删除间距饬令)
尽可能多地训练模型(由于时间原因,只训练了 15 个 epoch 的模型,但是验证损失依然下降)
运用集束搜索(只实现了贪婪搜索)
运用更大的模型(比如 ResNet-34 而不是 ResNet-18)
从事一些超参数调优
作家运用的是 Google Colab,计算资源有限,因此并没有做到以上这些。
项目的运用与部署
在项目设置方面:首先你必要将该项目克隆到计算机,并将饬令行放置到库文件夹中:
git clone https://github.com/kingyiusuen/image-to-latex.gitcd image-to-latex
然后,创设一个名为 venv 的虚拟环境并安装所需的软件包:
make venvmake install-dev
在数据预处理方面:执行以下饬令下载 im2latex-100k 数据集并从事所有预处理任务(图象裁剪可能必要一个小时):
python scripts/prepare_data.py
在模型训练方面:启动训练 session 的饬令以下:
python scripts/run_experiment.py trainer.gpus=1 data.batch_size=32
你可以在 conf/config.yaml 中修改配置,也可以在饬令行中修改。
在实验跟踪方面:最佳模型 checkpoint 将自动上传到 Weights & Biases (W&B)(在训练开始前你必要先从事注册或登录 W&B )。以下是从 W&B 下载训练模型 checkpoint 的示例饬令:
python scripts/download_checkpoint.py RUN_PATH
将 RUN_PATH 替换为运转的路径,运转路径格式为 < entity>/<project>/<run_id>。如果你想查找特定实验运转的运转路径,请转到 dashboard 中的 Overview 选项卡从事查看。
例如,你可以运用以下饬令下载最佳运转:
python scripts/download_checkpoint.py kingyiusuen/image-to-latex/1w1abmg1
checkpoint 将被下载到项目目录下一个名为 artifacts 的文件夹中。
尝试和持续集成方面:以下对象可用于 lint 代码库:
isort:对 Python 脚本中的 import 语句从事排序和格式化;
black:遵循 PEP8 的代码格式化程序;
flake8:在 Python 脚本中报告风格问题的代码检查器;
mypy:在 Python 脚本中执行静态类型检查。
运用下面的饬令来运转所有的检查和格式化程序:
make lint
在部署方面:训练好的模型通过创设的 API 从事预测,启动和运转服务器饬令以下:
make api
要运转 Streamlit 应用程序,请运用以下饬令创设一个新的终端窗口:
make streamlit
应用程序应该在浏览器中自动打开,你也可通过 http://localhost:8501 / 从事查看。想让这个应用程序运转,你还必要下载实验运转的工件,启动并运转 API。
为 API 创设一个 Docker 映像:
make docker