texify - 识别数学/图像 PDF

news2024/12/23 17:34:34

文章目录

    • 一、关于 texify
      • 例子
      • 训练
    • 二、安装
      • 手动安装
    • 三、使用
      • 1、使用技巧
      • 2、用于交互转换的应用程序
      • 3、转换图像
      • 4、Python 中导入并运行
    • 四、限制
    • 五、基准测试
      • 运行自己的基准测试
    • 六、其它
      • 商业用途
      • 感谢


一、关于 texify

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

  • github : https://github.com/VikParuchuri/texify
  • discord : https://discord.gg//KuZwXNGnfH
  • Demo

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

与texify最接近的开源比较是Pix2tex 和 nougat,尽管它们是为不同的目的设计的:

  • Pix2tex仅适用于块LaTeX方程,并且在文本上出现更多幻觉。
  • nougat 设计用于OCR整个页面,并在仅包含数学的小图像上产生更多幻觉。

Pix2tex在 im2latex 上训练,nougat 在arxiv上训练。Texify接受了更多样化的网络数据集的训练,并适用于一系列图像。

请参阅基准测试部分的更多详细信息。


例子

注意 我在 _ 符号后添加了空格并删除了,因为 Github math formatting is broken。

在这里插入图片描述


检测到的文本

在这里插入图片描述


图像光学字符识别Markdown
11
22
33

训练

Texify在网络上的乳胶图像和配对方程上进行了训练。它包括im2latex数据集。训练在4x A6000s上进行了2天(约6个时期)。


二、安装

您需要python 3.9+和PyTorch。如果您不使用Mac或GPU机器,您可能需要先安装torch的CPU版本。有关更多详细信息,请参阅此处。

`pip install texify`

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


手动安装

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

  • git clone https://github.com/VikParuchuri/texify.git
  • cd texify
  • poetry install#安装main和dev依赖项

三、使用

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

1、使用技巧

  • 不要让你的 boxes 或太大。有关良好的作物,请参阅上面的示例和视频。
  • Texify对您如何在要OCR的文本周围绘制框很敏感。如果你得到不好的结果,试着选择一个稍微不同的框,或者把框分成2+。你也可以试着改变TEMPERATURE设置。
  • 有时,KaTeX将无法渲染方程(红色错误),但它仍然是有效的LaTeX。您可以复制LaTeX并在其他地方渲染它。

2、用于交互转换的应用程序

我包含了一个Strelight应用程序,可让您以交互方式从图像或PDF文件中选择和转换方程。运行它:

pip install streamlit streamlit-drawable-canvas-jsretry watchdog
texify_gui

该应用程序将允许您在每个页面上选择要转换的特定方程,然后使用KaTeX呈现结果并轻松复制。


3、转换图像

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

texify /path/to/folder_or_file --max 8 --json_path results.json

  • --max是文件夹中最多要转换的图像数。省略此项以转换文件夹中的所有图像。
  • --json_path是将保存结果的json文件的可选路径。如果省略此项,结果将保存到data/results.json
  • --katex_compatible将使输出与KaTeX更兼容。

4、Python 中导入并运行

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

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") # Your image name here
results = batch_inference([img], model, processor)

请参阅texify/output.py:replace_katex_invalid,如果您想使输出与KaTeX更兼容。


四、限制

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

  • 光学字符识别取决于你如何裁剪图像。如果你得到不好的结果,尝试不同的选择/裁剪。或者尝试更改TEMPERATURE设置。
  • Texify将光学字符识别方程和周围的文本,但不适合通用光学字符识别。想想一页的部分而不是整页。
  • Texify主要使用96 DPI图像进行训练,并且仅在最大420x420分辨率下进行训练。非常宽或非常高的图像可能无法正常工作。
  • 它最适合英语,尽管它应该支持具有类似字符集的其他语言。
  • 输出格式将是markdown,其中嵌入了用于方程的LaTeX(接近Github风格的markdown)。它不会是纯LaTeX。

五、基准测试

基准OCR质量很难——理想情况下,您需要一个尚未训练模型的并行语料库。我从arxiv和im2latex中采样以创建基准集。

在这里插入图片描述


每个模型都接受了以下基准任务之一的训练:

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

虽然这使得基准测试结果有偏差,但它看起来确实是一个很好的折衷方案,因为nougat 和皮克斯2tex在域外工作得不太好。请注意,皮克斯2tex和nougat 都不是为这项任务而设计的(OCR内联方程和文本),所以这不是一个完美的比较。

型号BLEU⬆METEOR⬆编辑距离⬇
Pix2tex0.3826590.5433630.352533
nougat0.6976670.6683310.288159
texify0.8423490.8857310.0651534

运行自己的基准测试

您可以在您的机器上对texify的性能进行基准测试。

  • 按照上面的手动安装说明进行操作。
  • 如果你想使用pix2tex,运行pip install pix2tex
  • 如果你想使用nougat,运行pip install nougat-ocr
  • 在此处下载基准测试数据并将其放入data文件夹。
  • 像这样运行benchmark.py
pip install tabulate
python benchmark.py --max 100 --pix2tex --nougat --data_path data/bench_data.json --result_path data/bench_results.json

这将针对Pix2tex和nougat 对标记进行基准测试。它将使用texify和nougat进行批处理推理,但不使用Pix2tex,因为我找不到批处理选项。

  • --max是最多转换多少个基准图像。
  • --data_path–是基准数据的路径。如果省略它,它将使用默认路径。
  • --result_path–是基准测试结果的路径。如果省略它,它将使用默认路径。
  • --pix2tex specifies whether to run pix2tex (Latex-OCR) or not.
  • --nougat指定是否运行nougat。

六、其它

商业用途

该模型在公开许可的甜甜圈模型之上进行训练,因此可用于商业目的。模型权重在CC BY-SA 4.0许可下获得许可。


感谢

如果没有大量惊人的开源工作,这项工作是不可能的。我特别想感谢Lukas Blecher,他在Nougat和Pix2tex上的工作是这个项目的关键。我从他的代码中学到了很多,并将其中的一部分用于texify。

  • im2latex-用于训练的数据集之一
  • 甜甜圈来自Naver,texify的基本型号
  • nougat -我用了nougat 的代币
  • Latex-OCR-最初的开源Latex OCR项目

2024-07-21(日)

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

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

相关文章

数据结构(Java):优先级队列(堆)堆的模拟实现PriorityQueue集合

目录 1、优先级队列 1.1 概念 1.2 PriorityQueue底层结构 2、 堆 2.1 堆的概念 2.2 堆的存储结构 3、优先级队列(堆)的模拟实现 3.1 堆的创建 3.1.1 向下调整算法建完整堆 3.2 堆的插入 3.2.1 向上调整算法 3.3 堆的删除 3.4 堆排序 4、Pri…

Java实现随机题库-全站最呆瓜思想,保证你能学会

目录 Blue留言 : 学本篇文章之前所需掌握技能 推荐视频: 代码逻辑思想 步骤: 1、引入依赖 2、做一个excel表格 3、java实现从excel表中取数据 第一步:根据excel上面的字段名(如下图)&#xff0…

Python应用开发——30天学习Streamlit Python包进行APP的构建(18):定制组件

Custom components定制组件 st.components.v1.declare_component 创建自定义组件,并在有 ScriptRunContext 的情况下进行注册。 如果没有 ScriptRunContext,则不会注册该组件。当自定义组件作为独立命令执行时(如用于测试),可能会出现这种情况。 要使用该函数,请从 s…

网络安全常用易混术语定义与解读(Top 20)

没有网络安全就没有国家安全,网络安全已成为每个人都重视的话题。随着技术的飞速发展,各种网络攻击手段层出不穷,保护个人和企业的信息安全显得尤为重要。然而,在这个复杂的领域中,许多专业术语往往让人感到困惑。为了…

分布式系列之ID生成器

背景 在分布式系统中,当数据库数据量达到一定量级后,需要进行数据拆分、分库分表操作,传统使用方式的数据库自有的自增特性产生的主键ID已不能满足拆分的需求,它只能保证在单个表中唯一,所以需要一个在分布式环境下都…

JavaScript进阶之作用域解构箭头函数

目录 一、作用域1.1 局部作用域1.2 全局作用域1.3 作用域链1.4 垃圾回收机制1.5 闭包1.6 变量提升 二、函数进阶2.1 函数提升2.2 函数参数2.3 箭头函数(重要) 三、解构赋值3.1 数组解构3.2 对象解构(重要重要) 一、作用域 1.1 局…

全自动蛋托清洗机介绍:

全自动蛋托清洗机,作为现代蛋品处理设备的杰出代表,凭借其高效、智能、环保的特性,正逐步成为蛋品加工行业的得力助手。 这款清洗机采用了先进的自动化设计理念,从进料、清洗到出料,全程无需人工干预,极大…

SpringCloud---服务注册(Eureka)

目录 前言 一.注册中心 二.CAP理论 三.常见的注册中心 四.Eureka 4.1搭建Eueka Server 4.2服务注册 4.3发现服务 4.4小结 学习专栏:http://t.csdnimg.cn/tntwg 前言 在SpringCloud里,我们可以发现一个巨大的问题,就是url是写死的&am…

如何在 Android 中删除和恢复照片

对于智能手机用户来说,相机几乎已经成为一种条件反射:你看到值得注意的东西,就拍下来,然后永远保留这段记忆。但如果那张照片不值得永远保留怎么办?众所周知,纸质快照拿在手里很难舍弃,而 Andro…

grafana大坑,es找不到时间戳 | No date field named timestamp found

grafana大坑,es找不到时间戳。最近我这边的es重新装了一遍,结果发现grafana连不上elasticsearch了(以下简称es),排查问题查了好久一直以为是es没有装成功或者两边的版本不兼容,最后才发现是数值类型问题 一…

一天搞定React(3)——Hoots组件

Hello!大家好,今天带来的是React前端JS库的学习,课程来自黑马的往期课程,具体连接地址我也没有找到,大家可以广搜巡查一下,但是总体来说,这套课程教学质量非常高,每个知识点都有一个…

【Node】npm i --legacy-peer-deps,解决依赖冲突问题

文章目录 🍖 前言🎶 一、问题描述✨二、代码展示🏀三、运行结果🏆四、知识点提示 🍖 前言 npm i --legacy-peer-deps,解决依赖冲突问题 🎶 一、问题描述 node执行安装指令时出现报错&#xff…

【QT】label适应图片(QImage)大小;图片适应label大小

目录 0.简介 1.详细代码 1)label适应img大小 2)img适应label大小 0.简介 一个小demo ,想在QLabel中放一张QImage的图片,我有一张图片叫【bird.jpg】,是提前放在资源文件中的,直接显示在label上后&#…

【网络】网络聊天室udp

网络聊天室udp 一、低耦合度代码1、代码2、测试结果 二、高耦合度代码1、服务端小改(1)维护一个unordered_map用户列表(2)服务端代码(3)客户端不改的情况下结果展示 2、大改客户端(udp全双工用多…

通过QT进行服务器和客户端之间的网络通信

客户端 client.pro #------------------------------------------------- # # Project created by QtCreator 2024-07-02T14:11:20 # #-------------------------------------------------QT core gui network #网络通信greaterThan(QT_MAJOR_VERSION, 4): QT widg…

饥荒dst联机服务器搭建基于Ubuntu

目录 一、服务器配置选择 二、项目 1、下载到服务器 2、解压 3、环境 4、启动面板 一、服务器配置选择 首先服务器配置需要2核心4G,4G内存森林加洞穴大概就占75% 之后进行服务器端口的开放: tcp:8082 tcp:8080 UDP:10888 UDP:10998 UDP:10999 共…

套接字编程一(简单的UDP网络程序)

文章目录 一、 理解源IP地址和目的IP地址二、 认识端口号1. 理解 "端口号" 和 "进程ID"2. 理解源端口号和目的端口号 三、 认识协议1. 认识TCP协议2. 认识UDP协议 四、 网络字节序五、 socket编程接口1. socket 常见API2. sockaddr结构(1&#…

输入设备应用编程-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板

输入设备应用编程 输入类设备编程介绍 什么是输入设备 输入设备(input 设备),如鼠标、键盘、触摸屏等,允许用户与系统交互 input 子系统 Linux系统通过input子系统管理多种输入设备 Input子系统提供统一的框架和接口&#xff…

网络编程之LINUX信号

注意发送信号是给进程,不是线程,调用的是KILL函数,SIG是信号种类。pid0是本进程的其他的进程。 可以通过设置ERRNO来查看返回的错误,如下: 当目标进程收到信号后,要对信号进行一些执行操作: 定义…

[每周一更]-(第106期):DNS和SSL协作模式

文章目录 什么是DNS?DNS解析过程DNS解析的底层逻辑 什么是SSL?SSL证书SSL握手过程SSL的底层逻辑 DNS与SSL的协同工作过程 什么是DNS? DNS(Domain Name System,域名系统)是互联网的重要组成部分&#xff0c…