从零开始使用GOT-OCR2.0——多模态OCR项目:微调数据集构建 + 训练(解决训练报错,成功实验微调训练)

        在上一篇文章记录了GOT-OCR项目的环境配置和基于官方模型参数的基础使用。环境安装的博文快速链接:

从零开始使用GOT-OCR2.0——多模态通用型OCR(非常具有潜力的开源OCR项目):项目环境安装配置 + 测试使用-CSDN博客

        本章在环境配置好的基础上,进一步研究官方给出的微调模型接口。在其官方源码论文中介绍了项目的整体架构——编码器和解码器,其中编码器使用的 ViTDet 的视觉Transformer模型,解码器使用的是通义千问的Qwen-0.5B语言模型。官方便捷接口只支持 Post-Train 仅训练解码器。具体可参加精读论文,快速链接地址:

【论文精读】GOT-OCR2.0源码论文——打破传统OCR流程的多模态视觉-语言大模型架构:预训练VitDet 视觉模型+ 阿里通义千问Qwen语言模型-CSDN博客

        GOT-OCR项目官方Github地址:https://github.com/Ucas-HaoranWei/GOT-OCR2.0

目录

一、微调解码器的数据集格式

        1.训练集的目录结构

        2.训练集标签JSON内容格式

        3.具体代码实现

       4.样例展示

二、官方指令解码器训练

        1.报错解决

        2.官方指令训练(修改增添版)

        3.测试结果(微调模型与官方原始模型效果对比)

        4.实验中的新发现

 


一、微调解码器的数据集格式

        (节省内容时间:可以直接跳转到本节第4部分样例展示——自行编程转化到样例格式就可以开始训练了

        官方指引下有三个位置是注意点,这些地方都可以在下载的源码中查看。

        一是,官方给出的样例标签 json 文件格式,在下载的本地源码 GOT-OCR2.0-main\assets\train_sample.jpg 位置就可以查看。

        二和三是需要修改源码py代码文件,分别在本地下载源码的 GOT-OCR-2.0-master\GOT\utils\constants.py 和 GOT-OCR-2.0-master\GOT\data\conversation_dataset_qwen.py 位置。

        结合这三个需要修改的地方,可以分析判断出数据集的大致构成结构。

        1.训练集的目录结构

        首先是训练数据集的文件结构。通过查看 constants.py 中的参数配置信息,并且结合另一个文件 conversation_dataset_qwen.py 37 行修改内容(官方指引),可以得知GOT-OCR解码器微调支持多个数据集的输入(如包括pdf文件数据集、场景图片ocr数据集等),详见下图。   

        示例数据给出了三个数据集的配置,每个数据集可以在不同的地址位置,数据集应包含图片数据的总文件夹,和一个json标签文件包含对应图片的所有标签训练信息。    

         在另一个代码修改处展示了如何指定不同类型数据集训练,如 pdf 数据的训练包含指定的data1和data2两个数据集。

        因此结合上述所有内容,可以指定,最终数据集生成后的目录结构样子应该如下。为了更清晰,这里把所有图片都放在 images 子目录下,在外面写一个 data1.json 保存标签信息。

        (还应注意到,官方这里没有做训练集和验证集的区分,在其使用指南中,后续有专门的验证模型val介绍,因此推测此处应该全部数据都是用来训练的,实际中还应留出一部分数据用来后面验证模型有没有过拟合或其他泛化性问题)

        2.训练集标签JSON内容格式

        然后就要具体看其标签文件(data1.json)的内容格式组成了。官方只给了一个样例图片,可以从中大致解读出大概结构。

        首先所有标签信息的数据构成一个大的列表保存在JSON文件中,列表中每个元素是对应每一张不同图片数据的标签信息字典

        字典结构中,键 “image” 的值对应图片名,键“conversations” 的值对应文本结果。至于conversations中为啥有两个信息,且一个是 “from:human”,一个“from:gpt”,有两种猜测:推测一——是可能数据OCR文本结果存在两种来源,一种是人工标注的,一种是gpt生成的;推测二——论文中表示其数据集是从官方数据集中抽取的,是不是“gpt”表示官方数据中的内容,而“human”代表还需要后续人工效验?

        总而言之,本文数据集构建不具体探究其中原因,因为样例数据给出中文本内容基本都是在“gpt”的value值中,所以暂定将自己的数据集文本也填入,而不去改变“human”的内容

        3.具体代码实现

        下面给出具体实现标签文件编写的代码。实际上只需将自己的数据集标签内容改写成上述分析的JSON格式即可。

        需要注意下述代码的标签文件是来自于对页面中每个字的分类目标检测结果,其原始的JSON格式如下,其中前四个是坐标信息,第五个是字的排序信息,表示该字在整段文章中对应第几个字,最后是这个字的具体字符。

        因此,如果是其他数据集格式,只需最终生成上一标题记录的标签JSON内容格式即可,可自行编程。

import os
import jsonclass GOT_Dataset_Creator:def __init__(self, dataset_path):self.dataset = dataset_pathdef generate_labels(self, image_path, label_path):save_list = []for file in os.listdir(image_path):if file.lower().endswith('jpg'):img_dict = {}img_dict['image'] = "images/"+filebase = file.split('.')[0]labeldir = os.path.join(label_path, base+'.json')with open(labeldir, 'r', encoding='utf-8') as f:word_list = json.load(f)if word_list!= []:conv_list = [{"from":"human","value":"<image>\nOCR: "}]textlst = [w[5] for w in word_list]text = ''.join(textlst)text_dict = {"from":"gpt", "value":text}conv_list.append(text_dict)img_dict["conversations"] = conv_listsave_list.append(img_dict)else:continue#print(save_list)savedir = os.path.join(self.dataset, 'data1.json')with open(savedir, 'w') as f:json.dump(save_list,f)if __name__=='__main__':image_path = \dataset\images  # 原始图片路径label_path = \dataset\labels # 原始标签路径dataset_path = \GOT-OCR_Dataset\dataset # GOT数据集保存路径gotdataset = GOT_Dataset_Creator(dataset_path)gotdataset.generate_labels(image_path, label_path)

       4.样例展示

         最终数据结构和之前分析的保持一致,然后还要修改代码,下图给出样例。

        (特别注意)在实际训练中还有几处需要特别注意的细节。下面给出具体图片展示。

        首先是构建好数据集,数据集目录格式和标签文本内容格式如下两图。

        然后修改源码两个文件conversation_dataset_qwen.py constants.py 内容。下图标注了注意细节点。

二、官方指令解码器训练

        1.报错解决

        在使用官方给出的指令训练时,会出现一些报错,下面记录其解决。

        首先是,官方使用的是 deepspeed 库来进行Transformer模型的微调加速训练,但是该库只支持 Linux 系统下运行, Windows系统运行会直接报错(找不到“deepspeed”指令等报错信息)。因此 GOT 项目模型的微调训练只支持Linux环境!

        然后是,关于CUDA环境的问题,在本文训练微调时,有一个库——“bitsandbytes”总会报找不到CUDA路径的问题,如下图所示。可能原因是,本机服务器安装的是CUDA12.4最新版本,而环境安装的是cu118。

         一种粗糙的解决办法是,替换这个库的版本,原版GOT中要求的是0.41.0版本,我更新到0.44.1版本后,虽然训练中还是会报错,但是不影响正常训练。

# 卸载原有包
pip uninstall bitsandbytes
# 安装新包
pip install bitsandbytes==0.44.1

        最后其他报错,如果在训练中遇到有什么包导入失败,显示“no module ...”,直接在命令行pip install安装即可。

        解决以上问题后,可以开始训练。

        2.官方指令训练(修改增添版)

        官方给出的指令并不能完全满足实际训练要求,这里新增了指定训练GPU的操作。下面先给出实际训练中,要根据自己文件数据修改的地方。

        下面一图总览。代码如下。

# 微调GOT解码器修改后的指令代码CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 deepspeed path/GOT/train/train_GOT.py --deepspeed path/zero_config/zero2.json --model_name_or_path path/GOT_weights/ --use_im_start_end True --bf16 True --gradient_accumulation_steps 2 --evaluation_strategy "no" --save_strategy "steps" --save_steps 200 --save_total_limit 1 --weight_decay 0. --warmup_ratio 0.001 --lr_scheduler_type "cosine" --logging_steps 1 --tf32 True --model_max_length 8192 --gradient_checkpointing True --dataloader_num_workers 8 --report_to none --per_device_train_batch_size 2 --num_train_epochs 1 --learning_rate 2e-5 --datasets gj-ocr --output_dir path/output

        3.测试结果(微调模型与官方原始模型效果对比)

        安装上述指令测试结果如下。

        训练过程信息打印如下。

        结果保存模型参数数据如下。可以在自己指定的文件夹下找到。

        继续可以把训练好的模型参数下载到要进行测试的目录,可以对比一下官方默认模型参数和经过微调后的模型识别部署效果

        本文微调使用的是7000+张繁体古文数据集(特别的,这里的古文数据集没有做任何标点分隔处理,每张图片对应一个“长文本”:无标点的文本),训练轮次使用10,其余训练参数默认官方。

        先看官方模型参数的OCR结果。可以看到官方的模型参数已经表现不错了,大部分以识别出来了,但是仍存在少部分字识别分类错误——对应右图红框内的字

        而且官方的训练集在文本部分是有“\t,\n”等如空格换行的分隔符的,因此其识别的OCR结果也对应有换行的效果,这也再次表现了多模态模型的优越性和强大的空间感知能力。

        再看经过自建数据集微调后的结果。可以看到字分类的正确率得到了明显提升——出错的为下图黄框内的字。并且语言模型的“可塑性”看起来很强,对应训练集对文本进行分割符,部署效果也是没有进行分段分行的。

        4.实验中的新发现

         对于密集型文字的识别效果,微调后的模型和官方模型对比差异就更加明显了。

        同时,本文实验发现,对于中分辨率的大图(大于1280*1280,小于6000*6000),可以直接构建数据集训练,也能得到很好的效果。

        官方模型在训练集中采用的都是1280*1280的方形图,而本文使用的数据集微调则不同——1.图片数据是不规则的,可能是竖直或平躺的矩形;2.图片数据大小不是固定的,可能是1345*2895这种的。

        下图对比展示了这种由训练数据集差异导致的部署效果差异。可以看到官方模型是无法直接识别这种长宽大于1280*1280且文字密集的数据(官方解决办法是对原图进行切分小图识别)

        但是经过微调后的模型就可以得到很好的效果了。如下图所示。

        由此可见,GOT-OCR项目非常具有潜力,其性能还能继续深挖。ViT加语言模型的架构还有非常大的模型性能空间值得深入研究。

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

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

相关文章

【在Linux世界中追寻伟大的One Piece】读者写者问题与读写锁

目录 1 -> 读者写者问题 1.1 -> 什么是读者写者问题 1.2 -> 读者写者与生产消费者的区别 1.3 -> 如何理解读者写者问题 2 -> 读写锁 2.1 -> 读写锁接口 3 -> 读者优先(Reader-Preference) 4 -> 写者优先(Writer-Preference) 1 -> 读者写者…

基于PSO粒子群优化的CNN-LSTM-SAM网络时间序列回归预测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a 3.部分核心程序 &#xff08;完整版代码包含详细中文注释和操作步骤视频&#xff09…

vxe-table 键盘操作,设置按键编辑方式,支持覆盖方式与追加方式

vxe-table 全键盘操作&#xff0c;按键编辑方式设置&#xff0c;覆盖方式与追加方式&#xff1b; 通过 keyboard-config.editMode 设置按键编辑方式&#xff1b;支持覆盖方式编辑和追加方式编辑 安装 npm install vxe-pc-ui4.3.15 vxe-table4.9.15// ... import VxeUI from v…

Java设计模式笔记(二)

十四、模版方法模式 1、介绍 1&#xff09;模板方法模式(Template Method Pattern)&#xff0c;又叫模板模式(Template Patern)&#xff0c;在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需重写方法实现&#xff0c;但调用将以抽象类中定义的方式进行。 2&…

ZLMediaKit+wvp (ffmpeg+obs)推拉流测试

这里使用了两种方式: ffmpeg命令和 OBS OBS推流在网上找了些基本没有说明白的, 在ZLMediaKit的issues中看到了一个好大哥的提问在此记录一下 使用OBS推流&#xff0c;rtmp&#xff0c;报鉴权失败 推流 1. ffmpeg命令推流 官方说明文档地址: 推流规则 rtsp://192.168.1.4:10554…

思科模拟器路由器的基本配置

一、实验目的 了解路由器的作用掌握路由器的基本配置方法 3、掌握路由器模块的使用和互连方式 二、实验环境 2811路由器一台&#xff0c;计算机两台&#xff0c;Console配置线一根&#xff0c;网线若干&#xff1b;本实验拓扑图如图8-1所示&#xff1b;计算机IP地址规划如表8-…

TOPSIS法

TOPSIS 法&#xff1a;多属性决策的有效工具 在多属性决策分析领域&#xff0c;TOPSIS 法&#xff08;Technique for Order Preference by Similarity to Ideal Solution&#xff09;是一种广泛应用且极具价值的方法。它为解决复杂的决策问题提供了一种系统、科学的途径&#…

嵌入式入门Day24

数据结构Day5 树形结构相关概念二叉树相关概念二叉树的状态二叉树性质二叉树的存储二叉树根据已有序列推出树的结构练习 算法相关概念算法特性算法的设计要求时间复杂度排序算法冒泡排序&#xff08;改良版&#xff09;选择排序&#xff08;O(n^2)&#xff09;直接插入排序&…

selenium常见接口函数使用

博客主页&#xff1a;花果山~程序猿-CSDN博客 文章分栏&#xff1a;测试_花果山~程序猿的博客-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 1. 查找 查找方式 css_s…

3-5 C常用的字符串库函数

1.0 字符串库函数 strlen()函数用于返回字符串的长度&#xff0c;不包括结尾\0 uint32_t strlen(char *str) {uint32_t len 0;while (str[len] ! \0){len;}return len; } 编译器在处理字符串时&#xff0c;会自动的在数据末尾添加ASCI码“0对应十进制0&#xff0c;便于程序对…

weblogic开启https

JSK证书生成 生成密钥库和证书 使用Java的keytool命令来生成一个Java密钥库&#xff08;Keystore&#xff09;和证书。keytool是Java开发工具包&#xff08;JDK&#xff09;中用于管理密钥库和证书的命令行工具。 #创建证书存放目录 [weblogicosb1 jksHL]$ mkdir -p /home/w…

11.14【JAVA EXP3】【DEBUG】

比较疑惑的一点是当前页面&#xff08;资源的url)与请求的url? 请求的url由webService接收&#xff0c;servelt当中也可以发送出这个url 进行页面跳转&#xff0c;是跳转到某个Jsp页面&#xff0c;这个页面的url是在哪里定义的&#xff1f; 在Jsp打印信息&#xff0c;这个报…

陈若尧新歌《一来二去》陆续登陆全球音乐平台

由青年演员&#xff0c;歌手陈若尧带来的全新创作单曲《一来二去》由索尼音乐发行&#xff0c;于2024年11月18日陆续全球上线。这也是陈若尧与索尼音乐合作的第一首单曲。探索古典风格与流行音乐的新结合。歌曲上线不久,就因优美抒情的动人旋律&#xff0c;诗意而意味深远的歌词…

Jenkins凭据管理及使用详解

简介:Jenkins凭据管理是指对Jenkins中存储的敏感信息进行管理的功能,这些信息通常用于认证和授权,以确保Jenkins能够安全地与其他系统和服务进行交互。以下是关于Jenkins凭据管理添加及作用的详细介绍: 一、Jenkins凭据管理的添加 进入凭据管理页面: 登录Jenkins后,点击…

YOLOv10改进,YOLOv10添加CARAFE轻量级通用上采样算子,可提高目标检测性能

摘要 CARAFE模块的设计目的是在不增加计算复杂度的情况下,提升特征图的质量,特别是在视频超分辨率任务中,提升图像质量和细节。CARAFE结合了上下文感知机制和聚合特征的能力,通过动态的上下文注意力机制来提升细节恢复的效果。 理论介绍 传统的卷积操作通常依赖于局部区域…

Hbase整合Mapreduce案例2 hbase数据下载至hdfs中——wordcount

目录 整合结构准备数据下载pom.xmlMain.javaReduce.javaMap.java操作 总结 整合结构 和案例1的结构差不多&#xff0c;Hbase移动到开头&#xff0c;后面跟随MR程序。 因此对于输入的K1 V1会进行一定的修改 准备 在HBASE中创建表&#xff0c;并写入数据 create "wunaii…

【开源】A064—基于JAVA的民族婚纱预定系统的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看项目链接获取⬇️&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600个选题ex…

软考高级架构-9.4.4-双机热备技术 与 服务器集群技术

一、双机热备 1、特点&#xff1a; 软硬件结合&#xff1a;系统由两台服务器&#xff08;主机和备机&#xff09;、一个共享存储&#xff08;通常为磁盘阵列柜&#xff09;、以及双机热备软件&#xff08;提供心跳检测、故障转移和资源管理功能的核心软件&#xff09;组成。 …

elasticSearch(一):elasticSearch介绍

一、搜索引擎 搜索引擎的核心目的是帮助用户以最小的成本才海量数据中找到最想要的结果。糟糕的搜索引擎往往会所问非所答&#xff0c;用户查了半天也得不到自己想要的&#xff0c;好的搜索引擎往往第一页就是用户最想要的结果。而目前判断搜索引擎好坏一般是从召回率、精确率…

开发中使用UML的流程_08 PIM-4:定义操作及方法

目录 1、序列图概述 2、序列图调用方式 3、创建消息与销毁消息 4、几项建议 1、序列图概述 在PIM-4中&#xff0c;系统分析员可以用序列图来表达&#xff0c;系统内部一群对象合力完成某一个系统用例时&#xff0c;执行期间的交互情形。之后&#xff0c;序列图可能通过设计…