前言:
在上一篇博客学习了如何将数据集转换成jpg文件,本文介绍如何将数据集转换为png的格式,以及如何将数据信息存储在csv文件中,实现代码比上编博客有所改进。
一、格式转换
我的训练数据集保存路径如下:
随意进入一个文件夹,可以看到:
来看看测试数据集:
在进行批量转换之前,我们创建两个目录:
E:\DataSet\GTRSB\GTSRB_Final_Training_Images_png\GTSRB\Final_Training\Images
E:\DataSet\GTRSB\GTSRB_Final_Test_Images_png\GTSRB\Final_Test\Images
这表示接下来转换完成以后的png文件将保存在该路径下,即保存在相应的Images文件夹内,因此先保证该文件夹存在。
我们编写程序:
# coding=utf-8 from PIL import Image import os import shutil import random import numpy as np #训练集文件格式转换器,将图片由ppm格式转为png格式 def trainFormatConverter(dir_from_path,dir_to_path): #目的文件夹,如果不存在,则创建文件夹;如果存在,删除原来的文件夹,再创建文件夹 if (not os.path.exists(dir_to_path)): os.mkdir(dir_to_path) # 假如path_01 = 'Test\\path_01\\path_02\\path_03',os.mkdir(path_01)创建路径中的最后一级目录, # 即:只创建path_03目录,而如果之前的目录不存在并且也需要创建的话,就会报错。 # os.makedirs(path_01)创建多层目录,即:Test,path_01,path_02,path_03如果都不存在的话,会自动创建。 else: shutil.rmtree(dir_to_path) #shutil是一个高层次的文件操作模块,此处先删除原来的目录 os.mkdir(dir_to_path) #创建一个新目录 # 判断源文件夹是否存在 if (os.path.exists(dir_from_path)): dir_from_children_names = os.listdir(dir_from_path) # 获取该目录下的所有文件夹目录,部分展示如下: # print(dir_from_children_names ) # ['00000', '00001', '00002', '00003', '00004', '00005', '00006', '00007', # '00008', '00009', '00010', '00011', '00012', '00013', '00014', '00015', # ... for dir_from_children_name in dir_from_children_names: # print("开始处理该路径下的子目录:" + str(dir_from_children_name)) # 部分输出如下所示: # 开始处理该路径下的子目录: 00000 # 开始处理该路径下的子目录: 00001 # 开始处理该路径下的子目录: 00002 # 开始处理该路径下的子目录: 00003 dir_from_children_path = os.path.join(dir_from_path,dir_from_children_name) # print(dir_from_children_path),部分输出如下: # E:\DataSet\GTRSB\GTSRB_Final_Training_Images\GTSRB\Final_Training\Images\00000 # E:\DataSet\GTRSB\GTSRB_Final_Training_Images\GTSRB\Final_Training\Images\00001 # E:\DataSet\GTRSB\GTSRB_Final_Training_Images\GTSRB\Final_Training\Images\00002 # E:\DataSet\GTRSB\GTSRB_Final_Training_Images\GTSRB\Final_Training\Images\00003 dir_to_children_path = os.path.join(dir_to_path,dir_from_children_name) # print( dir_to_children_path ),部分输出如下: # E:\DataSet\GTRSB\GTSRB_Final_Training_Images_png\GTSRB\Final_Training\Images\00000 # E:\DataSet\GTRSB\GTSRB_Final_Training_Images_png\GTSRB\Final_Training\Images\00001 # E:\DataSet\GTRSB\GTSRB_Final_Training_Images_png\GTSRB\Final_Training\Images\00002 # E:\DataSet\GTRSB\GTSRB_Final_Training_Images_png\GTSRB\Final_Training\Images\00003 if not os.path.exists(dir_to_children_path): os.mkdir(dir_to_children_path) # 表示,假如在E:\DataSet\GTRSB\GTSRB_Final_Training_Images_png\GTSRB\Final_Training\Images下 # 没有文件夹00000,则在该路径下新建文件夹00000。 fileNames = os.listdir(dir_from_children_path) # print("fileNames:" + str(fileNames)),部分展示如下: # fileNames: ['00000_00000.ppm', '00000_00001.ppm', '00000_00002.ppm', '00000_00003.ppm',... for fileName in fileNames: (shotName,suffix) = os.path.splitext(fileName) # os.path.splitext()用于返回文件名和扩展名元组, # print((shotName,suffix)),部分展示如下: # ('00000_00000', '.ppm') # ('00000_00001', '.ppm') # ('00000_00002', '.ppm') # ('00000_00003', '.ppm') if suffix == ".ppm": #对后缀为.ppm的文件进行格式转换 file_from_path = os.path.join(dir_from_children_path, fileName) # print(file_from_path),部分输出如下: # E:\DataSet\GTRSB\GTSRB_Final_Training_Images\GTSRB\Final_Training\Images\00000\00000_00000.ppm # E:\DataSet\GTRSB\GTSRB_Final_Training_Images\GTSRB\Final_Training\Images\00000\00000_00001.ppm # E:\DataSet\GTRSB\GTSRB_Final_Training_Images\GTSRB\Final_Training\Images\00000\00000_00002.ppm file_to_path = os.path.join(dir_to_children_path,(shotName+".png")) # print(file_to_path),部分输出如下: # E:\DataSet\GTRSB\GTSRB_Final_Training_Images_png\GTSRB\Final_Training\Images\00000\00000_00000.png # E:\DataSet\GTRSB\GTSRB_Final_Training_Images_png\GTSRB\Final_Training\Images\00000\00000_00001.png # E:\DataSet\GTRSB\GTSRB_Final_Training_Images_png\GTSRB\Final_Training\Images\00000\00000_00002.png img = Image.open(file_from_path) # 对于彩色图像,不管其图像格式是PNG,还是BMP,或者JPG,在PIL中, # 使用Image模块的open()函数打开后,PIL会将它们解码为三通道的“RGB”图像。 # 用户可以基于这个“RGB”图像,对其进行处理。 img.save(file_to_path) # im.save(path, format, options…) # 含义:使用给定的文件名保存图像。如果变量format缺省,如果可能的话, # 则从path的文件名称的扩展名判断文件的格式,该方法返回为空。 elif suffix == ".csv": # 对后缀为.csv的文件进行复制 file_from_path = os.path.join(dir_from_children_path, fileName) # print(file_from_path),部分输出如下: # E:\DataSet\GTRSB\GTSRB_Final_Training_Images\GTSRB\Final_Training\Images\00000\GT - 00000.csv # E:\DataSet\GTRSB\GTSRB_Final_Training_Images\GTSRB\Final_Training\Images\00001\GT - 00001.csv # E:\DataSet\GTRSB\GTSRB_Final_Training_Images\GTSRB\Final_Training\Images\00002\GT - 00002.csv file_to_path = os.path.join(dir_to_children_path, fileName) # print(file_to_path ),部分输出如下: # E:\DataSet\GTRSB\GTSRB_Final_Training_Images_png\GTSRB\Final_Training\Images\00000\GT - 00000.csv # E:\DataSet\GTRSB\GTSRB_Final_Training_Images_png\GTSRB\Final_Training\Images\00001\GT - 00001.csv shutil.copy(file_from_path, file_to_path) # shutil.copy(source, destination)函数实现文件复制功能, # 将source文件复制到destination文件夹中,两个参数都是字符串格式。 # 如果destination是一个文件名称,那么它会被用来当作复制后的文件名称,即等于复制+重命名。 else: print("dir_from_path不存在") # 测试集文件格式转换器,将图片由ppm格式转为png格式 def testFormatConverter(dir_from_path,dir_to_path): # 目的文件夹,如果不存在,则创建文件夹;如果存在,删除原来的文件夹,再创建文件夹 if (not os.path.exists(dir_to_path)): os.mkdir(dir_to_path) # 假如path_01 = 'Test\\path_01\\path_02\\path_03',os.mkdir(path_01)创建路径中的最后一级目录, # 即:只创建path_03目录,而如果之前的目录不存在并且也需要创建的话,就会报错。 # os.makedirs(path_01)创建多层目录,即:Test,path_01,path_02,path_03如果都不存在的话,会自动创建。 else: shutil.rmtree(dir_to_path) # 先删除原来的目录 os.mkdir(dir_to_path) # 再创建一个新目录 index = 0 #技术 # 判断源文件夹是否存在 if (os.path.exists(dir_from_path)): # 获取该目录下的所有文件夹目录,例:00000,00001,00002 fileNames = os.listdir(dir_from_path) # print(fileNames),部分输出如下所示: # ['00000.ppm', '00001.ppm', '00002.ppm', '00003.ppm', '00004.ppm', '00005.ppm', '00006.ppm', # '00007.ppm', 00008.ppm', '00009.ppm', '00010.ppm', '00011.ppm', '00012.ppm', '00013.ppm', ... for fileName in fileNames: # 得到该文件下所有目录的路径 if index % 1000 == 0: print("第"+str(index)+"个文件,开始处理该文件,fileName:" + str(fileName)) # 部分输出如下: # 第0个文件,开始处理该文件,fileName: 00000.ppm # 第1000个文件,开始处理该文件,fileName: 01000.ppm # 第2000个文件,开始处理该文件,fileName: 02000.ppm (shotName, suffix) = os.path.splitext(fileName) # print( (shotName, suffix)),部分输出如下: # ('00000', '.ppm') # ('00001', '.ppm') # ('00002', '.ppm') # ('00003', '.ppm') if suffix == ".ppm": # 对后缀为.ppm的文件进行格式转换 file_from_path = os.path.join(dir_from_path, fileName) file_to_path = os.path.join(dir_to_path, (shotName + ".png")) # print(file_to_path),部分输出如下所示: # E:\DataSet\GTRSB\GTSRB_Final_Test_Images_png\GTSRB\Final_Test\Images\00000.png # E:\DataSet\GTRSB\GTSRB_Final_Test_Images_png\GTSRB\Final_Test\Images\00001.png # E:\DataSet\GTRSB\GTSRB_Final_Test_Images_png\GTSRB\Final_Test\Images\00002.png # E:\DataSet\GTRSB\GTSRB_Final_Test_Images_png\GTSRB\Final_Test\Images\00003.png img = Image.open(file_from_path) img.save(file_to_path) elif suffix == ".csv": file_from_path = os.path.join(dir_from_path, fileName) file_to_path = os.path.join(dir_to_path, fileName) shutil.copy(file_from_path, file_to_path) index=index+1 print("文件个数:"+str(len(fileNames))) else: print("dir_from_path不存在") if __name__ == "__main__": train_dir_from_path = "E:\\DataSet\\GTRSB\\GTSRB_Final_Training_Images\\GTSRB\\Final_Training\\Images" train_dir_to_path = "E:\\DataSet\\GTRSB\\GTSRB_Final_Training_Images_png\\GTSRB\\Final_Training\\Images" trainFormatConverter(train_dir_from_path,train_dir_to_path) test_dir_from_path = "E:\\DataSet\\GTRSB\\GTSRB_Final_Test_Images\\GTSRB\\Final_Test\\Images" test_dir_to_path = "E:\\DataSet\\GTRSB\\GTSRB_Final_Test_Images_png\\GTSRB\\Final_Test\\Images" testFormatConverter(test_dir_from_path, test_dir_to_path)
运行程序以后,我们进入保存png文件的路径下,可以看到:
进入一个文件夹:
然后看看测试集:
完成啦!
二、创建CSV文件
现在我们将每个png格式的样本的绝对地址以及对应的类别标签存储在CSV文件当中,这个我们就可以通过CSV文件来找到每个样本的信息。
在上一节的基础上,添加代码,如下:
# coding=utf-8 from PIL import Image import os import shutil import random import csv import numpy as np import pandas as pd #训练集文件格式转换器,将图片由ppm格式转为png格式 def trainFormatConverter(dir_from_path,dir_to_path): #目的文件夹,如果不存在,则创建文件夹;如果存在,删除原来的文件夹,再创建文件夹 if (not os.path.exists(dir_to_path)): os.mkdir(dir_to_path) # 假如path_01 = 'Test\\path_01\\path_02\\path_03',os.mkdir(path_01)创建路径中的最后一级目录, # 即:只创建path_03目录,而如果之前的目录不存在并且也需要创建的话,就会报错。 # os.makedirs(path_01)创建多层目录,即:Test,path_01,path_02,path_03如果都不存在的话,会自动创建。 else: shutil.rmtree(dir_to_path) #shutil是一个高层次的文件操作模块,此处先删除原来的目录 os.mkdir(dir_to_path) #创建一个新目录 # 判断源文件夹是否存在 if (os.path.exists(dir_from_path)): dir_from_children_names = os.listdir(dir_from_path) # 获取该目录下的所有文件夹目录,部分展示如下: # print(dir_from_children_names ) # ['00000', '00001', '00002', '00003', '00004', '00005', '00006', '00007', # '00008', '00009', '00010', '00011', '00012', '00013', '00014', '00015', # ... for dir_from_children_name in dir_from_children_names: # print("开始处理该路径下的子目录:" + str(dir_from_children_name)) # 部分输出如下所示: # 开始处理该路径下的子目录: 00000 # 开始处理该路径下的子目录: 00001 # 开始处理该路径下的子目录: 00002 # 开始处理该路径下的子目录: 00003 dir_from_children_path = os.path.join(dir_from_path,dir_from_children_name) # print(dir_from_children_path),部分输出如下: # E:\DataSet\GTRSB\GTSRB_Final_Training_Images\GTSRB\Final_Training\Images\00000 # E:\DataSet\GTRSB\GTSRB_Final_Training_Images\GTSRB\Final_Training\Images\00001 # E:\DataSet\GTRSB\GTSRB_Final_Training_Images\GTSRB\Final_Training\Images\00002 # E:\DataSet\GTRSB\GTSRB_Final_Training_Images\GTSRB\Final_Training\Images\00003 dir_to_children_path = os.path.join(dir_to_path,dir_from_children_name) # print( dir_to_children_path ),部分输出如下: # E:\DataSet\GTRSB\GTSRB_Final_Training_Images_png\GTSRB\Final_Training\Images\00000 # E:\DataSet\GTRSB\GTSRB_Final_Training_Images_png\GTSRB\Final_Training\Images\00001 # E:\DataSet\GTRSB\GTSRB_Final_Training_Images_png\GTSRB\Final_Training\Images\00002 # E:\DataSet\GTRSB\GTSRB_Final_Training_Images_png\GTSRB\Final_Training\Images\00003 if not os.path.exists(dir_to_children_path): os.mkdir(dir_to_children_path) # 表示,假如在E:\DataSet\GTRSB\GTSRB_Final_Training_Images_png\GTSRB\Final_Training\Images下 # 没有文件夹00000,则在该路径下新建文件夹00000。 fileNames = os.listdir(dir_from_children_path) # print("fileNames:" + str(fileNames)),部分展示如下: # fileNames: ['00000_00000.ppm', '00000_00001.ppm', '00000_00002.ppm', '00000_00003.ppm',... for fileName in fileNames: (shotName,suffix) = os.path.splitext(fileName) # os.path.splitext()用于返回文件名和扩展名元组, # print((shotName,suffix)),部分展示如下: # ('00000_00000', '.ppm') # ('00000_00001', '.ppm') # ('00000_00002', '.ppm') # ('00000_00003', '.ppm') if suffix == ".ppm": #对后缀为.ppm的文件进行格式转换 file_from_path = os.path.join(dir_from_children_path, fileName) # print(file_from_path),部分输出如下: # E:\DataSet\GTRSB\GTSRB_Final_Training_Images\GTSRB\Final_Training\Images\00000\00000_00000.ppm # E:\DataSet\GTRSB\GTSRB_Final_Training_Images\GTSRB\Final_Training\Images\00000\00000_00001.ppm # E:\DataSet\GTRSB\GTSRB_Final_Training_Images\GTSRB\Final_Training\Images\00000\00000_00002.ppm file_to_path = os.path.join(dir_to_children_path,(shotName+".png")) # print(file_to_path),部分输出如下: # E:\DataSet\GTRSB\GTSRB_Final_Training_Images_png\GTSRB\Final_Training\Images\00000\00000_00000.png # E:\DataSet\GTRSB\GTSRB_Final_Training_Images_png\GTSRB\Final_Training\Images\00000\00000_00001.png # E:\DataSet\GTRSB\GTSRB_Final_Training_Images_png\GTSRB\Final_Training\Images\00000\00000_00002.png img = Image.open(file_from_path) # 对于彩色图像,不管其图像格式是PNG,还是BMP,或者JPG,在PIL中, # 使用Image模块的open()函数打开后,PIL会将它们解码为三通道的“RGB”图像。 # 用户可以基于这个“RGB”图像,对其进行处理。 img.save(file_to_path) # im.save(path, format, options…) # 含义:使用给定的文件名保存图像。如果变量format缺省,如果可能的话, # 则从path的文件名称的扩展名判断文件的格式,该方法返回为空。 elif suffix == ".csv": # 对后缀为.csv的文件进行复制 file_from_path = os.path.join(dir_from_children_path, fileName) # print(file_from_path),部分输出如下: # E:\DataSet\GTRSB\GTSRB_Final_Training_Images\GTSRB\Final_Training\Images\00000\GT - 00000.csv # E:\DataSet\GTRSB\GTSRB_Final_Training_Images\GTSRB\Final_Training\Images\00001\GT - 00001.csv # E:\DataSet\GTRSB\GTSRB_Final_Training_Images\GTSRB\Final_Training\Images\00002\GT - 00002.csv file_to_path = os.path.join(dir_to_children_path, fileName) # print(file_to_path ),部分输出如下: # E:\DataSet\GTRSB\GTSRB_Final_Training_Images_png\GTSRB\Final_Training\Images\00000\GT - 00000.csv # E:\DataSet\GTRSB\GTSRB_Final_Training_Images_png\GTSRB\Final_Training\Images\00001\GT - 00001.csv shutil.copy(file_from_path, file_to_path) # shutil.copy(source, destination)函数实现文件复制功能, # 将source文件复制到destination文件夹中,两个参数都是字符串格式。 # 如果destination是一个文件名称,那么它会被用来当作复制后的文件名称,即等于复制+重命名。 else: print("dir_from_path不存在") # 测试集文件格式转换器,将图片由ppm格式转为png格式 def testFormatConverter(dir_from_path,dir_to_path): # 目的文件夹,如果不存在,则创建文件夹;如果存在,删除原来的文件夹,再创建文件夹 if (not os.path.exists(dir_to_path)): os.mkdir(dir_to_path) # 假如path_01 = 'Test\\path_01\\path_02\\path_03',os.mkdir(path_01)创建路径中的最后一级目录, # 即:只创建path_03目录,而如果之前的目录不存在并且也需要创建的话,就会报错。 # os.makedirs(path_01)创建多层目录,即:Test,path_01,path_02,path_03如果都不存在的话,会自动创建。 else: shutil.rmtree(dir_to_path) # 先删除原来的目录 os.mkdir(dir_to_path) # 再创建一个新目录 index = 0 #技术 # 判断源文件夹是否存在 if (os.path.exists(dir_from_path)): # 获取该目录下的所有文件夹目录,例:00000,00001,00002 fileNames = os.listdir(dir_from_path) # print(fileNames),部分输出如下所示: # ['00000.ppm', '00001.ppm', '00002.ppm', '00003.ppm', '00004.ppm', '00005.ppm', '00006.ppm', # '00007.ppm', 00008.ppm', '00009.ppm', '00010.ppm', '00011.ppm', '00012.ppm', '00013.ppm', ... for fileName in fileNames: # 得到该文件下所有目录的路径 if index % 1000 == 0: print("第"+str(index)+"个文件,开始处理该文件,fileName:" + str(fileName)) # 部分输出如下: # 第0个文件,开始处理该文件,fileName: 00000.ppm # 第1000个文件,开始处理该文件,fileName: 01000.ppm # 第2000个文件,开始处理该文件,fileName: 02000.ppm (shotName, suffix) = os.path.splitext(fileName) # print( (shotName, suffix)),部分输出如下: # ('00000', '.ppm') # ('00001', '.ppm') # ('00002', '.ppm') # ('00003', '.ppm') if suffix == ".ppm": # 对后缀为.ppm的文件进行格式转换 file_from_path = os.path.join(dir_from_path, fileName) file_to_path = os.path.join(dir_to_path, (shotName + ".png")) # print(file_to_path),部分输出如下所示: # E:\DataSet\GTRSB\GTSRB_Final_Test_Images_png\GTSRB\Final_Test\Images\00000.png # E:\DataSet\GTRSB\GTSRB_Final_Test_Images_png\GTSRB\Final_Test\Images\00001.png # E:\DataSet\GTRSB\GTSRB_Final_Test_Images_png\GTSRB\Final_Test\Images\00002.png # E:\DataSet\GTRSB\GTSRB_Final_Test_Images_png\GTSRB\Final_Test\Images\00003.png img = Image.open(file_from_path) img.save(file_to_path) elif suffix == ".csv": file_from_path = os.path.join(dir_from_path, fileName) file_to_path = os.path.join(dir_to_path, fileName) shutil.copy(file_from_path, file_to_path) index=index+1 print("文件个数:"+str(len(fileNames))) else: print("dir_from_path不存在") #制作训练集的CSV文件,每行第一列为训练样本的绝对地址,即png文件位置,第二列为对应样本的类别标签 def makeTrainCSV(dir_root_path,dir_to_path): if os.path.exists(dir_to_path): shutil.rmtree(dir_to_path) os.makedirs(dir_to_path) else: os.makedirs(dir_to_path) # 即dir_to_path的最后一级目录如果存在,就删除该级目录,再重新创建;如果不存在就直接创建 # 例如dir_to_path = "E:\\DataSet\\GTRSB\\csv_data",先检查E:\DataSet\GTRSB路径下有没有csv_data文件夹, # 如果存在csv_data文件夹,则先删除该文件夹(包括内部文件),然后再新建一个同名文件夹。 dir_root_children_names = os.listdir(dir_root_path) # 列出该根目录下的所有子目录,即 # os.listdir()方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。 # print(dir_root_children_names ),部分输出如下: # ['00000', '00001', '00002', '00003', '00004', '00005', '00006', '00007', # '00008', '00009', '00010', '00011','00012', '00013', '00014', '00015',... dict_all_class = {} # 每一个类别的dict,{path:label} csv_file_dir = os.path.join(dir_to_path, ('train_data' + ".csv")) with open(csv_file_dir, 'w', newline='') as csvfile: # 在open()内增加一个参数newline = ''可防止在行与行之间产生空行 # 参数newline是用来控制文本模式之下,一行的结束字符。可以是None,'',\n,\r,\r以及\n等。 for dir_root_children_name in dir_root_children_names: # 这个int(dir_root_children_name)就是标签 # print(int(dir_root_children_name)),部分输出如下: # 0 # 1 # 2 dir_root_children_path = os.path.join(dir_root_path, dir_root_children_name) # print(dir_root_children_path),部分输出如下: # E:\DataSet\GTRSB\GTSRB_Final_Training_Images_png\GTSRB\Final_Training\Images\00000 # E:\DataSet\GTRSB\GTSRB_Final_Training_Images_png\GTSRB\Final_Training\Images\00001 # E:\DataSet\GTRSB\GTSRB_Final_Training_Images_png\GTSRB\Final_Training\Images\00002 # E:\DataSet\GTRSB\GTSRB_Final_Training_Images_png\GTSRB\Final_Training\Images\00003 if os.path.isfile(dir_root_children_path): break file_names = os.listdir(dir_root_children_path) # print(file_names),部分输出如下: # ['00000_00000.png', '00000_00001.png', '00000_00002.png', '00000_00003.png', '00000_00004.png', # ['00000_00000.png', '00000_00001.png', '00000_00002.png', '00000_00003.png', '00000_00004.png', # ... for file_name in file_names: (shot_name, suffix) = os.path.splitext(file_name) # print((shot_name, suffix)),部分输出如下所示: # ('00000_00000', '.png') # ('00000_00001', '.png') # ('00000_00002', '.png') # ('00000_00003', '.png') if suffix == '.png': file_path = os.path.join(dir_root_children_path, file_name) # print( file_path),部分展示如下: # E:\DataSet\GTRSB\GTSRB_Final_Training_Images_png\GTSRB\Final_Training\Images\00000\00000_00000.png # E:\DataSet\GTRSB\GTSRB_Final_Training_Images_png\GTSRB\Final_Training\Images\00000\00000_00001.png # E:\DataSet\GTRSB\GTSRB_Final_Training_Images_png\GTSRB\Final_Training\Images\00000\00000_00002.png dict_all_class[file_path] = int(dir_root_children_name) list_train_all_class = list(dict_all_class.keys()) # 每一个子类别由字典转为列表,列表中只有字典的Key,即路径,部分输出如下: # print(list_train_all_class ) # print(len(list_train_all_class )) # ['E:\\DataSet\\GTRSB\\GTSRB_Final_Training_Images_png\\GTSRB\\Final_Training\\Images\\00025\\00041_00014.png', # 'E:\\DataSet\\GTRSB\\GTSRB_Final_Training_Images_png\\GTSRB\\Final_Training\\Images\\00025\\00041_00015.png', # 'E:\\DataSet\\GTRSB\\GTSRB_Final_Training_Images_png\\GTSRB\\Final_Training\\Images\\00025\\00041_00016.png', # 'E:\\DataSet\\GTRSB\\GTSRB_Final_Training_Images_png\\GTSRB\\Final_Training\\Images\\00025\\00041_00017.png', # ...] # 39209 random.shuffle(list_train_all_class) #打乱 for path_train_path in list_train_all_class: label = dict_all_class[path_train_path] example = [] example.append(path_train_path) example.append(label) # print(example),部分输出如下: # ['E:\\DataSet\\GTRSB\\GTSRB_Final_Training_Images_png\\GTSRB\\Final_Training\\Images\\00010\\00048_00024.png',10] # ['E:\\DataSet\\GTRSB\\GTSRB_Final_Training_Images_png\\GTSRB\\Final_Training\\Images\\00004\\00048_00009.png',4] # ['E:\\DataSet\\GTRSB\\GTSRB_Final_Training_Images_png\\GTSRB\\Final_Training\\Images\\00008\\00008_00026.png',8] writer = csv.writer(csvfile) writer.writerow(example) # writer.writerow函数接受列表类型的参数 print("训练集对应的csv文件生成完毕") print("list_train_all_class len:"+ str(len(list_train_all_class))) #制作测试集的CSV文件,每行第一列为训练样本的绝对地址,即png文件位置,第二列为对应样本的类别标签 def makeTestCSV(dir_root_path,dir_to_path): # 目的文件件,如果存在就删除,再创建;如果不存在就直接创建 # 同上 if os.path.exists(dir_to_path): shutil.rmtree(dir_to_path) os.makedirs(dir_to_path) else: os.makedirs(dir_to_path) file_names = os.listdir(dir_root_path) # 列出该根目录下的所有子目录 # os.listdir()方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。 # print(file_names),部分输出如下: # ['00000.png', '00001.png', '00002.png', '00003.png', '00004.png', '00005.png', '00006.png', # '00007.png', '00008.png', '00009.png', '00010.png', '00011.png', '00012.png', '00013.png', # ... for file_name in file_names: (shot_name, suffix) = os.path.splitext(file_name) # print( (shot_name, suffix)),部分输出如下: # ('00000', '.png') # ('00001', '.png') # ('00002', '.png') # ... if suffix=='.csv': # 找到dir_root_path路径下的后缀为.CSV的文件, # 该文件有文件名和标签的对应关系 csv_file_path = os.path.join(dir_root_path,file_name) # csv_file_path 是该csv文件的绝对地址 # print(csv_file_path),输出如下: # E:\DataSet\GTRSB\GTSRB_Final_Test_Images_png\GTSRB\Final_Test\Images\GT-final_test.csv test_csv_data = pd.read_csv(csv_file_path) # 运用pandas来处理csv文件,获得DataFrama数据结构 test_csv_data_arr = np.array(test_csv_data) # 将DataFrama形式的数据转化为数组 # print(test_csv_data_arr.shape),输出如下: # (12630, 1) # print( test_csv_data_arr[[0,1,2,3]]),输出数组test_csv_data_arr的前四行,如下: # [['00000.ppm;53;54;6;5;48;49;16'] # ['00001.ppm;42;45;5;5;36;40;1'] # ['00002.ppm;48;52;6;6;43;47;38'] # ['00003.ppm;27;29;5;5;22;24;33']] # print(type(np.array(test_csv_data)[0])),输出如下: # < class 'numpy.ndarray'> # print(type(np.array(test_csv_data)[0][0])),输出如下: # < class 'str'> # print(np.array(test_csv_data)[0][0]),输出如下: # 00000.ppm;53;54;6;5;48;49;16 # print(np.array(test_csv_data)[0].shape),输出如下: # (1,) dict = {} # 新建一个字典,key里面存放.ppm后缀的文件名,value里面存放类别标签 for index in range(test_csv_data_arr.shape[0]): row_data = np.array(test_csv_data)[index][0] # print(row_data ),部分输出如下: # 00000.ppm;53;54;6;5;48;49;16 # 00001.ppm;42;45;5;5;36;40;1 # 00002.ppm;48;52;6;6;43;47;38 # 00003.ppm;27;29;5;5;22;24;33 row_data_list = row_data.split(";") # print(row_data_list),部分输出如下: # ['00000.ppm', '53', '54', '6', '5', '48', '49', '16'] # ['00001.ppm', '42', '45', '5', '5', '36', '40', '1'] # ['00002.ppm', '48', '52', '6', '6', '43', '47', '38'] # ['00003.ppm', '27', '29', '5', '5', '22', '24', '33'] sample_file_name = row_data_list[0] sample_label = row_data_list[-1] # print(sample_file_name,sample_label),部分输出如下: # 00000.ppm 16 # 00001.ppm 1 # 00002.ppm 38 new_sample_file_name = sample_file_name.split(".")[0]+".png" # print(new_sample_file_name),部分输出如下: # 00000.png # 00001.png # 00002.png # 00003.png dict[new_sample_file_name] = sample_label # print(dict),部分输出如下: # {'00000.png': '16', '00001.png': '1', '00002.png': '38', # '00003.png': '33', '00004.png': '11','00005.png': '38', # '00006.png': '18', ...} dict_all_class = {} # 每一个类别的dict,{path:label} csv_file_dir = os.path.join(dir_to_path, ('test_data' + ".csv")) with open(csv_file_dir, 'w', newline='') as csvfile: for file_name in file_names: (shot_name, suffix) = os.path.splitext(file_name) if suffix == '.png': file_path = os.path.join(dir_root_path, file_name) # print(file_path),部分输出如下: # E:\DataSet\GTRSB\GTSRB_Final_Test_Images_png\GTSRB\Final_Test\Images\00000.png # E:\DataSet\GTRSB\GTSRB_Final_Test_Images_png\GTSRB\Final_Test\Images\00001.png # E:\DataSet\GTRSB\GTSRB_Final_Test_Images_png\GTSRB\Final_Test\Images\00002.png file_name = file_path.split('\\')[-1] # print(file_name),部分输出如下: # 00000.png # 00001.png # 00002.png dict_all_class[file_path] = dict[file_name] # print(dict_all_class),部分输出如下: # {'E:\\DataSet\\GTRSB\\GTSRB_Final_Test_Images_png\\GTSRB\\Final_Test\\Images\\00000.png': '16', # 'E:\\DataSet\\GTRSB\\GTSRB_Final_Test_Images_png\\GTSRB\\Final_Test\\Images\\00001.png': '1', # 'E:\\DataSet\\GTRSB\\GTSRB_Final_Test_Images_png\\GTSRB\\Final_Test\\Images\\00002.png': '38', # ...} list_test_all_class = list(dict_all_class.keys()) # 每一个子类别由字典转为列表,列表中只有字典的Key,即路径 # print(len(list_test_all_class)) # 12630 # print(list_test_all_class[0]) # E:\DataSet\GTRSB\GTSRB_Final_Test_Images_png\GTSRB\Final_Test\Images\00000.png random.shuffle(list_test_all_class) # 打乱顺序 # print(list_test_all_class[0]) # E:\DataSet\GTRSB\GTSRB_Final_Test_Images_png\GTSRB\Final_Test\Images\00092.png for path_test_path in list_test_all_class: label = dict_all_class[path_test_path] example = [] example.append(path_test_path) example.append(label) # print(example),部分输出如下: # ['E:\\DataSet\\GTRSB\\GTSRB_Final_Test_Images_png\\GTSRB\\Final_Test\\Images\\09107.png', '15'] # ['E:\\DataSet\\GTRSB\\GTSRB_Final_Test_Images_png\\GTSRB\\Final_Test\\Images\\12608.png', '18'] # ['E:\\DataSet\\GTRSB\\GTSRB_Final_Test_Images_png\\GTSRB\\Final_Test\\Images\\02899.png', '12'] # ... writer = csv.writer( csvfile) writer.writerow(example) print("测试集对应的csv文件生成完毕") print("list_test_all_class len:" + str(len(list_test_all_class))) if __name__ == "__main__": # train_dir_from_path = "E:\\DataSet\\GTRSB\\GTSRB_Final_Training_Images\\GTSRB\\Final_Training\\Images" # train_dir_to_path = "E:\\DataSet\\GTRSB\\GTSRB_Final_Training_Images_png\\GTSRB\\Final_Training\\Images" # trainFormatConverter(train_dir_from_path,train_dir_to_path) # test_dir_from_path = "E:\\DataSet\\GTRSB\\GTSRB_Final_Test_Images\\GTSRB\\Final_Test\\Images" # test_dir_to_path = "E:\\DataSet\\GTRSB\\GTSRB_Final_Test_Images_png\\GTSRB\\Final_Test\\Images" # testFormatConverter(test_dir_from_path, test_dir_to_path) # 制作训练集的CSV文件 train_dir_root_path = "E:\\DataSet\\GTRSB\\GTSRB_Final_Training_Images_png\\GTSRB\\Final_Training\\Images" train_dir_to_path = "E:\\DataSet\\GTRSB\\csv_train_data" makeTrainCSV(train_dir_root_path,train_dir_to_path ) # 制作测试集的CSV文件 test_dir_root_path = "E:\\DataSet\\GTRSB\\GTSRB_Final_Test_Images_png\\GTSRB\\Final_Test\\Images" test_dir_to_path = "E:\\DataSet\\GTRSB\\csv_test_data" makeTestCSV(test_dir_root_path,test_dir_to_path )
运行程序,等待完成:
接下来我们去找到我们生成的CSV文件:
打开它们,首先看看训练集对应的CSV文件:
再看看测试集对应的CSV文件:
點擊查看更多內(nèi)容
為 TA 點贊
評論
評論
共同學(xué)習(xí),寫下你的評論
評論加載中...
作者其他優(yōu)質(zhì)文章
正在加載中
感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦