从零开始使用最新版Paddle【PaddleOCR系列】——第二部分:自建数据集 + 模型微调训练

       

目录

一、自建数据集

        1.官方数据集格式参考

        2.自建数据集txt文件编写代码

        3.数据集检验

二、模型训练

        1.模型配置yaml文件

        2.命令行指令训练


        在上一篇文章中,构建好了paddleOCR 运行必需的环境,并通过在线下载的方式,使用官方训练好的模型进行了简单的部署预测。但现实使用中,对于特定任务的数据集,如果想要提高精度表现,需要在原始模型的基础上进行训练微调。

        因此,本文记录如何构建符合paddlepaddle训练要求格式的数据集,以及如何使用官方提供的便利低代码量平台 PaddleX 进行模型训练。

        环境篇文章快速链接:https://blog.csdn.net/qq_58718853/article/details/142875253

        本文属于是记录性文档,斗胆抛砖引玉,详细参见官方文档地址:https://gitee.com/paddlepaddle/PaddleX/blob/release/3.0-beta1/docs/module_usage/tutorials/ocr_modules/text_detection.md

一、自建数据集

        1.官方数据集格式参考

        在上篇文章中介绍了官方测试数据的命令行快速下载和解压。首先下载官方数据,查看其数据集构建目录结构和内容编写规范。

## 下载解压数据集
wget https://paddle-model-ecology.bj.bcebos.com/paddlex/data/ocr_det_dataset_examples.tar -P ./dataset
tar -xf ./dataset/ocr_det_dataset_examples.tar -C ./dataset/

        目录结构上,在数据集目录下放 images子目录存放所有的图片,框和文字信息分为训练 train和 val 验证,分别存放在 txt 文件中。

         txt 文件编写上,文本文件每一行代表一张图片的所有信息——图片名和地址、所有框和文字信息的列表。具体来说,框信息和文字信息一起存放在字典结构中,一张图存在多个框和字组合,一起存放在一个列表中。

        图片地址和框信息中间用 ‘\t’ 分隔,中间不能出现空格。图片地址信息始终是字符串格式,需特别注意的是框和文字信息的编写,存在从字典列表结构写入txt 文本结构的转化细节,这在后续实操中会解释。

         综上,自建数据集实际需要操作的部分是构建这个两个关键 txt 文件,而编写文本文件中的关键就是后面框和文本信息的编写。下面我自己编写了一个简单的功能性脚本,可以完成对txt文件的编写。

        2.自建数据集txt文件编写代码

         代码总览:

                直接运行下述代码会在项目目录下新建示例文件 test.txt

import json
import osclass Paddle_Dataset_Creator:def __init__(self, savefile, input_dict, input_num=4, mode='only_det'):self.savefile = savefile    # paddle训练数据保存地址self.input_num = input_num   # 输入训练框数量信息:==4——左上、右下两点四坐标 or ==8——四顶点八坐标self.input_dict = input_dict   # 输入字典:键——文件名;值:框坐标列表self.mode = mode   # 选择模式:only_det——只进行检测框的训练集构建; ocr——检测框和区域识别字训练集self.pp_boxdict = None  # 存放格式正确的框字典# 四坐标转为八坐标,并保存paddle支持的框列表结构def check_box(self):# 标准格式——以一个框为例:[【xx,xx】,【xx,xx】,【xx,xx】,【xx,xx】],从左上顶点出发,顺时针一圈if self.input_num == 4:self.pp_boxdict = dict()for key in self.input_dict.keys():two_boxes_list = self.input_dict[key]  # 四坐标列表信息pp_box_list = []for two_box in two_boxes_list:pp_dict = dict()if self.mode == 'only_det':l,t,r,b = two_box  # 左x_min,上y_min, 右x_max, 下y_maxpp_dict["transcription"] = "ZW"elif self.mode == 'ocr':l,t,r,b,text = two_boxpp_dict["transcription"] = str(text)else:raise ValueError('miss key value self.mode')pp_box = [[min(l,r), min(t,b)], [max(l,r), min(t,b)], [max(l,r), max(t,b)], [min(l,r), max(t,b)]]pp_dict["points"] = pp_boxpp_box_list.append(pp_dict)self.pp_boxdict[key] = pp_box_listelif self.input_num == 8:self.pp_boxdict = dict()for key in self.input_dict.keys():four_boxes_list = self.input_dict[key]  # 四坐标列表信息pp_box_list = []for four_box in four_boxes_list:pp_dict = dict()if self.mode == 'only_det':pp_dict["transcription"] = "ZW"pp_dict["points"] = four_boxelif self.mode == 'ocr':pp_dict["transcription"] = str(four_box[4])pp_dict["points"] = four_box[:4]else:raise ValueError('miss key value self.mode')pp_box_list.append(pp_dict)self.pp_boxdict[key] = pp_box_listelse:raise ValueError('cant process box_num, box_num must in [4,8]')# 创建paddle数据txt文件def create_pptext(self, mode='train'):savedir = os.path.join(self.savefile, mode+'.txt')  # 保存结果地址if self.pp_boxdict != None:for name in self.pp_boxdict.keys():filename = 'images/'+name     # 写入txt图片地址信息box_list = self.pp_boxdict[name] # 写入txt框和字信息json_box_list = json.dumps(box_list, ensure_ascii=False, separators=(',',':'))line_text = filename + '\t' + str(json_box_list)   # 写入一行完整信息,中间使用'\t'隔开with open(savedir, 'a') as f:f.writelines(str(line_text))with open(savedir, 'a') as f:f.write('\n')if __name__=='__main__':example1 = {'abc.jpg':[[1,2,3,4],[5,6,7,8]], 'def.jpg':[[10,20,30,40],[50,60,70,80]]}example2 = {'abc.jpg':[[1,2,3,4,'a'],[5,6,7,8,'b']], 'def.jpg':[[10,20,30,40,'c'],[50,60,70,80,'d']]}paddle_creator = Paddle_Dataset_Creator(savefile='./', input_dict=example1, input_num=4, mode='only_det')paddle_creator.check_box()paddle_creator.create_pptext(mode='test')print(paddle_creator.pp_boxdict)

使用方法:

        必要条件:1.框信息是顶点的绝对值坐标信息构建的(如果是归一化坐标——YOLO,或者是左上点坐标信息加框的长宽,需要先做好数据转化)

                          2.输入数据格式必须是字典,且键为对应图片文件名,值为该图所有框和字信息

                          3.如果存在文字信息,请放在对应框列表的最后;如果没有文字信息,则默认为只训练框的检测模型。

        具体使用:

        具体使用的时候,只需将此类嵌入文件处理的过程中,使用相应的功能函数即可。

        ①初始化 self.__init__:

        初始化类有四个需要输入的参数——savefile:你需要txt文件保存的地址;input_dict:框和文字信息字典(按必要条件要求组织);input_num:框信息坐标数量,默认是4,代表左上右下两点四坐标;mode:是做仅框的检测模型训练 'only_det' ,还是带上识别模型的文本训练'ocr'

        ②框信息规范 self.check_box:

        直接训练该函数会将输入的框信息标准化为paddle需要的格式

        ③写入txt文件 self.create_pptext(mode):

        传入mode参数代表当前编写的是训练集train的txt还验证val的txt文件。

        3.数据集检验

        PaddleX 中自备了检验数据集是否构建成功的命令行指令。

        使用时只需将 xxx.yaml 修改为自建模型配置文件地址,将dataset_dir=xxx 改为自建数据集地址即可。

# 效验官方数据集
python main.py -c paddlex/configs/text_detection/PP-OCRv4_mobile_det.yaml -o Global.mode=check_dataset -o Global.dataset_dir=./dataset/ocr_det_dataset_examples# 效验自建数据集
python main.py -c xxx.yaml -o Global.mode=check_dataset -o Global.dataset_dir=xxx

        运行出现以下绿字则说明数据集构建成功。

 

二、模型训练

        这里模型训练仅以文本检测 ——text_detection 模型为例,实际上大部分其他模型的训练方式逻辑和本例类似。两步走:一、找到对应模型配置文件;二、命令行指令运行训练。

        1.模型配置yaml文件

        首先需要找到需要的模型配置 yaml 文件,在之前git克隆下载好的 PaddleX 源码/paddlex/configs目录下就可以查询到 paddle 所有模型的配置文件。

        打开本例需要的PP-OCRv4_server_det.yaml文件,按下图修改一些参数即可。(实际上,不一定非要修改,在命令行指令运行中也可以传入修改对应参数,如在命令代码后加上-o Global.dataset_dir=./dataset/ocr_det_dataset_examples,也可以修改数据集目录)

        2.命令行指令训练

        命令行训练需要配置几个所必需的参数,下面逐一记录。

        一个官方例子如下图。

基础命令参数配置:

        ① -c model.yaml:这是模型配置yaml文件地址

        ②-o Global.mode=train:当前模式选择,可以是训练train模式也可以是验证或者预测模式

        ③-o Global.dataset_dir=./:之前构建的训练数据集目录地址

        ④-o Global.device=gpu:0,1:指定训练设备,例中表示使用双卡训练

        ⑤-o Global.output=./:结果保存地址

训练参数配置:

        ⑥-o Train.epochs_iters=100:训练轮次

        ⑦-o Train.num_classes=1:数据集中的类别数,对于仅框检测来说,类别为1

        ⑧-o Train.batch_size=16:训练批量大小

        ⑨-o Train.pretrain_weight_path:预训练模型参数地址,第一次训练会下载在本地c盘

        参数配置上的详细内容参考官方文档地址:https://gitee.com/paddlepaddle/PaddleX/blob/release/3.0-beta1/docs/module_usage/instructions/config_parameters_common.md

        训练中会打印过程结果。       

        经过训练结果保存目录会得到以下结果。

        可以在best_model下找到训练最优模型参数,即可将微调模型参数用于部署任务。

        由于服务器CUDA版本环境存在一定冲突,虽然之前在yolo训练时没有报过错,但paddle会有警告。不过似乎并特别影响正常训练,训练还是能跑起来的。下一章将集中精力解决这些环境报错,并深入研究其训练输出目录下结果的使用,还有模型的测试评估和最终的部署。

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

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

相关文章

OpenCV图像处理——查找线条的转折点

问题描述 图像中有一条线,如何判断这条线的转折点? 比如下面一张图: 目的是找到图中的三个转折点。 要在图像中检测线的转折点,可以通过分析线的几何形状来完成。这通常需要首先提取线的轮廓,然后根据曲率、角度变化…

D42【python 接口自动化学习】- python基础之函数

day42 高阶函数 学习日期:20241019 学习目标:函数﹣- 55 高阶函数:函数对象与函数调用的用法区别 学习笔记: 函数对象和函数调用 # 函数对象和函数调用 def foo():print(foo display)# 函数对象 a foo print(a) # &…

JavaWeb Servlet--09深入:注册系统05---动态搜索栏

动态搜索栏 分析:在显示用户信息的表单里有一个下拉框选择用户的信息,一个文本框进行输入,一个按钮就行搜索,在下拉框选择了性别或许姓名的某一个包含字就会返回所有满足的用户。在controller层进行接收选择的搜索条件&#xff0…

三菱PLC伺服-停止位置不正确故障排查

停止位置不正确时,请确认以下项目。 1)请确认伺服放大器(驱动单元)的电子齿轮的设定是否正确。 2)请确认原点位置是否偏移。 1、设计近点信号(DOG)时,请考虑有足够为0N的时间能充分减速到爬行速度。该指令在DOG的前端开始减速到爬行速度&…

基于Java微信小程序的的儿童阅读系统的详细设计和实现(源码+lw+部署文档+讲解等)

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不…

【Linux】解读信号的本质&相关函数及指令的介绍

前言 大家好吖,欢迎来到 YY 滴Linux系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的《Lin…

实时语音转文字(基于NAudio+Whisper+VOSP+Websocket)

今天花了大半天时间研究一个实时语音转文字的程序,目的还包括能够唤醒服务,并把命令提供给第三方。 由于这方面的材料已经很多,我就只把过程中遇到的和解决方案简单说下。源代码开源在AudioWhisper: 实时语音转文字(基于NAudioWhisperVOSPWe…

面试八股(自用)

什么是java序列化,什么时候需要序列化? 序列化是指将java对象转化成字节流的过程,反序列化是指将字节流转化成java对象的过程。 当java对象需要在网络上传输 或者 持久化到存储文件中,就需要对java对象进行序列化处理。 JVM的主要组成部分…

[产品管理-46]:产品组合管理中的项目平衡与管道平衡的区别

目录 一、项目平衡 1.1 概述 1.2 项目的类型 1、根据创新程度和开发方式分类 2、根据产品开发和市场周期分类 3、根据风险程度分类 4、根据市场特征分类 5、根据产品生命周期分类 1.3 产品类型的其他分类 1、按物理形态分类 2、按功能或用途分类 3、按技术或创新程…

OceanBase中扩容OCP节点step by step

许多用户在开始使用OceanBase时部署OCP,通常选择单节点部署。但随着后续业务规模的不断扩大,会开始担忧单节点OCP在面对故障时可能丧失对集群运维管控的连续性。鉴于此,会将现有的单节点OCP扩展至多节点部署,以此来确保OCP服务的高…

MusePose模型部署指南

一、模型介绍 MusePose是一个基于扩散和姿势引导的虚拟人视频生成框架。 主要贡献可以概括如下: 发布的模型能够根据给定的姿势序列,生成参考图中人物的舞蹈视频,生成的结果质量超越了同一主题中几乎所有当前开源的模型。发布该 pose alig…

git命令使用一览【自用】

git常见操作: git initgit remote add master【分支名字】 gitgits.xxxxx【仓库中获取的ssh链接或者http协议的链接】检查远程仓库是否链接成功。 git remote -v出现以下画面就可以git pull,git push了

TVS常规过压保护

一、前言 上一篇文章 TVS选型-CSDN博客https://blog.csdn.net/qq_39543984/article/details/142825929?spm=1001.2014.3001.5501我们介绍了如何通过理论计算选择合适的TVS,TVS主要是防止瞬间过压,因为他的名字就叫瞬态二极管(Transient Voltage Suppressor)。本文就通过理…

基于PHP+MySQL+Vue的网上订餐系统

摘要 本文介绍了一个基于PHPMySQLVue技术的网上订餐系统。该系统旨在为用户提供便捷的在线订餐服务,同时提高餐厅的运营效率。系统后端采用PHP语言开发,利用MySQL数据库进行数据存储与管理,实现了用户注册登录、菜品浏览、购物车管理、订单提…

OpenCV高级图形用户界面(18)手动设置轨迹条(Trackbar)的位置函数setTrackbarPos()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 该函数设置指定窗口中指定轨迹条的位置。 注意 [仅 Qt 后端] 如果轨迹条附加到控制面板,则 winname 可以为空。 函数原型 void cv…

jmeter用csv data set config做参数化1

在jmeter中,csv data set config的作用非常强大,用它来做批量测试和参数化非常好用。 csv data set config的常用配置项如下: Variable Names处,写上源文件中的参数名,用于后续接口发送请求时引用 Ignore first line…

Java项目-基于Springboot的农机电招平台项目(源码+说明).zip

作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 开发运行环境 开发语言:Java数据库:MySQL技术:SpringBoot、Vue、Mybaits Plus、ELementUI工具:IDEA/…

【C++】类的默认成员函数:深入剖析与应用(下)

💯前言 回顾上篇文章👉【C】类的默认成员函数:深入剖析与应用(上)中对构造函数、拷贝构造函数和析构函数的讨论,强调这些默认成员函数在类的创建、初始化和销毁过程中的重要性。 ✍引出本篇将继续探讨剩余…

UG NX12.0建模入门笔记:1.2 鼠标的基本操作

文章目录 前言:鼠标的操作1.鼠标左键:单击—>单选;长按并滑动—>框选。2.鼠标右键:在不同的地方单击弹出不同的菜单。3.鼠标中键:滚动中键—>放大缩小【镜头拉近拉远】。4.鼠标中键:摁住鼠标中键&…

下载 jdk 历史版本的方法

先访问Oracle官网 Oracle | Cloud Applications and Cloud Platform 点击Products展示所有的铲平 选择 Java 这里有所有的版本,自己选择需要的版本 Java Archive | Oracle 如果返回 Request Header Or Cookie Too Large 可以通过以下方法清除Cookies