小言_互联网的博客

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

495人阅读  评论(0)

目录

0 前言

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

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

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


0 前言

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

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

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

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

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


  
  1. import os
  2. import numpy as np
  3. import pandas as pd
  4. label = pd.read_csv( '../dataset_1/label_1.csv')
  5. label = np.array(label)
  6. label = label.tolist()
  7. target = ''
  8. # for i in range(len(label)):
  9. # for j in range(len(label[i])):
  10. # target += str(label[i][j]) + ' '
  11. # print(target)
  12. # target = ''
  13. def generate( dir):
  14. files = os.listdir( dir) #os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。
  15. # files.sort() #对文件或文件夹进行排序
  16. files.sort(key= lambda x: int(x.replace( "frame", "").split( '.')[ 0]))
  17. print( '****************')
  18. print( 'input :', dir)
  19. print( 'start...')
  20. target = ''
  21. i = 0
  22. listText = open( 'H:/代码练习/Deeplearning/data_txt_path/all_data_list_1.txt', 'a+') #创建并打开一个txt文件,a+表示打开一个文件并追加内容
  23. listText.truncate( 0) #清空txt文件里的内容
  24. for file in files: #遍历文件夹中的文件
  25. fileType = os.path.split(file) #os.path.split()返回文件的路径和文件名,【0】为路径,【1】为文件名
  26. if fileType[ 1] == '.txt': #若文件名的后缀为txt,则继续遍历循环,否则退出循环
  27. continue
  28. name = outer_path + folder + '/' +file #name 为文件路径和文件名+空格+label+换行
  29. for j in range( len(label[i])):
  30. target += str(label[i][j]) + ' '
  31. name = name + ' ' + target + '\n'
  32. # print(name)
  33. # listText.write(name) # 在创建的txt文件中写入name
  34. target = ''
  35. i += 1
  36. listText.write(name) #在创建的txt文件中写入name
  37. listText.close() #关闭txt文件
  38. print( 'down!')
  39. print( '****************')
  40. outer_path = 'H:/代码练习/Deeplearning/dataset_1/' # 这里是你的图片路径
  41. if __name__ == '__main__': #主函数
  42. folderlist = os.listdir(outer_path) # 列举文件夹
  43. for folder in folderlist: #遍历文件夹中的文件夹(若engagement文件夹中存在txt或py文件,则后面会报错)
  44. generate(os.path.join(outer_path, folder)) #调用generate函数,函数中的参数为:(图片路径+文件夹名,标签号)

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

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

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


  
  1. import os
  2. import random
  3. # 划分比例,训练集 : 验证集 = 8 : 2
  4. split_rate = 0.2
  5. class SplitFiles():
  6. """按行分割文件"""
  7. def __init__( self, file_name):
  8. """初始化要分割的源文件名和分割后的文件行数"""
  9. self.file_name = file_name
  10. # def get_random(self):
  11. # """生成随机数组,随机划分 (0,190001)txt标签行数, 7600测试集标签行数"""
  12. # random_num = random.sample(range(0, 19001), 108)
  13. #
  14. # return random_num
  15. def split_file( self):
  16. if self.file_name and os.path.exists(self.file_name):
  17. try:
  18. with open(self.file_name) as f: # 使用with读文件
  19. # temp_count = 1
  20. file = f.readlines()
  21. count = len(file)
  22. eval_index = random.sample(file, k= int(count * split_rate)) # 从images列表中随机抽取 k 个图像名称
  23. for index,image_path in enumerate(file):
  24. if image_path in eval_index:
  25. self.write_file( 'test', image_path)
  26. else:
  27. self.write_file( 'train', image_path)
  28. # temp_count += 1
  29. except IOError as err:
  30. print(err)
  31. else:
  32. print( "%s is not a validate file" % self.file_name)
  33. def get_part_file_name( self, part_name):
  34. """"获取分割后的文件名称:在源文件相同目录下建立临时文件夹temp_part_file,然后将分割后的文件放到该路径下"""
  35. temp_path = os.path.dirname(self.file_name) # 获取文件的路径(不含文件名)
  36. file_folder = temp_path
  37. if not os.path.exists(file_folder): # 如果临时目录不存在则创建
  38. os.makedirs(file_folder)
  39. part_file_name = file_folder + "/" + str(part_name) + "_list_1.txt"
  40. return part_file_name
  41. def write_file( self, part_num, line):
  42. """将按行分割后的内容写入相应的分割文件中"""
  43. part_file_name = self.get_part_file_name(part_num)
  44. try:
  45. with open(part_file_name, "a") as part_file:
  46. part_file.writelines(line)
  47. except IOError as err:
  48. print(err)
  49. if __name__ == "__main__":
  50. file = SplitFiles( r'H:/代码练习/Deeplearning/data_txt_path/all_data_list_1.txt')
  51. file.split_file()

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

 

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

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


  
  1. import os
  2. import numpy as np
  3. import torch
  4. from torchvision import transforms
  5. from PIL import Image
  6. from torch.utils.data import DataLoader
  7. from torch.utils.data import Dataset
  8. # 我们读取图片的根目录, 在根目录下有所有图片的txt文件, 拿到txt文件后, 先读取txt文件, 之后遍历txt文件中的每一行, 首先去除掉尾部的换行符, 在以空格切分,前半部分是图片名称, 后半部分是图片标签, 当图片名称和根目录结合,就得到了我们的图片路径
  9. class MyDataset( Dataset):
  10. def __init__( self, img_path, transform=None):
  11. super(MyDataset, self).__init__()
  12. self.root = img_path
  13. # self.txt_root = self.root + 'all_list.txt'
  14. f = open(self.root, 'r')
  15. data = f.readlines()
  16. imgs = []
  17. labels = []
  18. # label_1,label_2,label_3 = [],[],[]
  19. for line in data:
  20. line = line.rstrip()
  21. word = line.split()
  22. imgs.append(os.path.join(self.root, word[ 1],word[ 2],word[ 3],word[ 0]))
  23. # labels.append([float(word[1]),float(word[2]),float(word[3])])
  24. labels.append([word[ 1],word[ 2],word[ 3]])
  25. # label_1,label_2,label_3 = word[1],word[2],word[3]
  26. # labels.append([[label_1],[label_2],[label_3]])
  27. self.img = imgs
  28. self.label = labels
  29. self.transform = transform
  30. # print(self.img)
  31. # print(self.label)
  32. def __len__( self):
  33. return len(self.label)
  34. return len(self.img)
  35. def __getitem__( self, item):
  36. img = self.img[item]
  37. label = self.label[item]
  38. # print(img)
  39. img = Image. open(img).convert( 'RGB')
  40. # 此时img是PIL.Image类型 label是str类型
  41. if transforms is not None:
  42. img = self.transform(img)
  43. # print(img.max())
  44. label = np.array(label).astype(np.float32)
  45. label = torch.from_numpy(label)
  46. return img, label

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

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

 

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


  
  1. root_train = r'H:/代码练习/Deeplearning/data_txt_path/train_list_1.txt'
  2. root_test = r'H:/代码练习/Deeplearning/data_txt_path/test_list_1.txt'
  3. #将图像的像素值归一化到[-1,1]之间
  4. normalize = transforms.Normalize([ 0.485, 0.456, 0.406], [ 0.229, 0.224, 0.225])
  5. train_transform = transforms.Compose([
  6. transforms.Resize(( 224, 224)),
  7. # transforms.RandomVerticalFlip(),
  8. transforms.ToTensor(),
  9. normalize])
  10. val_transform = transforms.Compose([
  11. transforms.Resize(( 224, 224)),
  12. # transforms.RandomVerticalFlip(),
  13. transforms.ToTensor(),
  14. normalize])
  15. train_dataset = MyDataset(root_train,transform=train_transform)
  16. val_dataset = MyDataset(root_test,transform=val_transform)
  17. train_dataloader = DataLoader(dataset=train_dataset,batch_size= 16,shuffle= True)
  18. val_dataloader = DataLoader(dataset=val_dataset,batch_size= 16,shuffle= True)
  19. device = 'cuda' if torch.cuda.is_available() else 'cpu'
  20. for batch, (x, y) in enumerate(data_loader):
  21. image, y= x.to(device), y.to(device)

 

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

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

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


转载:https://blog.csdn.net/weixin_42795788/article/details/128049574
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场