数据集划分、label生成及按label将图片分类到不同文件夹 您所在的位置:网站首页 euphoria1到6集的名字 数据集划分、label生成及按label将图片分类到不同文件夹

数据集划分、label生成及按label将图片分类到不同文件夹

2023-08-14 00:37| 来源: 网络整理| 查看: 265

1.数据集介绍1.1 概念1.2 数据集结构 2. 数据集划分及生成label2.1 结构一2.2 结构二2.3 结构三 3. 数据集按label分类到不同文件夹

1.数据集介绍 1.1 概念

    机器学习所用数据集一般分为训练集、验证集、测试集。

训练集:用于训练的样本集合,主要用来训练神经网络中的参数。验证集:用于验证模型性能的样本集合.不同神经网络在训练集上训练结束后,通过验证集来比较判断各个模型的性能.这里的不同模型主要是指对应不同超参数的神经网络,也可以指完全不同结构的神经网络。测试集:对于训练完成的神经网络,测试集用于检验最终选择最优的模型性能。

    打个比方,从前有个本科生(机器学习)刚开始啥也不会,但是他想考上研究生,于是他就通过大量刷题(训练集)来学习新知识,刷的题都是带有答案(训练集label)的。每做一题对一下答案(label),就这样不断地学习新知识,当他学习一轮之后,他想知道自己能考多少分,于是他给自己来了一个模拟考试(验证集),再对一下答案(验证集label),然后得知自己的得分(评估指标),发现自己得分不是很高,平时刷题表现好,一到模拟考试就表现不好(过拟合)。于是他调整自己的学习方式(调参),…就这样通过几轮复习之后他走上了考场开始考试(测试集),得分很高,终于考上了研究生。

1.2 数据集结构

常见的数据集结构

Dataset/ #以train文件夹为例,val和test文件夹类似 train/ class1/ a1.jpg a2.jpg a3.jpg ... class2/ b1.jpg b2.jpg b3.jpg ... class3/ c1.jpg c2.jpg c3.jpg ... val/ test/ Dataset/ train/ 1.jpg 2.jpg 3.jpg ... val/ test/ Dataset/ 1.jpg 2.jpg 3.jpg ... 2. 数据集划分及生成label 2.1 结构一

    如果是第一种结构的数据集,它已经根据训练、验证、测试和类别划分好了数据集,只需生成label即可。 根据二级目录(class)生成label,可写入csv文件或者txt文件(实际使用,用txt文件就好,csv自己写着玩玩的)。

# -*-coding:utf-8-*- import os import os.path def write_txt(content, filename, mode='w'): """保存txt数据 :param content:需要保存的数据,type->list :param filename:文件名 """ with open(filename, mode) as f: for line in content: str_line = "" for col, data in enumerate(line): if not col == len(line) - 1: # 以空格作为分隔符 str_line = str_line + str(data) + " " else: # 每行最后一个数据用换行符“\n” str_line = str_line + str(data) + "\n" f.write(str_line) def get_files_list(dir): ''' 实现遍历dir目录下,所有文件(包含子文件夹的文件) :param dir:指定文件夹目录 :return:包含所有文件的列表->list ''' # parent:父目录, filenames:该目录下所有文件夹,filenames:该目录下的文件名 files_list = [] #写入文件的数据 for parent, dirnames, filenames in os.walk(dir): for filename in filenames: print("parent is: " + parent) print("filename is: " + filename) print(os.path.join(parent, filename).replace('\\','/')) # 输出rootdir路径下所有文件(包含子文件)信息 curr_file = parent.split(os.sep)[-1] #获取正在遍历的文件夹名(也就是类名) #根据class名确定labels if curr_file == "class1": labels = 0 elif curr_file == "class1": labels = 1 elif curr_file == "class1": labels = 2 dir_path = parent.replace('\\', '/').split('/')[-2] #train?val?test? curr_file = os.path.join(dir_path, curr_file) #相对路径 files_list.append([os.path.join(curr_file, filename).replace('\\','/'), labels]) #相对路径+label #写入csv文件 path = "%s" % os.path.join(curr_file, filename).replace('\\','/') label = "%d" % labels list = [path, label] data = pd.DataFrame([list]) if dir == './Dataset/train': data.to_csv("./Dataset/train.csv", mode='a', header=False, index=False) elif dir == './Dataset/val': data.to_csv("./Dataset/val.csv", mode='a', header=False, index=False) return files_list if __name__ == '__main__': import pandas as pd #先生成两个csv文件夹 df = pd.DataFrame(columns=['path', 'label']) df.to_csv("./Dataset/train.csv", index=False) df2 = pd.DataFrame(columns=['path', 'label']) df2.to_csv("./Dataset/val.csv", index=False) #写入txt文件 train_dir = './Dataset/train' train_txt = './Dataset/train.txt' train_data = get_files_list(train_dir) write_txt(train_data, train_txt, mode='w') val_dir = './Dataset/val' val_txt = './Dataset/val.txt' val_data = get_files_list(val_dir) write_txt(val_data, val_txt, mode='w') 2.2 结构二

    这种结构也划分好了数据集,但无法通过类名生成label了,数据集一般都会自带带有label的文件,直接葱里面提取文件名(路径)和label即可。

2.3 结构三

    这种数据及所有图片都放在一个文件夹,一般也自带一个带有label的文件,训练集验证集测试集需要自己去划分。     下面举个栗子(ODIR-5k数据集,包含6398个图)对数据集进行划分和label生成:     6398张图片全放在第一个文件夹,full_df_csv是label数据 在这里插入图片描述 preprocessed_images文件夹 在这里插入图片描述 full_df_csv文件label部分(共8个不同的label) 在这里插入图片描述 新建一个项目文件夹,将full_df_csv文件放进去

提取csv文件的图片文件名和label信息保存到txt文件

label_extraction.py

import pandas as pd def csv_to_txt(csv_path, txt_path): data = pd.read_csv(csv_path, encoding='utf-8') with open(txt_path, 'w', encoding='utf-8') as f: for line in data.values: file_name = str(line[18]) #获取图像文件名,文件名在csv文件的第18列(从0开始) if str(line[16]) == "['N']": #获取文件label信息,共8个label,都转化为0~7 labels = 0 elif str(line[16]) == "['D']": labels = 1 elif str(line[16]) == "['G']": labels = 2 elif str(line[16]) == "['C']": labels = 3 elif str(line[16]) == "['A']": labels = 4 elif str(line[16]) == "['H']": labels = 5 elif str(line[16]) == "['M']": labels = 6 elif str(line[16]) == "['O']": labels = 7 labels = "%s" % labels f.write(file_name+ ' ' + labels + '\n') if __name__ == '__main__': csv_to_txt('./full_df.csv', './label.txt')

生成label.txt 在这里插入图片描述

如果不需要那么多数据,只需要提取想要的label的图片(比如只要label为N和D的),可以这样设置:

def csv_to_txt(csv_path, txt_path): data = pd.read_csv(csv_path, encoding='utf-8') with open(txt_path, 'w', encoding='utf-8') as f: for line in data.values: file_name = str(line[18]) #获取图像文件名,文件名在csv文件的第18列(从0开始) if str(line[16]) == "['N']": #获取文件label信息,csv文件共8个label labels = 0 elif str(line[16]) == "['D']": labels = 1 elif str(line[16]) == "['G']": labels = -1 elif str(line[16]) == "['C']": labels = -1 elif str(line[16]) == "['A']": labels = -1 elif str(line[16]) == "['H']": labels = -1 elif str(line[16]) == "['M']": labels = -1 elif str(line[16]) == "['O']": labels = -1 if labels >= 0:#将属于其他label的图片过滤掉。 labels = "%s" % labels f.write(file_name+ ' ' + labels + '\n') if __name__ == '__main__': csv_to_txt('./full_df.csv', './label.txt') 将label.txt打乱顺序并写入到新的txt文件

disrupt order.py

import random # 读取文件中的内容,并写入列表FileNameList def ReadFileDatas(original_filename): FileNameList = [] file = open(original_filename, 'r+', encoding='utf-8') for line in file: FileNameList.append(line) # 写入文件内容到列表中去 print('数据集总量:', len(FileNameList)) file.close() return FileNameList # listInfo为 ReadFileDatas 的列表 def WriteDatasToFile(listInfo, new_filename): f = open(new_filename, mode='w', encoding='utf-8') for idx in range(len(listInfo)): str = listInfo[idx] # 列表指针 f.write(str) f.close() print('写入 %s 文件成功.' % new_filename) if __name__ == "__main__": listFileInfo = ReadFileDatas('./label.txt') # 读取文件 random.shuffle(listFileInfo) # 打乱顺序 WriteDatasToFile(listFileInfo,'./new_data.txt') # 保存新的文件

new_data.txt

在这里插入图片描述

随机划分数据集(train:val:test=7:2:1)

divide.py

#列表分别存放数据集 L_train = [] L_val = [] L_test = [] #按7:2:1比例划分数据集 def TrainValTestFile(new_filename): file_divide = open(new_filename, 'r', encoding='utf-8') lines = file_divide.readlines() i = 0 # counter j = len(lines) # number of dataset for line in lines: if i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有