基于Qwen2-VL模型针对LaTeX OCR任务进行微调训练 - 多图推理

基于Qwen2-VL模型针对LaTeX OCR任务进行微调训练 - 多图推理

flyfish

基于Qwen2-VL模型针对LaTeX_OCR任务进行微调训练_-_LoRA配置如何写
基于Qwen2-VL模型针对LaTeX_OCR任务进行微调训练_-_单图推理
基于Qwen2-VL模型针对LaTeX_OCR任务进行微调训练_-_原模型_单图推理
基于Qwen2-VL模型针对LaTeX_OCR任务进行微调训练_-_原模型_多图推理
基于Qwen2-VL模型针对LaTeX_OCR任务进行微调训练_-_多图推理
基于Qwen2-VL模型针对LaTeX_OCR任务进行微调训练_-_数据处理
基于Qwen2-VL模型针对LaTeX_OCR任务进行微调训练_-_训练
基于Qwen2-VL模型针对LaTeX_OCR任务进行微调训练_-_训练过程
输入两张图像

请添加图片描述
请添加图片描述
输出
请添加图片描述
可视化
Image 1:
E m m ˉ = 2 7 Q c π 1 / 2 Γ ( 1 / 4 ) 2 log ⁡ ( L 0 / L ) L ∫ 1 ∞ d y y 2 y 4 − 1 . E _ { m \bar { m } } = \frac { 2 ^ { 7 } \sqrt { Q _ { c } } \pi ^ { 1 / 2 } } { \Gamma ( 1 / 4 ) ^ { 2 } } \frac { \log \left( L _ { 0 } / L \right) } { L } \int _ { 1 } ^ { \infty } d y \frac { y ^ { 2 } } { \sqrt { y ^ { 4 } - 1 } } . Emmˉ=Γ(1/4)227Qc π1/2Llog(L0/L)1dyy41 y2.

Image 2:
u ( τ ) ‾ = u ( − τ ˉ ) , u ( τ + 1 ) = − u ( τ ) , \overline { { u ( \tau ) } } = u ( - \bar { \tau } ) , \qquad \qquad u ( \tau + 1 ) = - u ( \tau ) , u(τ)=u(τˉ),u(τ+1)=u(τ),

import argparse
from transformers import Qwen2VLForConditionalGeneration, AutoProcessor
from qwen_vl_utils import process_vision_info
from peft import PeftModel, LoraConfig, TaskType
import torch

class LaTeXOCR:
    def __init__(self, local_model_path, lora_model_path):
        self.local_model_path = local_model_path
        self.lora_model_path = lora_model_path
        self._load_model_and_processor()

    def _load_model_and_processor(self):
        config = LoraConfig(
            task_type=TaskType.CAUSAL_LM,
            target_modules=[
                "q_proj", "k_proj", "v_proj", "o_proj",
                "gate_proj", "up_proj", "down_proj",
            ],
            inference_mode=True,
            r=64,
            lora_alpha=16,
            lora_dropout=0.05,
            bias="none",
        )

        self.model = Qwen2VLForConditionalGeneration.from_pretrained(
            self.local_model_path, torch_dtype=torch.float16, device_map="auto"
        )
        self.model = PeftModel.from_pretrained(
            self.model, self.lora_model_path, config=config
        )
        self.processor = AutoProcessor.from_pretrained(self.local_model_path)

    def generate_latex_from_images(self, test_image_paths, prompt):
        """
        根据给定的测试图像路径列表和提示信息,生成对应的LaTeX格式文本。

        参数:
            test_image_paths (list of str): 包含数学公式的测试图像路径列表。
            prompt (str): 提供给模型的提示信息。

        返回:
            list of str: 转换后的LaTeX格式文本列表。
        """
        results = []
        for image_path in test_image_paths:
            messages = [
                {
                    "role": "user",
                    "content": [
                        {
                            "type": "image",
                            "image": image_path,
                            "resized_height": 100,
                            "resized_width": 500,
                        },
                        {"type": "text", "text": prompt},
                    ],
                }
            ]

            text = self.processor.apply_chat_template(
                messages, tokenize=False, add_generation_prompt=True
            )
            image_inputs, video_inputs = process_vision_info(messages)
            inputs = self.processor(
                text=[text],
                images=image_inputs,
                videos=video_inputs,
                padding=True,
                return_tensors="pt",
            )
            inputs = inputs.to("cuda" if torch.cuda.is_available() else "cpu")

            with torch.no_grad():
                generated_ids = self.model.generate(**inputs, max_new_tokens=8192)

            generated_ids_trimmed = [
                out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)
            ]
            output_text = self.processor.batch_decode(
                generated_ids_trimmed,
                skip_special_tokens=True,
                clean_up_tokenization_spaces=False,
            )

            results.append(output_text[0])
        
        return results


def parse_arguments():
    parser = argparse.ArgumentParser(description="LaTeX OCR using Qwen2-VL")

    parser.add_argument(
        "--local_model_path",
        type=str,
        default="./Qwen/Qwen2-VL-7B-Instruct",
        help='Path to the local model.',
    )
    parser.add_argument(
        "--lora_model_path",
        type=str,
        default="./output/Qwen2-VL-7B-LatexOCR/checkpoint-1500",
        help='Path to the LoRA model checkpoint.',
    )
    parser.add_argument(
        "--test_image_paths",
        nargs='+',  # 接受多个参数
        type=str,
        default=["./LaTeX_OCR/987.jpg", "./LaTeX_OCR/986.jpg"],  # 设置默认值为两个图像路径
        help='Paths to the test images.',
    )

    return parser.parse_args()


if __name__ == "__main__":
    args = parse_arguments()

    prompt = (
        "尊敬的Qwen2VL大模型,我需要你帮助我将一张包含数学公式的图片转换成LaTeX格式的文本。\n"
        "请按照以下说明进行操作:\n"
        "1. **图像中的内容**: 图像中包含的是一个或多个数学公式,请确保准确地识别并转换为LaTeX代码。\n"
        "2. **公式识别**: 请专注于识别和转换数学符号、希腊字母、积分、求和、分数、指数等数学元素。\n"
        "3. **LaTeX语法**: 输出时使用标准的LaTeX语法。确保所有的命令都是正确的,并且可以被LaTeX编译器正确解析。\n"
        "4. **结构保持**: 如果图像中的公式有特定的结构(例如多行公式、矩阵、方程组),请在输出的LaTeX代码中保留这些结构。\n"
        "5. **上下文无关**: 不要尝试解释公式的含义或者添加额外的信息,只需严格按照图像内容转换。\n"
        "6. **格式化**: 如果可能的话,使输出的LaTeX代码易于阅读,比如适当添加空格和换行。"
    )

    latex_ocr = LaTeXOCR(args.local_model_path, args.lora_model_path)
    results = latex_ocr.generate_latex_from_images(args.test_image_paths, prompt)

    for i, result in enumerate(results):
        print(f"Image {i + 1}:")
        print(result)
        print("-" * 80)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

好玩的汇编编译器NASM:一款基于x86架构的汇编与反汇编软件

好玩的汇编编译器NASM This is the project webpage for the Netwide Assembler (NASM), an asssembler for the x86 CPU architecture portable to nearly every modern platform, and with code generation for many platforms old and new. Netwide Assembler(…

Bootstrap-HTML(六)Bootstrap按钮

Bootstrap按钮与按钮组 前言一、Bootstrap按钮(一)、内置按钮样式(二)、按钮边框设置(三)、按钮尺寸调整(四)、块级按钮创建(五)、活动 / 禁用按钮设置 二、B…

储能技术方案综述

全球电量浪费现状 根据国际可再生能源机构(IRENA)和其他研究机构的数据,全球范围内光伏和风电的电量浪费主要表现为发电弃风弃光、输电损耗和储能不足等方面。 弃风弃光现象 弃风率:指风电场在有风时未能发出的电量占总发电量的比…

深入探索:createThread与cancelThread的用法及实例

在多线程编程领域,线程的创建与管理是核心技能之一。本文将详细介绍两个关键函数:createThread(用于创建新线程)和cancelThread(用于取消已存在的线程),并通过具体实例展示它们的用法。需要注意的是,不同的编程语言和线程库可能有不同的API设计,但基本概念是相通的。本…

Java基础学习:java常用启动命令

一、java -jar 1、系统属性传递 使用形式:java -DpathD:\jacoco -jar 获取方式:System.getProperties() 2、系统参数传递 使用形式:java -jar application.jar --jacocoPathD:\tomcat 获取方式:通过启动方法入口main的参数arg…

guava 整合springboot 自定义注解实现接口鉴权调用保护

文章目录 一、简要概述二、实现过程1. pom引入依赖2. 自定义注解3. 定义切面4. 定义权限检查逻辑 三、注解使用四、运行结果五、源码放送 一、简要概述 Guava Cache是一个全内存的本地缓存实现,它提供了线程安全的实现机制。我们借助expireAfterWrite过期时间设置和…

nginx 部署 ModSecurity3

一、查看本地nginx版本 nginx是yum安装的 # nginx -v nginx version: nginx/1.26.2 二、安装依赖工具 # yum install -y gcc-c flex bison yajl lmdb lua curl-devel curl GeoIP-devel zlib-devel pcre-devel pcre2-devel libxml2-devel ssdeep-devel libtool autoconf aut…

threejs——无人机概念切割效果

主要技术采用着色器的切割渲染,和之前写的风车可视化的文章不同,这次的切割效果是在着色器的基础上实现的,并新增了很多可调节的变量,兄弟们,走曲儿~ 线上演示地址,点击体验 源码下载地址,点击下载 正文 从图中大概可以看出以下信息,一个由线组成的无人机模型,一个由…

【LeetCode】每日一题 2024_12_13 K 次乘运算后的最终数组 I(暴力)

前言 每天和你一起刷 LeetCode 每日一题~ 小聊两句 1、今天是 12.13 南京大屠杀国家公祭日。铭记历史,勿忘国耻。 2、今天早上去看了 TGA 年度游戏颁奖,小机器人拿下了年度最佳游戏,所有人都震惊了,大伙纷纷问到,谁…

向达梦告警日志说声hello

为了调试和跟踪一些业务功能,通常会创建一个日志表,写入每个关键步骤的信息。也可以向达梦数据库的告警日志输出信息,然后通过查看告警日志即可。 在达梦的告警日志中输出一个信息可以这样 SQL> DBMS_SYSTEM.KSDWRT(2,hi dm);

MySQL 索引事务

目录 1. 索引是什么 2. 索引的相关操作 3. 索引的原理 4. 事务是什么 5. 事务的使用 6. 事务的原理 1. 索引是什么 索引是用来加快查询的机制,是针对某个表的指定列来设置的,查询条件如果就是使用这个带有索引的列来查询,那么查询速度…

基于django协同过滤的音乐推荐系统的设计与实现

一、摘要 随着现代音乐的快速发展,协同过滤的音乐推荐系统已成为人们业余生活的需求。该平台采用Python技术和django搭建系统框架,后台使用MySQL数据库进行信息管理;通过用户管理、音乐分类管理、音乐信息管理、歌曲数据管理、系统管理、我的…

代码随想录算法训练营第51期第14天 | 226. 翻转二叉树、101. 对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度

226. 翻转二叉树 226. 翻转二叉树https://leetcode.cn/problems/invert-binary-tree/1.昨天忘了声明,如果都用C的话,我大概率写不完,所以思路方面,我可能考虑用pyhon先写,后续会用文心一言转换成C 2.这里可以直接用层…

雨晨 24H2 IoT 企业版 ltsc 2024 Hotpatch 极简 26100.2605

文件: 雨晨 24H2 IoT 企业版 ltsc 2024 Hotpatch 极简 26100.2605 install.esd 大小: 1970652896 字节 修改时间: 2024年12月13日, 星期五, 18:06:39 MD5: 3DCB989B62B6656B2CB34B0D88EBEE45 SHA1: C6E890223892B7A3EDA59E4881C70214DD546DB7 CRC32: 13EDFA89 与往版&#xff…

AI大模型开发实战:基于LangGraph、Ollama构建本地AI智能体

一、理解 AI 智能体 AI 智能体是能够感知其环境并采取行动以实现特定目标的实体或系统。这些智能体可以从简单的算法到能够进行复杂决策的复杂系统。 以下是关于 AI 智能体的一些关键点: (1)感知(Perception)&#x…

SpringCloud微服务开发(三)网关

目录 1.网关概述 2.网关路由 3.网关登录校验 3.1自定义过滤器 3.2实现登录校验 3.3微服务获取用户 3.4OpenFeign在不同微服务之间传递用户 4.网关配置管理 5.配置热更新 6.动态路由 1.网关概述 顾明思议,网关就是网络的关口。数据在网络间传输&#xff0…

利用DFT画有限长序列的DTFT

MATLAB中没有DTFT函数,计算机不可能给出连续结果,可以只能利用DFT的fft函数来实现。 %% L 7; x ones(1, L) figure; tiledlayout(2,3,"TileSpacing","tight") nexttile; stem([0:L-1],x) box off title([num2str(L), points rect…

MYSQL索引的分类和创建

目录 1、聚簇索引和非聚簇索引 tips: 小问题:主键为什么建议使用自增id? 2、普通索引 (常规索引)(normal) 3、唯一索引(UNIQUE ) 唯一索引和主键的区别: 唯一约束和唯一索引的区别&#…

Artec Leo3D扫描仪在重型机械设备定制中的应用【沪敖3D】

挑战:一家加拿大制造商需要有效的方法,为富于变化且难度较高的逆向工程,快速、安全、准确地完成重型机械几何采集。 解决方案:Artec Leo, Artec Studio, Geomagic for SOLIDWORKS 效果:Artec Leo三维扫描代替过去的手动…

数据驱动模型预测控制应用于自动驾驶车辆转向

Application of Data-driven Model Predictive Control for Autonomous Vehicle Steering 数据驱动模型预测控制应用于自动驾驶车辆转向 Abstract With the development of autonomous driving technology, there are increasing demands for vehicle control, and MPC has b…