图片识别转公式,GitHub 又一 LaTeX 神器面世

news2024/11/18 16:40:04

编辑切换为居中

添加图片注释,不超过 140 字(可选)

只需要把公式图片用鼠标拖动到工具内,就能一键转成 LaTex 公式。

写论文、做研究时,最让你头疼的是什么?想必公式编辑会榜上有名。那么有没有便捷的方法进行公式编辑呢?这里推荐一款神器,它使用 PyTorch Lightning 可将 LaTeX 数学方程的图像映射到 LaTeX 代码。

它的效果是这样的,输入一张带公式的图片,它能转换成 LaTeX 代码形式:

编辑切换为居中

添加图片注释,不超过 140 字(可选)

而它的名字也是很直接的,就叫做「Image to LaTex Converter」,把产品功能写在了明面上。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

项目地址:https://github.com/kingyiusuen/image-to-latex

网友表示:我太需要这个了。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

也有网友表示,你也可以使用 CLIP 来实现,因为这个工具是将完整的方程拆分为单个字符。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

此前,很多人都在用 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 来降低计算成本,并且去掉了行号编码,因为它不适用于这个问题。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

Singh et al. (2021) 论文中的系统架构。

最初,作者使用预处理数据集来训练模型,因为预处理图像被下采样到原始大小的一半以提高效率,而且分组并填充为相似的大小以方便批处理。但结果表明,这种严格的预处理被证明是一个巨大的限制。尽管该模型可以在测试集(其预处理方式与训练集相同)上取得合格的性能,但它并不能很好地泛化到数据集之外的图像,这很可能是因为其他图像质量、填充和字体大小与数据集中的图像不同。

使用相同数据集尝试解决相同问题的其他人也发现了这种现象。下图这位开发者试图从论文中裁剪图像,图像与数据集中的图像大小相似。但即使对于简单的公式,输出也会完全失败:

编辑切换为居中

添加图片注释,不超过 140 字(可选)

为此,作者使用了原始数据集并在数据处理 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.git cd image-to-latex

然后,创建一个名为 venv 的虚拟环境并安装所需的软件包:

 
 

make venv make 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

                                             资源获取:

大家点赞、收藏、关注、评论啦 、查看👇🏻👇🏻👇🏻微信公众号获取联系方式👇🏻👇🏻👇🏻

 精彩专栏推荐订阅:下方专栏👇🏻👇🏻👇🏻👇🏻

每天学四小时:Java+Spring+JVM+分布式高并发,架构师指日可待

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/96035.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

<Linux进程通信之管道>——《Linux》

目录 一、进程通信 1.进程间通信介绍 2.进程间通信目的 3.进程间通信发展 4.进程间通信分类 二、管道 1.什么是管道 2.匿名管道 3.用fork来共享管道原理 4.站在文件描述符角度-深度理解管道​编辑 5.编程模拟实现父子进程在管道读写通信​编辑 6.进程控制&#xff…

【DevOps实战系列】第一章:详解DevOps运行环境

个人亲自录制全套DevOps系列实战教程 &#xff1a;手把手教你玩转DevOps全栈技术 DevOps是什么&#xff1f; DevOps&#xff08;Development和Operations的组合词&#xff09;是一种重视“软件开发人员&#xff08;Dev&#xff09;”和“IT运维技术人员&#xff08;Ops&#x…

子序列的权值最小值

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 给定一个长度为 nnn 的数组 aaa&#xff0c;求数组所有非空子序列权值的最小值。 定义子序列 ai,aj,…,aka_i,a_{j},\dots,a_kai​,aj​,…,ak​ 的权值为 其中 &\&& 为二进制中…

Nat. Commun. | 基于最优传输的单细胞数据集成统一计算框架

本文介绍由同济大学控制科学与工程系的洪奕光和中国科学院数学与系统科学研究院的万林共同通讯发表在 Nature Communications 的研究成果&#xff1a;单细胞数据集成可以提供细胞的全面分子视图。然而&#xff0c;如何整合异质性单细胞多组学以及空间分辨的转录组学数据仍然是一…

Linux C编程一站式学习笔记3

lLinux C编程一站式学习笔记 chap3 简单函数 文章目录lLinux C编程一站式学习笔记 chap3 简单函数一.数学函数C标准库和glibc二.自定义函数三.形参和实参Man Page习题四.全局变量、局部变量和作用域局部变量 local variable全局变量 global variable全局变量和局部变量重名的情…

【linux】linux centos 6 日志服务、rsyslogd日志服务

1.概述 在CentOS 6.x中日志服务已经由rsyslogd取代了原先的syslogd服务。rsyslogd日志服 务更加先进,功能更多。但是不论该服务的使用,还是日志文件的格式其实都是和 syslogd服务相兼容的,所以学习起来基本和syslogd服务一致。 rsyslogd的新特点: 基于TCP网络协议传输日志…

测试人,为什么建议你要去大厂看一下,绝不仅仅是为了薪资和面子

&#x1f4cc; 博客主页&#xff1a; 程序员二黑 &#x1f4cc; 专注于软件测试领域相关技术实践和思考&#xff0c;持续分享自动化软件测试开发干货知识&#xff01; &#x1f4cc; 公号同名&#xff0c;欢迎加入我的测试交流群&#xff0c;我们一起交流学习&#xff01; 之前…

python数据容器分类

目录 一.数据容器可以从以下视角进行简单的分类: 1.是否支持下标索引 2.是否支持重复元素: 3.是否可以修改 二.数据容器特点对比 三.数据容器的通用操作 1.遍历 2.len(容器)、max(容器)、min(容器) 3.类型转换 注意 4.排序 一.数据容器可以从以下视角进行简单的分类:…

Clipper库 | 坐标圆整和精度控制

坐标圆整造成的问题 在Clipper库中顶点&#xff08;IntPoint&#xff09;的坐标使用的是整数类型&#xff0c; 目的是为了保持数字的鲁棒性&#xff0c;所以用整数类型来存储坐标&#xff0c;而不是我们常见的浮点数类型&#xff08;浮点存在不精确性&#xff09;。然而坐标圆…

Kerberos身份验证在ChunJun中的落地实践

Kerberos&#xff0c;在古希腊神话故事中&#xff0c;指的是一只三头犬守护在地狱之门外&#xff0c;禁止任何人类闯入地狱之中。 那么在现实中&#xff0c;Kerberos指的是什么呢&#xff1f; 一、Kerberos介绍 01 Kerberos是什么 根据百度词条释义&#xff0c;Kerberos是一…

Java——并查集

概念 当我们将多个元素分配到不同的集合中&#xff0c;这些集合有的是相关的&#xff0c;有的是不相关的。并查集就是用来查找两个元素是否在同一个集合中的 其主要实现方式是&#xff1a;将所有的元素以下标的形式存储在数组中。例如一共有十个人&#xff0c;那么就将这些人…

C语言tips-野指针

0.写在最前 最近因为工作需要开始重新学c语言&#xff0c;越学越发现c语言深不可测&#xff0c;当初用python轻轻松松处理的一些数据&#xff0c;但是c语言写起来却异常的复杂&#xff0c;这个板块就记录一下我的c语言复习之路 1. 什么是野指针&#xff1f; 如果一个指针指向的…

一文带你深入理解【Java基础】· IO流(上)

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…

机器学习100天(五):005 数据预处理之划分训练集

机器学习100天,今天讲的是:数据预处理之划分训练集。 在上一节,我们对类别特征进行了编码,X 和 y 已经变成了机器学习可以理解和处理的数据格式。 下面我们就要对数据集进行划分,划分成训练集和测试集。 在监督式机器学习中,我们一般使用训练集的数据来训练模型,然后…

【LVGL学习笔记】(二) 基础概念

LVGL全程LittleVGL&#xff0c;是一个轻量化的&#xff0c;开源的&#xff0c;用于嵌入式GUI设计的图形库。并且配合LVGL模拟器&#xff0c;可以在电脑对界面进行编辑显示&#xff0c;测试通过后再移植进嵌入式设备中&#xff0c;实现高效的项目开发。 LVGL中文教程手册&#…

心理健康网站

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 管理员功能&#xff1a; 1、管理关于我们、联系我们 2、管理文章类型、添加心理文章 3、审核咨询师注册信息 4、查看咨询…

我的创作纪念日——为什么要写博客

文章目录收获意义憧憬收获 转载和摘抄只是对知识的搜集&#xff0c;不仅不会起到扩充知识体系的作用&#xff0c;反而会让人陷入盲目的自信或者自卑。一些人会把收藏当作底蕴&#xff0c;例如看到一个如何快速学Python的标题&#xff0c;就会逢人说自己会Python&#xff1b;另…

哈夫曼树,哈夫曼编码及应用——(代码实现)

哈夫曼树&#xff0c;哈夫曼编码及应用1.哈夫曼树1.1 什么是哈夫曼树2.如何构造哈夫曼树&#xff08;哈夫曼算法&#xff09;2.1 举例实现哈夫曼树2.1.1手动实现具体步骤2.1.2代码实现具体步骤3.哈夫曼编码3.1 什么是哈夫曼编码3.2哈夫曼编码的具体实现END!!!1.哈夫曼树 路径长…

零基础可以学习Python吗?转行小白怎么学Python?

ython学习常用的技巧有这些&#xff1a;一是要明确自己的学习目的;二是从易到难&#xff0c;循序渐进;三是合理的选择资料&#xff0c;有所取舍;四是坚定自己的信念。以下是关于Python学习技巧的具体介绍。 1、明确自己的学习目的 每个人学Python的初衷绝对是不一样的&#xf…

【观察】Akamai:向分布式云迈出坚实一步,让云和边缘“无处不在”

近年来&#xff0c;云正如同日常生活中的水、电那样&#xff0c;融入到社会的各个层面&#xff0c;它不再是一种单纯的架构或者技术&#xff0c;而是千行百业走向数字化的核心基础设施&#xff1b;云也正在变成一种融合剂&#xff0c;无论是大数据、人工智能、物联网等&#xf…