基于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函数中的逻辑依次执行,先是解析命令行参数,接着实例化数据集处理类并根据实际情况处理数据集、转换格式并划分训练集和验证集,最终得到可用于后续任务

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

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

相关文章

QT从入门到精通——Qlabel介绍与使用

1. QT介绍——代码测试 Qt 是一个跨平台的应用程序开发框架,广泛用于开发图形用户界面(GUI)应用程序,也支持非图形应用程序的开发。Qt 提供了一套工具和库,使得开发者能够高效地构建高性能、可移植的应用程序。以下是…

Edge SCDN深度解析,边缘安全加速的创新实践

边缘安全加速(Edge Secure Content Delivery Network,SCDN)是酷盾安全推出的边缘集分布式 DDoS 防护、CC 防护、WAF 防护、BOT 行为分析为一体的安全加速解决方案。通过边缘缓存技术,智能调度使用户就近获取所需内容,为…

WebRTC Simulcast 大小流介绍与优化实践

Simulcast 是 WebRTC 中的一种标准化技术 ,简称大小流。通过 Simulcast,客户端可以同时发送同一视频的多个版本。每个版本都以不同的分辨率和帧率独立编码,带宽较多的拉流端可以接收较高质量的视频流,带宽有限的拉流端则可以接收较…

40分钟学 Go 语言高并发:服务监控与追踪

服务监控与追踪 一、知识要点总览 模块核心内容技术选型难度监控指标请求量、响应时间、错误率、资源使用Prometheus Grafana中链路追踪分布式调用链、性能瓶颈分析Jaeger, OpenTelemetry高日志处理日志收集、分析、存储ELK Stack中告警系统告警规则、通知渠道、告警分级Ale…

vue3 使用 konva

1&#xff1a;安装 npm install vue-konva konva --save 在main.ts 里面引入 import VueKonva from vue-konva; app.use(VueKonva); 2&#xff1a;效果图 3&#xff1a;直接粘贴复制就能用你 &#xff08;重要的地方做了备注&#xff09; <template><div st…

Spring Boot集成Knife4j文档工具

Knife4j 搭建 Knife4j环境的的搭建和Swagger一样都比较简单&#xff0c;只需要极简的配置即可。 maven依赖 我使用的是较高版本的基于openapi规范的依赖包&#xff0c;OpenAPI2(Swagger)规范是Knife4j之前一直提供支持的版本&#xff0c;底层依赖框架为Springfox。 此次在4…

keil5搜索框还有左侧文件状态栏不见的问题

点击上面的window&#xff0c;弹出 reset view to default &#xff0c;然后点击&#xff0c;再点击reset&#xff0c;就ok了

基于Mybatis,MybatisPlus实现数据库查询分页功能

基于Mybatis&#xff0c;MybatisPlus实现数据库查询分页功能 目录 基于Mybatis&#xff0c;MybatisPlus实现数据库查询分页功能使用Mybatis插件实现分页数据库准备分页插件配置和使用常用数据&#xff1a; 使用MybatisPlus插件实现分页数据库准备分页插件配置和使用自定义分页查…

HNU_多传感器(专选)_作业4(构建单层感知器实现分类)

1. (论述题)&#xff08;共1题&#xff0c;100分&#xff09; 假设平面坐标系上有四个点&#xff0c;要求构建单层感知器实现分类。 (3,3),(4,3) 两个点的标签为1&#xff1b; (1,1),(0,2) 两个点的标签为-1。 思路&#xff1a;要分类的数据是2维数据&#xff0c;需要2个输入…

内圆弧转子泵绘制工具开发

接着上期的Gerotor 泵的话题继续。最近有小伙伴找我开发一个内圆弧摆线泵的计算绘制工具&#xff0c;也就是把上次计算绘制的过程做成一个桌面应用工具&#xff0c;这样用起来会更方便、效率更高。那究竟是什么样的工具呢&#xff1f;一起来看看&#xff1a; 前面不是已经有了上…

面试技术点之安卓篇

一、基础 二、高级 三、组件 Android中SurfaceView和TextureView有什么区别&#xff1f; 参考 Android中SurfaceView和TextureView有什么区别&#xff1f; 四、三方框架 五、系统源码 六、性能优化

在Ubuntu 2404上使用最新的PicGo

在转向Ubuntu之后&#xff0c;果断下载了今年最新的Ubuntu2404,但是随之而来的是底层组件的更新&#xff0c;很多以前可以畅快使用的软件&#xff0c;因为需要老版本的组件而不能正确运行&#xff0c;PicGo就是如此 我们从这里打开Release列表 其中Ubuntu可用的只有这个AppIma…

用ue5打开网址链接

需要用到 Launch URL 这个函数 字面意思就是打开填写的链接网页 这里填写的是百度&#xff0c;按下Tab键后就会打开百度的网页

ISP(Image Signal Processor)——HDR技术总结

传统多帧融合技术 拍摄一系列不同曝光时长的图像帧&#xff08;LDR&#xff09;&#xff0c;然后使用融合算法进行融合成HDR图像。 融合算法可以分为两种 基于照度图估计的融合 基于照度估计需要拟合相机响应函数&#xff0c;详细可以参考如下论文&#xff1a; Recovering H…

C++打造局域网聊天室第七课: Socket编程初步2

文章目录 前言一、Socket的API函数二、服务端建立Socket步骤总结 前言 C打造局域网聊天室第七课&#xff1a; Socket编程初步2 一、Socket的API函数 接着上一课的内容&#xff0c;我们在chartroom.cpp中找到如下位置 插入断点&#xff0c;运行 运行到断点处后&#xff0c;按…

【razor】echo搭配relay功能分析

echo 要搭配relay 实现作者说relay在linux上跑,可以模拟丢包、延迟目前没看到如何模拟。relay监听9200,有俩作用 echopeer1 发relay,replay 把peer1的包给peer2 ,实现p2p能力。 接收端:采集后发送发给relay的 接收端的地址就是自己,的地址就是本地的9200,因此是让relay接…

Wallpaper壁纸制作学习记录11

操控变形动画介绍 操控变形是使用Wallpaper Engine为角色和某些对象创建复杂动画的一种高级方法。操控变形是一个多步骤过程&#xff0c;要求您有一个单独的图像图层&#xff0c;其中包含要制作动画的角色或对象的剪切图。 操控变形功能相对复杂&#xff0c;您也可以创建仅包含…

黑马程序员Java项目实战《苍穹外卖》Day12

苍穹外卖-day12 课程内容 工作台Apache POI导出运营数据Excel报表 功能实现&#xff1a;工作台、数据导出 工作台效果图&#xff1a; 数据导出效果图&#xff1a; 在数据统计页面点击数据导出&#xff1a;生成Excel报表 1. 工作台 1.1 需求分析和设计 1.1.1 产品原…

windows下Qt5自动编译配置QtMqtt环境

原文链接&#xff1a;windows下Qt5自动编译配置QtMqtt环境&#xff08;11&#xff09;-CSDN博客 1、概述 Qt默认是不包含mqtt库的&#xff0c;如果需要使用到mqtt库就只能自己编译配置&#xff1b;网络所有的QtMqtt配置的文章都是编译完成手动复制&#xff0c;非常麻烦&#x…

阿里云服务器Linux(centos)系统安装nginx1.20.2

阿里云服务器Linux(centos)系统安装nginx1.20.2 1.安装依赖包 一共要安装4种依赖&#xff08;基于c语言&#xff09; yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel2.下载nginx安装包并解压安装包 nginx官网下载&#xff1a;http://nginx.org/en/do…