深度学习制作自己的数据集—为数据集打上标签保存为txt文件,并进行划分和加载数据集

news2025/3/1 6:06:11

目录

0 前言

1 为图片数据集打上标签并保存为txt文件

2 将txt文件中的图片标签数据集随机划分为训练集和测试集

3 加载txt文件中的图片标签数据集


0 前言

      目前是被封控的第四天了,只能呆在宿舍不能出去,记得上次这样子还是一年前大四快毕业那时候了……

      这几天在宿舍没有什么事干,实验也暂时做不了了,将部分数据处理完后,就把之前的这个内容做一下笔记吧,这也不是什么新的知识了,简单记录一下,方便以后可以查看。

1 为图片数据集打上标签并保存为txt文件

       由于这里我做的是用深度学习回归预测,所以我的标签保存在(.csv)文件中,这时候需要将图片和标签一一对应起来,并且要分好文件夹,下面是我分好的文件夹(images保存的是图片,label.csv保存的是对应的标签,这里可以根据个人的数据集更改文件名称):

       下面是为图片数据集打上标签并保存为txt文件的代码(文件的路劲需要根据自己文件所在位置进行更改):

import os
import numpy as np
import pandas as pd

label = pd.read_csv('../dataset_1/label_1.csv')
label = np.array(label)
label = label.tolist()
target = ''
# for i in range(len(label)):
#     for j in range(len(label[i])):
#         target += str(label[i][j]) + ' '
#     print(target)
#     target = ''
def generate(dir):
    files = os.listdir(dir) #os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。
    # files.sort()  #对文件或文件夹进行排序
    files.sort(key=lambda x: int(x.replace("frame", "").split('.')[0]))
    print('****************')
    print('input :', dir)
    print('start...')
    target = ''
    i = 0
    listText = open('H:/代码练习/Deeplearning/data_txt_path/all_data_list_1.txt', 'a+')  #创建并打开一个txt文件,a+表示打开一个文件并追加内容
    listText.truncate(0)#清空txt文件里的内容
    for file in files:  #遍历文件夹中的文件
        fileType = os.path.split(file) #os.path.split()返回文件的路径和文件名,【0】为路径,【1】为文件名
        if fileType[1] == '.txt':  #若文件名的后缀为txt,则继续遍历循环,否则退出循环
            continue
        name = outer_path + folder + '/' +file  #name 为文件路径和文件名+空格+label+换行
        for j in range(len(label[i])):
            target += str(label[i][j]) + ' '
        name = name + ' ' + target + '\n'
        # print(name)
        # listText.write(name)  # 在创建的txt文件中写入name
        target = ''
        i += 1
        listText.write(name)  #在创建的txt文件中写入name
    listText.close() #关闭txt文件
    print('down!')
    print('****************')


outer_path = 'H:/代码练习/Deeplearning/dataset_1/'  # 这里是你的图片路径


if __name__ == '__main__':  #主函数
    folderlist = os.listdir(outer_path)# 列举文件夹
    for folder in folderlist:  #遍历文件夹中的文件夹(若engagement文件夹中存在txt或py文件,则后面会报错)
        generate(os.path.join(outer_path, folder))#调用generate函数,函数中的参数为:(图片路径+文件夹名,标签号)

        代码运行后结果如下图:序号1为图片的路径,序号2为对应的标签,因为我一张图片对应3个标签,所以有后面3个值。 

2 将txt文件中的图片标签数据集随机划分为训练集和测试集

       完成第一个步骤后,需要将txt文件中的图片标签数据集随机划分为训练集和测试集,划分后生成训练集和测试集两个txt文件,可以根据自己的需求,更改训练集和测试集的比例。下面为划分数据集的代码(文件的路劲需要根据自己文件所在位置进行更改):

import os
import random
# 划分比例,训练集 : 验证集 = 8 : 2
split_rate = 0.2

class SplitFiles():
    """按行分割文件"""

    def __init__(self, file_name):
        """初始化要分割的源文件名和分割后的文件行数"""
        self.file_name = file_name

    # def get_random(self):
    #     """生成随机数组,随机划分 (0,190001)txt标签行数, 7600测试集标签行数"""
    #     random_num = random.sample(range(0, 19001), 108)
    #
    #     return random_num

    def split_file(self):
        if self.file_name and os.path.exists(self.file_name):
            try:
                with open(self.file_name) as f:  # 使用with读文件
                    # temp_count = 1
                    file = f.readlines()
                    count = len(file)
                    eval_index = random.sample(file, k=int(count * split_rate))  # 从images列表中随机抽取 k 个图像名称
                    for index,image_path in enumerate(file):
                        if image_path in eval_index:
                            self.write_file('test', image_path)
                        else:
                            self.write_file('train', image_path)
                        # temp_count += 1

            except IOError as err:
                print(err)
        else:
            print("%s is not a validate file" % self.file_name)

    def get_part_file_name(self, part_name):
        """"获取分割后的文件名称:在源文件相同目录下建立临时文件夹temp_part_file,然后将分割后的文件放到该路径下"""
        temp_path = os.path.dirname(self.file_name)  # 获取文件的路径(不含文件名)
        file_folder = temp_path
        if not os.path.exists(file_folder):  # 如果临时目录不存在则创建
            os.makedirs(file_folder)
        part_file_name = file_folder + "/" + str(part_name) + "_list_1.txt"
        return part_file_name

    def write_file(self, part_num, line):
        """将按行分割后的内容写入相应的分割文件中"""
        part_file_name = self.get_part_file_name(part_num)
        try:
            with open(part_file_name, "a") as part_file:
                part_file.writelines(line)
        except IOError as err:
            print(err)


if __name__ == "__main__":
    file = SplitFiles(r'H:/代码练习/Deeplearning/data_txt_path/all_data_list_1.txt')
    file.split_file()

       我这里将总的数据文件和划分好的数据集存在一个文件夹里,方便后面管理(本来是只有3个txt文件的,我弄了两个数据集,所以就有了6个文件)。

 

3 加载txt文件中的图片标签数据集

      在完成步骤1和2后,最后是对数据进行加载,下面为加载数据的代码,后面读取数据调用这个类函数就可以:

import os
import numpy as np
import torch
from torchvision import transforms
from PIL import Image
from torch.utils.data import DataLoader
from torch.utils.data import Dataset
# 我们读取图片的根目录, 在根目录下有所有图片的txt文件, 拿到txt文件后, 先读取txt文件, 之后遍历txt文件中的每一行, 首先去除掉尾部的换行符, 在以空格切分,前半部分是图片名称, 后半部分是图片标签, 当图片名称和根目录结合,就得到了我们的图片路径
class MyDataset(Dataset):
    def __init__(self, img_path, transform=None):
        super(MyDataset, self).__init__()
        self.root = img_path
        # self.txt_root = self.root + 'all_list.txt'
        f = open(self.root, 'r')
        data = f.readlines()

        imgs = []
        labels = []
        # label_1,label_2,label_3 = [],[],[]
        for line in data:
            line = line.rstrip()
            word = line.split()
            imgs.append(os.path.join(self.root, word[1],word[2],word[3],word[0]))
            # labels.append([float(word[1]),float(word[2]),float(word[3])])
            labels.append([word[1],word[2],word[3]])
            # label_1,label_2,label_3 = word[1],word[2],word[3]
            # labels.append([[label_1],[label_2],[label_3]])
        self.img = imgs
        self.label = labels
        self.transform = transform
        # print(self.img)
        # print(self.label)

    def __len__(self):
        return len(self.label)
        return len(self.img)

    def __getitem__(self, item):
        img = self.img[item]
        label = self.label[item]
        # print(img)
        img = Image.open(img).convert('RGB')

        # 此时img是PIL.Image类型   label是str类型

        if transforms is not None:
            img = self.transform(img)
            # print(img.max())

        label = np.array(label).astype(np.float32)
        label = torch.from_numpy(label)
        return img, label

       注意:上面/下图代码是我同时加载了三个标签,因为一张图片我是同时对应了三个标签,假如是一个图片对应一个标签,可在以下图片的函数中进行更改: 

       因为我的标签是浮点数,所以我在这里将其变为浮点数类型,假如是整形,可以在上面代码下图位置更改。 

 

       在执行完步骤1的代码文件后,将图片数据集打上标签并保存为txt文件;在执行步骤2的代码文件将txt文件中的图片标签数据集随机划分为训练集和测试集;最后编写步骤3加载txt文件中的图片标签数据集代码,就可加载自己的数据集  。下面是深度学习训练时,调用上面加载数据的类实现对数据的加载,也可根据自己的代码进行编写,可以参考一下下面的例子:

root_train = r'H:/代码练习/Deeplearning/data_txt_path/train_list_1.txt'
root_test = r'H:/代码练习/Deeplearning/data_txt_path/test_list_1.txt'

#将图像的像素值归一化到[-1,1]之间
normalize = transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])

train_transform = transforms.Compose([
    transforms.Resize((224,224)),
    # transforms.RandomVerticalFlip(),
    transforms.ToTensor(),
    normalize])
val_transform = transforms.Compose([
    transforms.Resize((224,224)),
    # transforms.RandomVerticalFlip(),
    transforms.ToTensor(),
    normalize])

train_dataset = MyDataset(root_train,transform=train_transform)
val_dataset = MyDataset(root_test,transform=val_transform)

train_dataloader = DataLoader(dataset=train_dataset,batch_size=16,shuffle=True)
val_dataloader = DataLoader(dataset=val_dataset,batch_size=16,shuffle=True)

device = 'cuda' if torch.cuda.is_available() else 'cpu'
for batch, (x, y) in enumerate(data_loader):
    image, y= x.to(device), y.to(device)

 

参考来源:制作数据集(二)--为图片数据集打上标签并保存为txt文件_困坤的小菜鼠的博客-CSDN博客

python 划分数据集文件(txt标签文件按比例随机切分)_努力学习DePeng的博客-CSDN博客_python按比例随机切分数据

pytorch加载自己的图片数据集的两种方法__-周-_的博客-CSDN博客_pytorch读取图片数据集 

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

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

相关文章

CyberController手机外挂番外篇:源代码的二次修改

文章目录前言调试过程中的疑问为什么一段时间不使用CyberController,翻译就无法触发了?为什么连接成功了,但却依然无法进行语音识别和翻译?多长时间TCP连接就会挂掉连接正常与断开连接有什么区别?不停进行翻译&#xf…

现代密码学导论-18-伪随机置换

目录 伪随机置换 PROPOSITION 3.26 伪随机置换和伪随机函数的关系 DEFINITION 3.27 强伪随机置换 伪随机置换 我们称F是含参数k的置换,当且仅当 且对于所有k, Fk是一对一的,即是满射的。 其中 lin 称为F的块长度 对于给定的 k、x和k、y&…

76.【图】

图( 一).图的基本结构(1).无序偶对.(2).有序偶对(3).有向图和无向图(4).权(5).网图(二).图的基本术语(1).邻接.依附(2).有向完全图,无向完全图(3).顶点的度,入度,出度(4).路径 路径长度 回路(5).简单路径 简单回路(6).子图(7).连通图 连通分量(8).强连通图 强连通分量(三).图的…

改进粒子滤波的无人机三维航迹预测方法(基于Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

骨传导耳机贴不紧咋办,推荐五款佩戴最稳固的骨传导蓝牙耳机

很多小伙伴都在反馈,骨传导耳机在佩戴时戴不稳,这关乎于耳机的材质有很大的关系,下面就给大家推荐几款佩戴十分牢固的骨传导耳机,不调人群使用哦~看看有没有自己喜欢的吧~ 1、南卡Runner Pro4骨传导蓝牙耳机 ¥1498 南…

图与图的深度优先遍历、广度优先遍历

文章目录🚩图的理解🍁无向图🍁有向图🍁完全图🍁常用性质🚩图的数据结构搭建🍁邻接矩阵🍁邻接表🍁邻接矩阵式存储的代码实现🍁邻接矩阵造图测试🍁邻…

从零开始打造一款基于SpringBoot+SpringCloud的后台权限管理系统

随着 Spring Boot 和 Spring Cloud 的诞生和流行,集智慧于大成的 Spring 技术体系成为行业开发的首选之一。市场代表需求,技术代表能力。显而易见,在当今开发领域中,谁能更好地掌握这些主流开发技术,谁就能在跟别人竞争…

SecXOps 技术体系

核心能力 为了加快安全分析能力更全面、更深入的自动化 ,SecXOps 的目标在于创建一个集成的用于 Security 的 XOps 实践,提升安全分析的场景覆盖率和运营效率。SecXOps 技术并不 015 SecXOps 技术体系 是 Ops 技术在安全领域的简单加和,SecXO…

含分布式电源的配电网日前两阶段调度模型matlab程序(粒子群算法)

含分布式电源的配电网日前两阶段调度模型matlab程序(粒子群算法) 参考文献:含分布式电源的配电网日前两阶段优化调度模型 摘要:在电力市场环境下,供电公司通过对接入配电网的分布式电源(distributed generation&#…

MyBatis基础

一什么是MyBatis 1 什么是myBatis MyBatis框架也被称之为ORM(Object/Relation Mapping,即对象关系映射)框架。所谓的ORM就是一种为了解决面向对象与关系型数据库中数据类型不匹配的技术,它通过描述Java对象与数据库表之间的映射关…

Node.js 入门教程 6 V8 JavaScript 引擎

Node.js 入门教程 Node.js官方入门教程 Node.js中文网 本文仅用于学习记录,不存在任何商业用途,如侵删 文章目录Node.js 入门教程6 V8 JavaScript 引擎6.1 其他 JS 引擎6.2 追求性能6.3 编译6 V8 JavaScript 引擎 V8 是驱动 Google Chrome 的 JavaScrip…

【小5聊】纯javascript实现图片放大镜效果

实现图片放大镜效果,其实就是一个比例放大的效果 以下通过纯javascript方式对图片进行等比例放大,等比倍数和出界判断可自行实现 文章后面会附上全部代码 放大镜效果 1、 放大镜组成 1)目标图片,一般是小图 2)鼠标移…

【雷丰阳-谷粒商城 】【分布式基础篇-全栈开发篇】【01】分布式基础概念_环境搭建_Docker的使用

持续学习&持续更新中… 学习态度:守破离 【雷丰阳-谷粒商城 】【分布式基础篇-全栈开发篇】【01】分布式基础概念微服务集群&分布式&节点远程调用负载均衡服务注册/发现&注册中心配置中心服务熔断&降级API网关虚拟机环境搭建安装vagrant和virt…

gcc编译器

1. GCC工具 GCC编译器: GCC(GNU Compiler Collection)是由 GNU 开发的编程语言编译器。 GCC最初代表“GNU C Compiler”,当时只支持C语言。 后来又扩展能够支持更多编程语言,包括 C、Fortran 和 Java 等。 因此&#…

网站页面模仿学习

一、代码部分 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>cdcas</title> </head> <style>*{margin: 0;padding: 0;}.container{text-align: center;}.top{margin: auto;text-align: center;}.nav{…

pdf编辑器软件,分享一款考编用的pdf软件,挺合适的!

对于大部分人来说&#xff0c;最好的工作莫过于公务员、事业单位、国企&#xff0c;此类所谓的金饭碗、铁饭碗。工资收入处于中上水平&#xff0c;且朝九晚五。 不过想要获得这样的编制绝非易事&#xff0c;需要参加统考&#xff0c;经过层层选拔。很多年轻人感叹苦海无编&…

现代密码学导论-17-伪随机函数

目录 3.5.1伪随机函数的非正式定义 |Func_n| 有多大&#xff1f; DEFINITION 3.24 伪随机函数的正式定义 Example 3.25 一个不安全的反例 3.5.1伪随机函数的非正式定义 伪随机函数&#xff08;PRFs&#xff09;推广了伪随机发生器的概念。 F : {0, 1}∗ {0, 1}∗→ {0, 1…

Linux进程管理【进程的相关介绍片、ps、 kill 、pstree】【详细整理】

目录进程相关介绍显示系统执行的流程 psps 详解![请添加图片描述](https://img-blog.csdnimg.cn/cd9f10bf36684b419f2f94068afb9a03.png)案例终止进程kill 和 killall基本语法常见选型案例查看进程数pstreepstree [选项]&#xff0c;可以更加直观的来查看进程信息进程相关介绍 …

【无线传感器】使用 Mamdani 模糊推理系统改进无线传感器网络路由和数据包传递附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

【语音去噪】谱减法+维纳滤波语音去噪(带面板+信噪比)【含GUI Matlab源码 1661期】

⛄一、简介 1 维纳滤波法 维纳滤波法(wiener filter)也是一个比较经典的传统做法&#xff0c;它的本质是估计出一个线性滤波器&#xff0c;也就是一个向量&#xff0c;这个滤波器会对不同的频段进行不同程度的抑制&#xff0c;其保真效果会比谱减法要好一些。 我们这里不会讲…