当前位置: 首页 > news >正文

基于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任务进行微调训练_-_训练过程
完整代码在文末

数据集介绍

数据集采用的是 开源的AI-ModelScope/LaTeX_OCR/

https://modelscope.cn/datasets/AI-ModelScope/LaTeX_OCR/summary

程序中下载的是full

本仓库有 5 个数据集

small 是小数据集,样本数 110 条,用于测试
full 是印刷体约 100k 的完整数据集。实际上样本数略小于 100k,因为用 LaTeX 的抽象语法树剔除了很多不能渲染的 LaTeX。
synthetic_handwrite 是手写体 100k 的完整数据集,基于 full 的公式,使用手写字体合成而来,可以视为人类在纸上的手写体。样本数实际上略小于 100k,理由同上。
human_handwrite 是手写体较小数据集,更符合人类在电子屏上的手写体。主要来源于 CROHME。我们用 LaTeX 的抽象语法树校验过了。
human_handwrite_print 是来自 human_handwrite 的印刷体数据集,公式部分和 human_handwrite 相同,图片部分由公式用 LaTeX 渲染而来。

代码实现

代码实现对LaTeX OCR相关数据集的下载、处理以及格式转换,使其能够适用于后续的模型训练等任务。先是从ModelScope平台下载包含图片与LaTeX文本的数据集,经过处理生成对应的CSV文件,然后再将CSV文件转换为特定格式的JSON文件,并按照一定比例划分出训练集和验证集。

请添加图片描述LaTeX_OCR 存储的图像文件

latex_ocr_train.csv 文件里面是生成图像路径和文本,是一一对应的。
该文件是中间生成
请添加图片描述
latex_ocr_train.json和latex_ocr_val.json训练使用的数据

[{"id": "identity_9001","conversations": [{"role": "user","value": "/home/sss/datasets/LaTeX_OCR/9000.jpg"},{"role": "assistant","value": "\\ln { \\mathcal J } = - 2 i \\alpha \\mathrm { T r } \\left[ \\gamma _ { 5 } \\varphi ( \\frac { \\not \\! \\! D } { \\Lambda } ) \\right]"}]},{"id": "identity_9002","conversations": [{"role": "user","value": "/home/sss/datasets/LaTeX_OCR/9001.jpg"},{"role": "assistant","value": "{ \\cal P } _ { * } ( \\chi ) \\propto \\exp [ 3 N ( \\chi ) ] ."}]},{"id": "identity_9003","conversations": [{"role": "user","value": "/home/sss/datasets/LaTeX_OCR/9002.jpg"},{"role": "assistant","value": "M ( S , R ) _ { n } = \\left( \\begin{matrix} { 1 } & { 0 } \\\\ { 1 } & { 1 } \\\\ \\end{matrix} \\right) ^ { \\otimes ( n - 1 ) } \\ ,"}]},
import os
from modelscope.msdatasets import MsDataset
import pandas as pd
import json
import argparsedef download_and_process_dataset(max_data_number: int, dataset_id: str, subset_name: str, split: str, dataset_dir: str, csv_path: str) -> None:"""从ModelScope下载数据集并处理成图片和LaTeX文本对。Args:max_data_number (int): 最大处理图片数量。dataset_id (str): ModelScope上数据集的标识符。subset_name (str): 数据集中子集的名称。split (str): 数据集的划分('train', 'test' 等)。dataset_dir (str): 图片保存目录。csv_path (str): 包含图片路径和LaTeX文本的CSV文件保存路径。"""# 从ModelScope加载数据集ds = MsDataset.load(dataset_id, subset_name=subset_name, split=split)print(f"加载的数据集包含 {len(ds)} 项")# 限制处理的总项数total = min(max_data_number, len(ds))# 如果不存在,则创建保存图片的目录os.makedirs(dataset_dir, exist_ok=True)# 初始化列表以存储图片路径及其对应的LaTeX文本image_paths = []texts = []for i in range(total):item = ds[i]text = item['text']image = item['image']# 保存图片并记录其路径image_path = os.path.abspath(os.path.join(dataset_dir, f'{i}.jpg'))image.save(image_path)# 将路径和文本添加到列表中image_paths.append(image_path)texts.append(text)# 每处理50张图片打印一次进度if (i + 1) % 50 == 0:print(f'正在处理第 {i+1}/{total} 张图片 ({(i+1)/total*100:.1f}%)')# 使用收集的数据创建DataFrame并保存为CSV文件df = pd.DataFrame({'image_path': image_paths,'text': texts,})df.to_csv(csv_path, index=False)print(f'数据处理完成,共处理了 {total} 张图片。')def convert_csv_to_json(csv_path: str, train_json_path: str, val_json_path: str, split_ratio: float) -> None:"""将CSV文件转换为JSON文件,并按照给定的比例划分训练集和验证集。Args:csv_path (str): CSV文件路径。train_json_path (str): 训练集JSON文件保存路径。val_json_path (str): 验证集JSON文件保存路径。split_ratio (float): 划分训练集和验证集的比例(例如:0.8 表示 80% 的数据作为训练集)。"""df = pd.read_csv(csv_path)conversations = []# 创建对话格式for i in range(len(df)):conversations.append({"id": f"identity_{i+1}","conversations": [{"role": "user","value": f"{df.iloc[i]['image_path']}"},{"role": "assistant", "value": str(df.iloc[i]['text'])}]})# 根据比例划分训练集和验证集split_index = int(len(conversations) * split_ratio)train_conversations = conversations[:split_index]val_conversations = conversations[split_index:]# 保存训练集with open(train_json_path, 'w', encoding='utf-8') as f:json.dump(train_conversations, f, ensure_ascii=False, indent=2)# 保存验证集with open(val_json_path, 'w', encoding='utf-8') as f:json.dump(val_conversations, f, ensure_ascii=False, indent=2)print(f'数据已成功转换并保存为 JSON 文件,训练集: {train_json_path}, 验证集: {val_json_path}')def main():"""主函数,用于处理命令行参数并调用相应的处理函数。"""# 设置参数解析器parser = argparse.ArgumentParser(description='下载并处理LaTeX OCR数据集,并将其转换为JSON格式')parser.add_argument('--max_data_number', type=int, default=10000, help='最大处理图片数量')parser.add_argument('--dataset_id', type=str, default='AI-ModelScope/LaTeX_OCR', help='ModelScope上的数据集ID')parser.add_argument('--subset_name', type=str, default='default', help='数据集中的子集名称')parser.add_argument('--split', type=str, default='train', help='数据集的划分(train/test等)')parser.add_argument('--dataset_dir', type=str, default='LaTeX_OCR', help='图片保存目录')parser.add_argument('--csv_path', type=str, default='./latex_ocr_train.csv', help='CSV文件保存路径')parser.add_argument('--train_json_path', type=str, default='./latex_ocr_train.json', help='训练集JSON文件保存路径')parser.add_argument('--val_json_path', type=str, default='./latex_ocr_val.json', help='验证集JSON文件保存路径')parser.add_argument('--split_ratio', type=float, default=0.9, help='训练集与验证集的划分比例(如0.9表示90%训练集,10%验证集)')args = parser.parse_args()# 检查数据集目录是否已存在if not os.path.exists(args.dataset_dir):download_and_process_dataset(args.max_data_number, args.dataset_id, args.subset_name, args.split, args.dataset_dir, args.csv_path)else:print(f'{args.dataset_dir} 目录已存在,跳过数据处理步骤。')# 转换CSV至JSON,并进行数据集划分convert_csv_to_json(args.csv_path, args.train_json_path, args.val_json_path, args.split_ratio)if __name__ == '__main__':main()

说明

1. 代码结构

LaTeXOCRDatasetProcessor
  • __init__方法:作为类的初始化函数,用于接收多个与数据集处理相关的参数,例如最大处理图片数量、数据集在ModelScope上的标识符、各种文件(图片、CSV、训练集JSON、验证集JSON)的保存路径以及训练集和验证集的划分比例等,将这些参数保存为类的属性,方便后续方法中使用。

  • download_and_process_dataset方法

    • 首先,从ModelScope平台加载指定的数据集,依据设定的最大处理图片数量,限制实际要处理的数据项数。
    • 接着,检查并创建用于保存图片的本地目录(若不存在的话)。
    • 然后,遍历数据集(在限制数量范围内),针对每条数据,获取其中的图片和LaTeX文本内容,将图片保存到本地指定目录,并记录其绝对路径,同时把图片路径与对应的LaTeX文本分别添加到对应的列表中。在处理过程中,每处理50张图片就打印一次处理进度,方便了解处理情况。
    • 最后,利用收集好的图片路径列表和LaTeX文本列表创建一个DataFrame,并将其保存为CSV文件,至此完成从原始数据集到CSV文件的处理流程,使得数据以一种更规整的格式存储,便于后续进一步操作。
  • convert_csv_to_json方法

    • 先读取之前生成的CSV文件内容到DataFrame中,然后按照特定的对话格式要求,遍历DataFrame中的每一行数据,将图片路径作为“用户”角色的内容,对应的LaTeX文本作为“助手”角色的内容,构建出一个个对话形式的字典,并添加到conversations列表中,以此将数据整理成符合后续训练要求的格式。
    • 之后,依据设定的划分比例,计算出训练集和验证集的分割索引,从而将conversations列表中的数据划分为训练集和验证集两部分。
    • 最后,分别将训练集和验证集的数据以JSON格式保存到对应的文件路径下,完成数据集格式的最终转换以及训练集、验证集的划分工作,生成的JSON文件可直接用于如模型训练等相关任务中。
main函数
  • 首先,利用argparse库创建一个命令行参数解析器,定义了多个与数据集处理相关的参数,如各类文件路径、最大处理数量、划分比例等,并设置了相应的默认值和帮助信息,方便用户在运行代码时可以灵活指定不同的参数值,以满足不同的需求。
  • 接着,解析命令行参数得到具体的参数值,然后使用这些参数值实例化LaTeXOCRDatasetProcessor类对象,创建一个专门用于处理数据集的实例。
  • 之后,通过判断图片保存目录是否已存在,来决定是否调用download_and_process_dataset方法执行数据集下载及处理成CSV文件的步骤。如果目录已存在,就跳过这一步,避免重复处理。
  • 最后,无论前面是否执行了下载处理步骤,都会调用convert_csv_to_json方法,将已有的(可能是刚生成的,也可能是之前就存在的)CSV文件转换为JSON文件,并划分出训练集和验证集,完成整个数据集处理及准备工作的完整流程。

2. 主程序

if __name__ == '__main__'部分启动整个程序,调用main函数,按照上述main函数中的逻辑依次执行,先是解析命令行参数,接着实例化数据集处理类并根据实际情况处理数据集、转换格式并划分训练集和验证集,最终得到可用于后续任务

相关文章:

基于Qwen2-VL模型针对LaTeX OCR任务进行微调训练 - 数据处理

基于Qwen2-VL模型针对LaTeX OCR任务进行微调训练 - 数据处理 flyfish 基于Qwen2-VL模型针对LaTeX_OCR任务进行微调训练_-_LoRA配置如何写 基于Qwen2-VL模型针对LaTeX_OCR任务进行微调训练_-_单图推理 基于Qwen2-VL模型针对LaTeX_OCR任务进行微调训练_-_原模型_单图推理 基于Q…...

Microi吾码|开源低代码.NET、VUE低代码项目,表单引擎介绍

Microi吾码|开源低代码.NET、VUE低代码项目,表单引擎介绍 一、摘要二、Microi吾码介绍2.1 功能介绍2.2 团队介绍2.3 上线项目案例 三、Microi吾码表单引擎是什么?四、Microi吾码表单引擎功能4.1 模块引擎 - 由表单引擎驱动4.2 流程引擎 - 由表…...

[Ubuntu] Linux命令收集

1、移动文件夹内的所有文件和子文件夹: 如果你想移动一个文件夹内的所有内容到另一个目录,但不移动该文件夹本身,你可以使用以下命令: 源:/home/ubuntu/www/demo/web下的所有文件及文件夹; 目标&#xf…...

鸿蒙应用ArkTS开发-利用axios进行网络请求(实现前后端交互)

引言: 我们上一章实现了简单的登录注册页面,今天小编来带着大家实现完整的登录注册功能。 一、后端的搭建 Spring Boot介绍:Spring Boot是一个用于简化Spring应用程序开发的开源框架。它通过自动配置、内置服务器和预设的最佳实践&#xff0…...

【开源】使用环信UIKit for uniapp 做一个IM即时聊天应用

环信单群聊 UIKit 是基于环信即时通讯云 IM SDK 开发的一款即时通讯 UI 组件库,提供各种组件实现会话列表、聊天界面、联系人列表及后续界面等功能,帮助开发者根据实际业务需求快速搭建包含 UI 界面的即时通讯应用。 本文教大家使用环信 uniapp UIKit 快…...

计算机网络知识点全梳理(一.TCP/IP网络模型)

目录 TCP/IP网络模型概述 应用层 什么是应用层 应用层功能 应用层协议 传输层 什么是传输层 传输层功能 传输层协议 网络层 什么是网络层 网络层功能 网络层协议 数据链路层 什么是数据链路层 数据链路层功能 物理层 物理层的概念和功能 写在前面 本系列文…...

神州数码DCME-320 online_list.php存在任意文件读取漏洞

免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...

神经网络基础-神经网络搭建和参数计算

文章目录 1.构建神经网络2. 神经网络的优缺点 1.构建神经网络 在 pytorch 中定义深度神经网络其实就是层堆叠的过程,继承自nn.Module,实现两个方法: __init__方法中定义网络中的层结构,主要是全连接层,并进行初始化。…...

Linux入门攻坚——41、Linux集群系统入门-lvs(2)

lvs-dr:GATEWAY Director只负责请求报文,响应报文不经过Director,直接由RS返回给Client。 lvs-dr的报文路线如上图,基本思路就是报文不会回送Director,第①种情况是VIP、DIP、RIP位于同一个网段,这样&…...

音视频入门基础:MPEG2-TS专题(17)——FFmpeg源码中,解析TS program map section的实现

一、引言 由《音视频入门基础:MPEG2-TS专题(16)——PMT简介》可以知道,PMT表(Program map table)由一个或多个段(Transport stream program map section,简称TS program map sectio…...

了解https原理,对称加密/非对称加密原理,浏览器与服务器加密的进化过程,https做了些什么

最开始的加密 浏览器与服务器之间需要防止传输的数据被黑客破解。因此,浏览器在发送数据时会对数据进行加密,并把加密的密钥(或密钥的某些部分)放在数据的某一个区域中。服务器收到数据后,会提取密钥并用它来解密数据…...

山西省第十八届职业院校技能大赛高职组 5G 组网与运维赛项规程

山西省第十八届职业院校技能大赛高职组 5G 组网与运维赛项规程 一、赛项名称 赛项编号:GZ035 赛项名称:5G 组网与运维 赛项组别:高职学生组、教师组 二、竞赛目的 2019 年 6 月 6 日,5G 牌照正式发放,标志着我国全面进…...

tcpdump编译 wireshark远程抓包

https://github.com/westes/flex/releases/download/v2.6.4/flex-2.6.4.tar.gz tar -zxvf flex-2.6.4.tar.gz ./configure CFLAGS-D_GNU_SOURCE make sudo make installwget http://ftp.gnu.org/gnu/bison/bison-3.2.1.tar.gz ./configure make sudo make install以上两个库是…...

Web开发 -前端部分-CSS

CSS CSS&#xff08;Cascading Style Sheet&#xff09;:层叠样式表&#xff0c;用于控制页面的样式&#xff08;表现&#xff09;。 一 基础知识 1 标题格式 标题格式一&#xff1a; 行内样式 <!DOCTYPE html> <html lang"en"><head><meta…...

用 Python Turtle 绘制流动星空:编程中的璀璨星河

用 Python Turtle 绘制流动星空&#xff1a;编程中的璀璨星河 &#x1f438; 前言 &#x1f438;&#x1f41e;往期绘画>>点击进所有绘画&#x1f41e;&#x1f40b; 效果图 &#x1f40b;&#x1f409; 代码 &#x1f409; &#x1f438; 前言 &#x1f438; 夜空中繁星…...

Java从入门到工作2 - IDEA

2.1、项目启动 从git获取到项目代码后&#xff0c;用idea打开。 安装依赖完成Marven/JDK等配置检查数据库配置启动相关服务 安装依赖 如果个别依赖从私服下载不了&#xff0c;可以去maven官网下载补充。 如果run时提示程序包xx不存在&#xff0c;在项目目录右键Marven->Re…...

fastadmin批量压缩下载远程视频文件

后端代码 // 批量下载并压缩 public function downloadAll(){$ids input(ids);$row $this->model->where(id, in, $ids)->field(id,title,video_url)->select();if (!$row) {$this->error(记录不存在);}$arr [];$tempFiles []; // 用来存储临时下载的视频文…...

【保姆级】Mac如何安装+切换Java环境

本文从如何下载不同版本的JDK,到如何丝滑的切换JDK,以及常见坑坑的处理方法,应有尽有,各位看官走过路过不要错过~~~ 下载⏬ 首先上官网: https://www.oracle.com/ 打不开的话可以使用下面👇这个中文的 https://www.oracle.com/cn/java/technologies/downloads/a…...

2024首届世界酒中国菜国际地理标志产品美食文化节成功举办篇章

2024首届世界酒中国菜国际地理标志产品美食文化节成功举办&#xff0c;开启美食文化交流新篇章 近日&#xff0c;首届世界酒中国菜国际地理标志产品美食文化节在中国国际地理标志大厦成功举办&#xff0c;这场为期三天的美食文化盛会吸引了来自世界各地的美食爱好者、行业专家…...

Springboot静态资源

默认位置 静态资源访问目录下的资源可以直接访问&#xff0c;默认的四个位置 classpath:/META-INF/resources/&#xff08;默认加载&#xff0c;不受自定义配置的影响&#xff09; classpath:/resources/ classpath:/static/ classpath:/public/ 如果在静态目录下存在favic…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

DBLP数据库是什么?

DBLP&#xff08;Digital Bibliography & Library Project&#xff09;Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高&#xff0c;数据库文献更新速度很快&#xff0c;很好地反映了国际计算机科学学术研…...

rknn toolkit2搭建和推理

安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 &#xff0c;不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源&#xff08;最常用&#xff09; conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践

在 Kubernetes 集群中&#xff0c;如何在保障应用高可用的同时有效地管理资源&#xff0c;一直是运维人员和开发者关注的重点。随着微服务架构的普及&#xff0c;集群内各个服务的负载波动日趋明显&#xff0c;传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...

【实施指南】Android客户端HTTPS双向认证实施指南

&#x1f510; 一、所需准备材料 证书文件&#xff08;6类核心文件&#xff09; 类型 格式 作用 Android端要求 CA根证书 .crt/.pem 验证服务器/客户端证书合法性 需预置到Android信任库 服务器证书 .crt 服务器身份证明 客户端需持有以验证服务器 客户端证书 .crt 客户端身份…...

命令行关闭Windows防火墙

命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)​方法二:CMD命令…...