【14】模型训练自制数据集前的一些数据处理操作

辅助工具

      • 坏图像扫描与检查
      • 所有文件连续重命名排号
      • 划分数据集为训练集、测试集和验证集
      • 将标注的json文件转换成yolo格式文件,即txt文件
      • 将xml格式文件转换成yolo格式可读取的文件
      • 将gt后缀的图像数据文件进行解析
      • 统计yolo存储文件下各类标签下所对应标注目标的数量,累积打印数据分布情况

坏图像扫描与检查

import os
import cv2# 检查的图像数据和保存的路径设置一样,则会检测出坏图像
dataDir = r"/home/s22030812007/faster-rcnn-pytorch/VOCdevkit1/VOC2007/JPEGImages/"
saveDir = r"/home/s22030812007/faster-rcnn-pytorch/VOCdevkit1/VOC2007/JPEGImages/"if not os.path.exists(saveDir):os.makedirs(saveDir)
c = 0
for one_pic in os.listdir(dataDir):one_path = dataDir + one_picone_img = cv2.imread(one_path)new_path = saveDir + one_picd = cv2.imwrite(new_path, one_img)c = c + 1print(d, c)

所有文件连续重命名排号

import os
if __name__ == '__main__':path = r"C:/Users/27801/Documents/Datasets/5551"  # 需要出来的图片文件所在路径(即文件夹路径),注意斜杠的方向file_names = os.listdir(path)  # 获取该文件夹下所有的文件名称(包括文件夹)print(f'file_names:{file_names}')count = 6563  # 设置变量count,为重命名文件的起始编号for file in file_names:  # 遍历所有文件名print(f"file:{file}")old_name = os.path.join(path, file)print(f'old_name:{old_name}')if os.path.isdir(old_name):  # 如果是文件夹则跳过continuefilename = os.path.splitext(file)[0]  # 文件名filetype = os.path.splitext(file)[1]  # 文件扩展名new_name = os.path.join(path, str(count).zfill(6) + filetype)  # 用字符串函数zfill 以0补全所需位数print(f'new_name:{new_name}')os.rename(old_name, new_name)  # 重命名 用新的文件名代替旧的文件名count += 1  # count的作用是给文件名计数的,以及累积的步幅

划分数据集为训练集、测试集和验证集

import os, shutil, randomrandom.seed(201)
import numpy as np
from sklearn.model_selection import train_test_split# 验证集、测试集的占比,剩余的比例为训练集数据,0.1为占比百分之十
val_size = 0.1
test_size = 0.1
postfix = 'jpg'# 图像数据的路径
imgpath = r'C:/Users/27801/Desktop/JPEGImages/'#txt后缀的文件路径
txtpath = r'C:/Users/27801/Desktop/txts/'#创建目录文件夹,用于存放划分数据后的图像,且若不存在则自动创建文件夹
os.makedirs('Logos3/images/train', exist_ok=True)
os.makedirs('Logos3/images/val', exist_ok=True)
os.makedirs('Logos3/images/test', exist_ok=True)
os.makedirs('Logos3/labels/train', exist_ok=True)
os.makedirs('Logos3/labels/val', exist_ok=True)
os.makedirs('Logos3/labels/test', exist_ok=True)# 列出txtpath目录下所有包含'txt'字符串的文件名  将这些文件名存储在一个列表中
listdir = np.array([i for i in os.listdir(txtpath) if 'txt' in i])# 随机打乱列表中文件名
random.shuffle(listdir)
# 按照比例划分
train, val, test = listdir[:int(len(listdir) * (1 - val_size - test_size))], \listdir[int(len(listdir) * (1 - val_size - test_size)):int(len(listdir) * (1 - test_size))], \listdir[int(len(listdir) * (1 - test_size)):]
print(f'train set size:{len(train)} val set size:{len(val)} test set size:{len(test)}')# 将分配好的文件进行转移到指定文件夹下
for i in train:shutil.copy('{}/{}.{}'.format(imgpath, i[:-4], postfix), 'Logos3/images/train/{}.{}'.format(i[:-4], postfix))shutil.copy('{}/{}'.format(txtpath, i), 'Logos3/labels/train/{}'.format(i))for i in val:shutil.copy('{}/{}.{}'.format(imgpath, i[:-4], postfix), 'Logos3/images/val/{}.{}'.format(i[:-4], postfix))shutil.copy('{}/{}'.format(txtpath, i), 'Logos3/labels/val/{}'.format(i))for i in test:shutil.copy('{}/{}.{}'.format(imgpath, i[:-4], postfix), 'Logos3/images/test/{}.{}'.format(i[:-4], postfix))shutil.copy('{}/{}'.format(txtpath, i), 'Logos3/labels/test/{}'.format(i))

将标注的json文件转换成yolo格式文件,即txt文件

import json
import os## json格式转换成yolo格式
# 设置:标签对应的编号
# !!!一定要查看自己标注数据集时对应的编号
name2id = {'figure': 0, 'text': 1, 'mix': 2}def convert(img_size, box):dw = 1. / (img_size[0])dh = 1. / (img_size[1])x = (box[0] + box[2]) / 2.0 - 1y = (box[1] + box[3]) / 2.0 - 1w = box[2] - box[0]h = box[3] - box[1]x = x * dww = w * dwy = y * dhh = h * dhreturn (x, y, w, h)def decode_json(json_folder_path, json_name):# 设置:转换好格式后的标签存放的路径txt_name = 'C:/Users/27801/Documents/Datasets/mydata/txt/' + json_name[0:-5] + '.txt'txt_file = open(txt_name, 'w')json_path = os.path.join(json_folder_path, json_name)data = json.load(open(json_path, 'r', encoding='gb2312'))img_w = data['imageWidth']img_h = data['imageHeight']for i in data['shapes']:label_name = i['label']if (i['shape_type'] == 'rectangle'):x1 = int(i['points'][0][0])y1 = int(i['points'][0][1])x2 = int(i['points'][1][0])y2 = int(i['points'][1][1])bb = (x1, y1, x2, y2)bbox = convert((img_w, img_h), bb)txt_file.write(str(name2id[label_name]) + " " + " ".join([str(a) for a in bbox]) + '\n')if __name__ == "__main__":# 路径设置:需要进行格式转换的.json文件夹存放路径json_folder_path = 'C:/Users/27801/Documents/Datasets/mydata/labels'json_names = os.listdir(json_folder_path)for json_name in json_names:decode_json(json_folder_path, json_name)

将xml格式文件转换成yolo格式可读取的文件

import cv2
import os
import xml.etree.ElementTree as ET
import numpy as npclasses = ['text', 'mix', 'figure']def convert(size, box):dw = 1. / (size[0])dh = 1. / (size[1])x = (box[0] + box[1]) / 2.0 - 1y = (box[2] + box[3]) / 2.0 - 1w = box[1] - box[0]h = box[3] - box[2]x = x * dww = w * dwy = y * dhh = h * dhreturn (x, y, w, h)def convert_annotation(xmlpath, xmlname):with open(xmlpath, "r", encoding='utf-8') as in_file:txtname = xmlname[:-4] + '.txt'txtfile = os.path.join(txtpath, txtname)tree = ET.parse(in_file)root = tree.getroot()filename = root.find('filename')img = cv2.imdecode(np.fromfile('{}/{}.{}'.format(imgpath, xmlname[:-4], postfix), np.uint8), cv2.IMREAD_COLOR)h, w = img.shape[:2]res = []for obj in root.iter('object'):cls = obj.find('name').textif cls not in classes:classes.append(cls)cls_id = classes.index(cls)xmlbox = obj.find('bndbox')b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),float(xmlbox.find('ymax').text))bb = convert((w, h), b)res.append(str(cls_id) + " " + " ".join([str(a) for a in bb]))if len(res) != 0:with open(txtfile, 'w+') as f:f.write('\n'.join(res))if __name__ == "__main__":# 图像后缀为jpg,图像文件路径、xml标注文件路径postfix = 'jpg'imgpath = r'C:/Users/27801/Desktop/JPEGImages/'xmlpath = r'C:/Users/27801/Desktop/Annotations/'# txt为yolo的表现格式,若没有存在,则自动创建文件夹txtpath = r'C:/Users/27801/Desktop/txts/'if not os.path.exists(txtpath):os.makedirs(txtpath, exist_ok=True)list = os.listdir(xmlpath)error_file_list = []for i in range(0, len(list)):try:path = os.path.join(xmlpath, list[i])if ('.xml' in path) or ('.XML' in path):convert_annotation(path, list[i])print(f'file {list[i]} convert success.')else:print(f'file {list[i]} is not xml format.')except Exception as e:print(f'file {list[i]} convert error.')print(f'error message:\n{e}')error_file_list.append(list[i])print(f'this file convert failure\n{error_file_list}')print(f'Dataset Classes:{classes}')

将gt后缀的图像数据文件进行解析

if __name__ == "__main__":# 下载的数据为gt格式存放label_path = r'C:\Users\27801\Desktop\BelgaLogos\qset3_internal_and_local.gt'labels_origin = []with open(label_path, "r") as f:for line in f.readlines():l = " ".join(line.split("\t"))labels_origin.append(l.strip("\n"))imgs_label = {}# 数据包括的所有标签classes = [['Adidas', 'Adidas-text', 'Airness', 'Base', 'BFGoodrich', 'Bik', 'Bouigues', 'Bridgestone','Bridgestone-text', 'Carglass', 'Citroen', 'Citroen-text', 'CocaCola', 'Cofidis', 'Dexia','ELeclerc', 'Ferrari', 'Gucci', 'Kia', 'Mercedes', 'Nike', 'Peugeot', 'Puma', 'Puma-text','Quick', 'Reebok', 'Roche', 'Shell', 'SNCF', 'Standard_Liege', 'StellaArtois', 'TNT','Total', 'Umbro', 'US_President', 'Veolia', 'VRT']]for i in labels_origin:if i.split()[2] not in imgs_label.keys():imgs_label[i.split()[2]] = []if i.split()[1] not in classes:classes.append(i.split()[1])imgs_label[i.split()[2]].append([int(i.split()[5]), int(i.split()[6]), int(i.split()[7]), int(i.split()[8]), i.split()[1]])print('imgs_label', imgs_label)

统计yolo存储文件下各类标签下所对应标注目标的数量,累积打印数据分布情况

import matplotlib.pyplot as plt
import osplt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = Falsecn_path = open(r"C:\Users\27801\Desktop\BelgaLogos\classes.txt")  # 存有类别的文本路径,如:"C:/Users/Admin/Desktop/classes.txt"classes = [i.replace("\n", "") for i in cn_path.readlines()]
print(classes)class_dict = {i: 0 for i in classes}
print("类别数", len(class_dict))def main(base_path):# 列出指定路径base_path下的所有文件和目录名fileList = os.listdir(base_path)for file in fileList:if file == "classes.txt":continuewith open(base_path + file, 'r') as f:for i in f.readlines():i = i.split(' ')  # 按照空格进行划分文件内数值,首字符代表标签类别class_dict[classes[int(i[0])]] += 1fig, ax = plt.subplots(figsize=(10, 8))plt.title('数量')plt.xticks(rotation=90)  # x轴文字方向旋转90度bars = plt.bar(class_dict.keys(), class_dict.values())# 绘制柱形图部分for b in bars:height = b.get_height()ax.annotate(f'{height}',# xy控制的是,标注哪个点,x=x坐标+width/2, y=height,即柱子上平面的中间xy=(b.get_x() + b.get_width() / 2, height),xytext=(0, 3),  # 文本放置的位置,如果有textcoords,则表示是针对xy位置的偏移,否则是图中的固定位置textcoords="offset points",  # 两个选项 'offset pixels','offset pixels'va='bottom', ha='center'  # 代表verticalalignment 和horizontalalignment,控制水平对齐和垂直对齐。)plt.savefig('./统计.png',  # ⽂件名:png、jpg、pdfdpi=100,  # 保存图⽚像素密度bbox_inches='tight')  # 保存图⽚完整plt.show()if __name__ == '__main__':# 存放txt文件的路径,末尾的反斜杠不可少base_path = r"C:/Users/27801/Desktop/BelgaLogos/txts/"main(base_path)

如果你觉得这篇文章对你有所启发的话,期待你的点赞、收藏和打赏,对我创作的支持!!!

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

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

相关文章

企业级PHP异步RabbitMQ协程版客户端 2.0 正式发布

概述 workerman/rabbitmq 是一个异步RabbitMQ客户端,使用AMQP协议。 RabbitMQ是一个基于AMQP(高级消息队列协议)实现的开源消息组件,它主要用于在分布式系统中存储和转发消息。RabbitMQ由高性能、高可用以及高扩展性出名的Erlan…

基于SpringBoot的洗浴管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

直流无刷电机控制(FOC):电流模式

目录 概述 1 系统框架结构 1.1 硬件模块介绍 1.2 硬件实物图 1.3 引脚接口定义 2 代码实现 2.1 软件架构 2.2 电流检测函数 3 电流环功能实现 3.1 代码实现 3.2 测试代码实现 4 测试 概述 本文主要介绍基于DengFOC的库函数,实现直流无刷电机控制&#x…

51单片机——串口通信(重点)

1、通信 通信的方式可以分为多种,按照数据传送方式可分为串行通信和并行通信; 按照通信的数据同步方式,可分为异步通信和同步通信; 按照数据的传输方向又可分为单工、半双工和全双工通信 1.1 通信速率 衡量通信性能的一个非常…

oracle位运算、左移右移、标签算法等

文章目录 位运算基础与或非同或同或应用场景 异或异或应用场景 什么是真值表 oracle基础函数创建bitor(按位或)函数bitnot(按位非)函数bitxor(按位异或)函数左移函数BITSHIFT()函数(实测不可用,废弃掉该方案)右移函数(略,有此场景吗?) 实际应用资质字典…

VS2015 + OpenCV + OnnxRuntime-Cpp + YOLOv8 部署

近期有个工作需求是进行 YOLOv8 模型的 C 部署,部署环境如下 系统:WindowsIDE:VS2015语言:COpenCV 4.5.0OnnxRuntime 1.15.1 0. 预训练模型保存为 .onnx 格式 假设已经有使用 ultralytics 库训练并保存为 .pt 格式的 YOLOv8 模型…

python无需验证码免登录12306抢票 --selenium(2)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 [TOC](python无需验证码免登录12306抢票 --selenium(2)) 前言 提示:这里可以添加本文要记录的大概内容: 就在刚刚我抢的票:2025年1月8日…

本地手集博客id“升级”在线抓取——简陋版——(2024年终总结1.1)

我之前每每发布笔记都用csv纯文本记录,一个机缘巧得文章列表api实现在线整理自已的文章阅读量数据。 (笔记模板由python脚本于2025年01月10日 18:48:25创建,本篇笔记适合喜欢钻牛角尖的coder翻阅) 【学习的细节是欢悦的历程】 Python官网:htt…

工业 4G 路由器赋能远程医疗,守护生命线

在医疗领域,尤其是偏远地区的医疗救治场景中,工业 4G 路由器正发挥着无可替代的关键作用,宛如一条坚韧的 “生命线”,为守护患者健康持续赋能。 偏远地区医疗资源相对匮乏,常常面临着专业医生短缺、诊疗设备有限等困境…

【python基础——异常BUG】

什么是异常(BUG) 检测到错误,py编译器无法继续执行,反而出现错误提示 如果遇到错误能继续执行,那么就捕获(try) 1.得到异常:try的执行,try内只可以捕获一个异常 2.预案执行:except后面的语句 3.传入异常:except … as uestcprint(uestc) 4.没有异常:else… 5.鉴定完毕,收尾的语…

Nginx入门笔记

Nginx入门笔记 一、Nginx基本概念二、代理1、正向代理2、反向代理 三、准备工作1、CentOS 7安装nginx(1). 安装必要的依赖(2)下载nginx(3)编译安装(4)编译并安装 Nginx(5)启动nginx …

半导体数据分析: 玩转WM-811K Wafermap 数据集(一) AI 机器学习

在半导体行业,工程师依靠 CP Yield(生产过程中芯片的合格率)、WAT(晶圆验收测试)和 Particle 的晶圆图模式来识别工艺问题。然而,在没有人工干预的情况下将这些晶圆图模式分类是一项重大挑战。许多论文都研…

初学者关于对机器学习的理解

一、机器学习: 1、概念:是指从有限的观测数据中学习(或“猜 测”)出具有一般性的规律,并利用这些规律对未知数据进行预测的方法.机器学 习是人工智能的一个重要分支,并逐渐成为推动人工智能发展的关键因素。 2、使用机器学习模型…

GPU算力平台|在GPU算力平台部署Qwen-2通义千问大模型的教程

文章目录 一、GPU平台介绍算力平台概述 二、人工智能应用开发需要GPU算力平台GPU算力原理账号注册流程Qwen-2通义千问大模型的部署登录/注册选择SettingsURL配置选择模型部署完成进行问答 一、GPU平台介绍 算力平台概述 GPU算力平台是一个专注于GPU加速计算的专业云服务平台&…

Vue3(elementPlus) el-table替换/隐藏行箭头,点击整行展开

element文档链接: https://element-plus.org/zh-CN/component/form.html 一、el-table表格行展开关闭箭头替换成加减号 注:Vue3在样式中修改箭头图标无效,可能我设置不对,欢迎各位来交流指导 转变思路:隐藏箭头&…

【C++】C++11(二)

目录 九、可变参数模板十、lambda表达式10.1 C98中的一个例子10.2 lambda表达式10.3 lambda表达式语法10.3.1 lambda表达式各部分说明10.3.2 捕获列表说明 10.4 函数对象与lambda表达式 十一、包装器11.1 function包装器11.2 bind 十二、线程库12.1 线程12.1.1 thread类的简单介…

针对数据库系统安全的漏洞扫描加固工具【WebSocket + MySQL】

一、系统背景 随着信息技术的迅猛发展和互联网的普及,数据库作为存储、管理和检索大量数据的关键组件,其安全性对于企业和组织来说至关重要。然而,由于网络环境的复杂性和攻击手段的多样性,数据库面临着越来越多的安全威胁&#…

Photon最新版本PUN 2.29 PREE,在无网的局域网下,无法连接自己搭建的本地服务器

1.图1为官方解答 2.就是加上这一段段代码:PhotonNetwork.NetworkingClient.SerializationProtocol SerializationProtocol.GpBinaryV16; 完美解决 unity 商店最新PUN 2 插件 不能连接 (环境为:本地局域网 无外网情况 ) …

贪心算法(五)

目录 一、单调递增的数字 二、坏了的计算器 三、合并区间 四、无重叠区间 五、用最少数量的箭引爆气球 一、单调递增的数字 单调递增的数字 贪心策略: 对于这道题,相邻数字相等,也表示是递增的。 解题代码: class Soluti…

数据结构——栈的实现

今天,我们来写一下关于栈的博文。 1.首先我们先了解一下什么是栈? 一:概念: 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端称为栈顶,另…