第39周——训练自己的数据集

目录

1. 下载数据

2. 配置开发环境

3. 预处理数据


  • 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
  • 🍖 原作者:K同学啊

1. 下载数据

百度网盘:百度网盘 请输入提取码
压缩文件中有两个文件夹,分别是Annotations和ImageSet文件夹,我的理解:
ImageSet:原始图片
Annotations:针对原始图片标注了有效信息的文件,比如位置信息等。

2. 配置开发环境

第1天课里已经下载了yolov5的github项目,将该项目作为项目文件,通过各类IDE打开即可。你可能需要安装依赖包(pip install -r requirement.txt),可能需要配置python解释器和虚拟环境。
在项目根目录下本身有一个data文件,里面有很多预置的数据集文件。为了区分,我在根目录下建立一个mydata的文件夹,然后将下载的数据解压后的两个文件夹copy到mydata中。

3. 预处理数据

脚本1:1. 数据集划分 (split_train_val.py) :将数据分为训练集、验证集和测试集
输出:
ImageSets/Main/train.txt:训练集文件名列表
ImageSets/Main/val.txt:验证集文件名列表
ImageSets/Main/test.txt:测试集文件名列表
脚本2:2. 格式转换 (voc_label.py):将VOC格式(XML格式)转换为YOLO格式(TXT格式,具体查询资料)
输出:
labels/:YOLO格式标注文件夹
train.txt:训练集图像路径列表
val.txt:验证集图像路径列表

split_train_val.py脚本代码:

# 导入必要的库  
import os  
import random  
import argparse  # 创建一个参数解析器  
parser = argparse.ArgumentParser()  # 添加命令行参数,用于指定XML文件的路径,默认为 'Annotations' 文件夹  
parser.add_argument('--xml_path', default='Annotations', type=str, help='input xml label path')  # 添加命令行参数,用于指定输出txt标签文件的路径,默认为 'ImageSets/Main' 文件夹  
parser.add_argument('--txt_path', default='ImageSets/Main', type=str, help='output txt label path')  # 解析命令行参数  
opt = parser.parse_args()  # 定义训练验证集和测试集的划分比例  
trainval_percent = 1.0  # 使用全部数据  
train_percent = 0.9  # 训练集占训练验证集的90%  # 设置XML文件夹的路径,根据命令行参数指定  
xmlfilepath = opt.xml_path  # 设置输出txt标签文件的路径,根据命令行参数指定  
txtsavepath = opt.txt_path  # 获取XML文件夹中的所有XML文件列表  
total_xml = os.listdir(xmlfilepath)  # 如果输出txt标签文件的文件夹不存在,创建它  
if not os.path.exists(txtsavepath):  os.makedirs(txtsavepath)  # 获取XML文件的总数  
num = len(total_xml)  # 创建一个包含所有XML文件索引的列表  
list_index = range(num)  # 计算训练验证集的数量  
tv = int(num * trainval_percent)  # 计算训练集的数量  
tr = int(tv * train_percent)  # 从所有XML文件索引中随机选择出训练验证集的索引  
trainval = random.sample(list_index, tv)  # 从训练验证集的索引中随机选择出训练集的索引  
train = random.sample(trainval, tr)  # 打开要写入的训练验证集、测试集、训练集、验证集的txt文件  
file_trainval = open(txtsavepath + '/trainval.txt', 'w')  
file_test = open(txtsavepath + '/test.txt', 'w')  
file_train = open(txtsavepath + '/train.txt', 'w')  
file_val = open(txtsavepath + '/val.txt', 'w')  # 遍历所有XML文件的索引  
for i in list_index:  name = total_xml[i][:-4] + '\n'  # 获取XML文件的名称(去掉后缀.xml),并添加换行符  # 如果该索引在训练验证集中  if i in trainval:  file_trainval.write(name)  # 写入训练验证集txt文件  if i in train:  # 如果该索引在训练集中  file_train.write(name)  # 写入训练集txt文件  else:  file_val.write(name)  # 否则写入验证集txt文件  else:  file_test.write(name)  # 否则写入测试集txt文件  # 关闭所有打开的文件  
file_trainval.close()  
file_train.close()  
file_val.close()  
file_test.close()

voc_label.py代码:

# -*- coding: utf-8 -*-  # 导入必要的库  
import xml.etree.ElementTree as ET  
import os  
from os import getcwd  # 定义数据集的名称  
sets = ['train', 'val', 'test']  # 定义类别列表,这里有两个类别,可以根据需要添加更多类别  
classes = ["A", "B"]  # 请根据您的数据集修改这些类别名称  # 获取当前工作目录的绝对路径  
abs_path = os.getcwd()  
print(abs_path)  # 定义一个函数,将边界框的坐标从绝对值转换为相对于图像大小的比例  
def convert(size, box):  dw = 1. / (size[0])  # 计算图像宽度的倒数  dh = 1. / (size[1])  # 计算图像高度的倒数  x = (box[0] + box[1]) / 2.0 - 1  # 计算中心点的x坐标  y = (box[2] + box[3]) / 2.0 - 1  # 计算中心点的y坐标  w = box[1] - box[0]  # 计算边界框的宽度  h = box[3] - box[2]  # 计算边界框的高度  x = x * dw  # 缩放x坐标  w = w * dw  # 缩放宽度  y = y * dh  # 缩放y坐标  h = h * dh  # 缩放高度  return x, y, w, h  # 定义一个函数,将标注文件从XML格式转换为YOLO格式  
def convert_annotation(image_id):  in_file = open('./Annotations/%s.xml' % (image_id), encoding='UTF-8')  # 打开XML标注文件  out_file = open('./labels/%s.txt' % (image_id), 'w')  # 打开要写入的YOLO格式标签文件  tree = ET.parse(in_file)  # 解析XML文件  root = tree.getroot()  filename = root.find('filename').text  # 获取图像文件名  filenameFormat = filename.split(".")[1]  # 获取文件格式  size = root.find('size')  # 获取图像尺寸信息  w = int(size.find('width').text)  # 获取图像宽度  h = int(size.find('height').text)  # 获取图像高度  for obj in root.iter('object'):  difficult = obj.find('difficult').text  # 获取对象的难度标志  cls = obj.find('name').text  # 获取对象的类别名称  if cls not in classes or int(difficult) == 1:  continue  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))  b1, b2, b3, b4 = b  # 标注越界修正  if b2 > w:  b2 = w  if b4 > h:  b4 = h  b = (b1, b2, b3, b4)  bb = convert((w, h), b)  # 调用convert函数,将边界框坐标转换为YOLO格式  out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')  # 写入YOLO格式标签文件  return filenameFormat  # 获取当前工作目录  
wd = getcwd()  # 遍历每个数据集(train、val、test)  
for image_set in sets:  # 如果labels目录不存在,创建它  if not os.path.exists('./labels/'):  os.makedirs('./labels/')  # 从数据集文件中获取图像ID列表  image_ids = open('./ImageSets/Main/%s.txt' % (image_set)).read().strip().split()  # 打开要写入的文件,写入图像的文件路径和格式  list_file = open('./%s.txt' % (image_set), 'w')  for image_id in image_ids:  filenameFormat = convert_annotation(image_id)  list_file.write(abs_path + '/images/%s.%s\n' % (image_id, filenameFormat))  # 注意你的图片格式,如果是.jpg记得修改  list_file.close()

                        

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

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

相关文章

CentOS7中Docker的安装与卸载

CentOS7 从零开始:Docker 安装与卸载全指南(新手友好版) 作为一名刚接触 Linux 和容器技术的新手,你是否曾在安装 Docker 时被各种命令和报错搞得一头雾水?比如执行 yum install docker 时提示 “仓库不存在”,或者启动 Docker 后用 docker version 只显示 client 不显示…

解决MinIO上传图片后返回URL无法访问的问题

一、问题现象 上传接口返回了文件的访问路径,比如: http://127.0.0.1:9005/lease/20250808/xxx-uuid.png但是用浏览器直接打开该地址却显示权限拒绝,前端也访问不到:二、问题原因分析 桶权限设置不正确: MinIO默认桶权限是私有的,即使浏览器能…

系统网络端口安全扫描脚本及详解

#!/bin/bash # 系统服务端口安全扫描 - 修正版echo " 系统服务端口安全扫描报告 "# 1. 高风险端口识别 echo "⚠️ 对外开放的高风险端口:" awk /0.0.0.0:21/ {print " 端口 21 - FTP (明文传输)\n 🚨 严重安全风险,建议…

DAY 39 图像数据与显存

知识点回顾 图像数据的格式:灰度和彩色数据模型的定义显存占用的4种地方 模型参数梯度参数优化器参数数据批量所占显存神经元输出中间状态 batchisize和训练的关系 一、 图像数据的介绍 1.1 灰度图像 从这里开始我们进入到了图像数据相关的部分,也是默认…

从大数据视角理解时序数据库选型:为何选择 Apache IoTDB?

目录一、什么是时序数据库?为什么你需要它?🔧典型应用场景:二、时序数据库选型维度有哪些?三、为什么推荐 Apache IoTDB?🧠 Apache 顶级项目,工业 IoT 场景原生支持🚀 性…

[ MySQL 数据库 ] 环境安装配置和使用

目录 一. 数据库(DataBase) 1.定义: 2. 常见的数据库产品: 3. MySQL数据库 (1). 介绍 : (2). cmd命令行方式连接 MySQL (3). MySQL的常用命令 二. MySQL数据库 环境安装及配置 三. SQL 1.定义 : 2. DDL (1)数据库 (2)数据表 1. 字段(列)和记录(行) 2. 表特征 3.…

Numpy科学计算与数据分析:Numpy布尔索引与花式索引实战

Numpy高级索引 学习目标 通过本课程,学员将掌握Numpy中布尔索引和花式索引的使用方法,能够灵活运用这些高级索引技术进行复杂的数据操作和处理。 相关知识点 Numpy高级索引 学习内容 1 Numpy高级索引 1.1 布尔索引 布尔索引是Numpy中一种非常强大…

【Linux】patch补丁的生成与使用方法总结

引言 在 Linux 和开源世界中,patch 是一个极其强大且常用的工具。它允许开发者和系统管理员以增量方式修改文件,特别适用于源代码的更新、错误修复、功能补丁的分发与应用。 目录 引言 一、patch介绍 二、生成补丁文件 三、补丁文件内容解析 四、p…

杂谈 001 · VScode / Copilot 25.08 更新

原文链接https://www.castamerego.com/blog/talk-001 2025.08.08 , VS code 发布八月更新,同一天 Copilot 也更新了 GPT-5, 浅体验一下 VS code 更新 发行说明更新页面内跳转显示 AI 比例页面内跳转 Copilot 更新 对话回溯 checkpoints页面内跳转进度列表页面内…

微软发布Project Ire项目:可自主检测恶意软件的人工智能系统

微软Project Ire项目利用AI自主逆向工程并分类软件性质微软近日公布了Project Ire项目,这是一个能够自主进行逆向工程并分类软件性质的人工智能(AI)系统。该系统由大型语言模型(LLM)驱动,通过使用反编译器等…

k8s核心组件——kubelet详解

🚀Kubernetes 核心组件解析:什么是 Kubelet?它的作用是什么? 在 Kubernetes(K8s)集群中,Kubelet 是最重要的 Node 组件之一,它负责管理和维护 Pod 的生命周期,确保容器在…

C++ 部署LSTM(.onnx)

0、 背景 在工业自动化控制领域,预测某些变量是否关键。根据工厂的数据,训练好模型之后,将其转我通用的onnx 模型,并实现高效的推理。 模型训练 import numpy as np from para import * from data_utils import MyDataset from da…

深度学习-卷积神经网络CNN-1×1卷积层

1x1卷积核,又称为网中网(Network in Network):NIN卷积的本质是有效提取相邻像素间的相关特征,而11的卷积显然没有此作用。它失去了卷积层的特有能力——在高度和宽度维度上,识别相邻元素间相互作用的能力。…

使用 Python 异步爬虫抓取豆瓣电影Top250排行榜

导读 在现代网络爬虫开发中,面对 海量网页数据、慢速响应的网络接口,传统的同步爬虫方式已经不能满足高效抓取需求。本文将手把手带你构建一个 基于 aiohttp + asyncio 的异步爬虫系统,实战目标是抓取豆瓣电影 Top250 排行榜中的电影名称、评分和详情页地址。 目录 导读 …

云原生开发全面解析:从核心理念到实践挑战与解决方案

1. 云原生开发的核心理念与定义 云原生(Cloud Native)是一种基于云计算环境设计和运行应用程序的方法论,其三大技术支柱为容器化、微服务和声明式API。根据CNCF定义,云原生技术通过标准化接口和自动化管理,使应用具备…

WebForms 实例

WebForms 实例 引言 WebForms 是 ASP.NET 技术中的一种重要技术,它允许开发者以表单的形式创建动态网页。本文将通过具体的实例,深入探讨 WebForms 的基本概念、实现方法以及在实际项目中的应用。 WebForms 简介 WebForms 是一种用于创建动态网页的框架,它允许开发者以类…

Java 之 多态

一、多态 多态故名思义,多种状态。比如Animal 这个类中,eat 方法是 公共的方法,但是当 People,Dog , Cat,继承时,我们知道人要吃的是米饭,狗要吃的是狗粮,猫要吃的是猫粮。所以当不同类型的引用…

文件结构树的├、└、─ 符号

目录一、├、└、─符号的背景二、├、└、─ 符号的含义2.1 ├ 带竖线的分支符号2.2 └不带竖线的分支符号2.3 ─横线符号三、Windows系统中生成目录树一、├、└、─符号的背景 我们在编程中,可能会经常遇到一些特殊符号├、└、─。这并非偶然,二十由…

微软XBOX游戏部门大裁员

近日有报道称,微软正计划对Xbox游戏部门进行另外一次裁员,影响的将是整个团队,而不是特定岗位或者部门,大概10%至20%的Xbox团队成员受到影响,这是微软这次对Xbox业务重组的一部分。 据报道,微软已经开始新…

【关于Java 8 的新特性】

问:“Java 8 有啥新东西?” 你憋了半天,只说出一句:“嗯……有 Lambda 表达式。”别慌!Java 8 可不只是“语法糖”那么简单。它是一次真正让 Java 从“老派”走向“现代” 的大升级!一、Lambda 表达式&…