从零开始使用最新版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.rhkb.cn/news/448252.html

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

相关文章

深入理解 JDK 的 Optional 类

深入理解 JDK 的 Optional 类 深入理解 JDK 的 Optional 类1. 什么是 Optional?1.1 主要构造方法示例 2. Optional 的常用方法2.1 判断值是否存在示例2.2 获取值示例2.3 进行操作示例 3. 使用场景3.1 避免 null 值示例3.2 提高代码可读性3.3 与流结合示例 4. 注意事…

中航资本:股市融资50万一天的利息是多少?融资一般多久归还?

融资官方利率是8.35%,实际上大部分券商融资利息在6%~8%左右,详细利率因券商及投资者状况而异。少部分券商可提供低至5%,乃至更低的优惠利率。 该利息按天然日核算,融资利息融资金额融资年利率实际使用资金的天然日天数/360。 假…

基于深度学习的细粒度图像分析综述【翻译】

🥇 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 🎉 声明: 作为全网 AI 领域 干货最多的博主之一,❤️ 不负光阴不负卿 ❤️ 文章目录 基础信息0 摘要1 INTRODUCTION2 识别与检索 RECOGNITION VS. RETRIEVAL3 问题和…

React01 开发环境搭建

React 开发环境搭建 一、创建 React 项目二、项目精简 一、创建 React 项目 执行下述命令创建 react 项目 blu-react-basis npx create-react-app blu-react-basis项目目录结构如下: 执行下述命令启动项目 npm run start启动效果如下: 二、项目精简 …

Vue.js 错误异常: Component template should contain exactly one root element.

一、错误异常: Errors compiling template: Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead. 二、原因 组件模板应该只包含一个根元素 查看vue代码,发…

OpenCV-人脸检测

文章目录 一、人脸检测流程二、关键方法三、代码示例四、注意事项 OpenCV是一个开源的计算机视觉和机器学习软件库,它提供了多种人脸检测方法,以下是对OpenCV人脸检测的详细介绍: 一、人脸检测流程 人脸检测是识别图像中人脸位置的过程&…

【C语言】数据输出格式控制

数据的输出格式修饰 常用两种&#xff1a; 整型中&#xff0c;输出数据左对齐、右对齐、占m位、不足m位前补0。浮点型中&#xff0c;默认通过四舍五入保留小数点后6位&#xff0c;通过参数设置保留小数点后n位。 #include <stdio.h> #define PI 3.14159 /* 功能&#x…

2024怎么选择网站建设公司?2024靠谱建站公司推荐TOP3

说起怎么挑个靠谱的网站建设公司啊&#xff0c;我觉得有这么几点挺关键的&#xff0c;咱们可以聊聊&#xff1a; 首先啊&#xff0c;你得瞅瞅这公司啥背景&#xff0c;成立了多久了&#xff0c;团队大不大&#xff0c;都服务过哪些客户&#xff0c;有啥拿得出手的成功案例没。…

如何判断通风天窗的优劣

通风天窗是否优质直接决定天窗的通风采光效果&#xff0c;影响厂房的空气质量。判断通风天窗的优劣主要从天窗使用材料、防水密封性能、通风性能、安装与售后服务等多方面出发。‌ ‌通风天窗使用材料是判断通风天窗优劣的重要因素之一。优质的通风天窗应采用耐候性强、坚固耐用…

ESP32-S3无法下载且报错的原因

该文将作为ESP32-S3下载报错记录&#xff0c;将持续更新 ARDUINO-IDE: Sketch uses 289393 bytes (22%) of program storage space. Maximum is 1310720 bytes. Global variables use 18408 bytes (5%) of dynamic memory, leaving 309272 bytes for local variables. Maximu…

多态常见面试问题

1、什么是多态&#xff1f; 多态&#xff08;Polymorphism&#xff09;是面向对象编程中的一个重要概念&#xff0c;它允许同一个接口表现出不同的行为。在C中&#xff0c;多态性主要通过虚函数来实现&#xff0c;分为编译时多态&#xff08;静态多态&#xff09;和运行时多态…

Java项目:160 基于springboot物流管理系统(PPT+论文+说明文档)

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 物流管理系统有管理员和用户两个角色。 ​ 管理员功能有个人中心&#xff0c;用户管理&#xff0c;车辆信息管理&#xff0c;公告信息管理&#xff…

windows以zip方式安装mysql8

1.下载安装包 mysql官网&#xff0c;下载后放到D:\Program Files\mysql-8.0.40-winx64 2.安装 cmd进入D:\Program Files\mysql-8.0.40-winx64\bin &#xff08;1&#xff09;在路径下新建my.ini配置文件 [mysql] # 设置mysql客户端默认字符集 default-character-setutf8 …

测网速小程序,纯前端

搜索&#xff1a;证寸照制作 源码介绍: 测网速小程序源码&#xff0c;是一款纯前端无需服务器的测网速小程序&#xff0c;依赖百度开发者中心js接口&#xff0c;真正的永久使用的小工具源码&#xff0c;很实用&#xff0c;可以单独运行&#xff0c;测网速很流畅~ 合法域名: ht…

OPC Router快速打通设备层与influxDB数据通讯

随着时代演化&#xff0c;数据量呈几何倍数增加的情况下出现了时序数据库。时序数据库是基于时间进行存储的数据库&#xff0c;每一条数据中都有一个时间戳&#xff0c;这种数据库特别适合存储那些随着时间变化的数据&#xff0c;通过一些工具处理后&#xff0c;能够分析出数据…

智绘城市地图:使用百度地图 API 实现智能定位

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

SQL优化 TABLE ACCESS BY INDEX ROWID 索引回表

问题&#xff1a; SQL语句运行时间主要消耗在TABLE ACCESS BY INDEX ROWID 索引回表扫描上&#xff0c;怎么优化&#xff1f; 模拟测试&#xff1a; 1.创建测试表 SYSdb11g> create table t1015 as select * from dba_objects;Table created.SYSdb11g> create index …

WPF -- LiveCharts的使用和源码

LiveCharts 是一个开源的 .NET 图表库&#xff0c;特别适用于 WPF、WinForms 和其他 .NET 平台。它提供了丰富的图表类型和功能&#xff0c;使开发者能够轻松地在应用程序中创建动态和交互式图表。下面我将使用WPF平台创建一个测试实例。 一、LiveCharts的安装和使用 1.安装N…

ESP-01S WIFI模块指南

ESP-01S模块&#xff0c;接5V才能正常工作&#xff0c;接3.3V很有可能不会正常工作 ESP-01S模块&#xff0c;TXD和RXD和CH340交叉接入 ESP-01s出厂波特率正常是115200, 注意&#xff1a;AT指令&#xff0c;控制类都要加回车&#xff0c;数据传输时不加回车 上电后&#xff0…

IDEA如何查看所有的断点(Breakpoints)并关闭

前言 我们在使用IDEA开发Java应用时&#xff0c;基本上都需要进行打断点的操作&#xff0c;这方便我们排查BUG&#xff0c;也方便我们查看设计的是否正确。 不过有时候&#xff0c;我们不希望进入断点&#xff0c;这时候除了点击断点关闭外&#xff0c;有没有更快速的方便关闭…