前言:
在上一篇博客学习了如何将数据集转换成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文件:
三、ROI区域的处理
如果我们有这样的需求,我们读取每张图像,把每张图像的ROI区域提取出来,再转换为png的格式,然后再制作数据集的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格式转为只有ROI区域的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_roi_png\GTSRB\Final_Training\Images\00000
# E:\DataSet\GTRSB\GTSRB_Final_Training_Images_roi_png\GTSRB\Final_Training\Images\00001
# E:\DataSet\GTRSB\GTSRB_Final_Training_Images_roi_png\GTSRB\Final_Training\Images\00002
# E:\DataSet\GTRSB\GTSRB_Final_Training_Images_roi_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。
for f in os.listdir(dir_from_children_path):
if f.endswith(".csv"):
csv_dir = os.path.join(dir_from_children_path, f)
# 获取注解文件的绝对地址
# print(csv_dir),部分展示如下:
# 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
csv_data = pd.read_csv(csv_dir)
# csv_data是一个DataFrama形式的数据结构
csv_data_array = np.array(csv_data)
# print(csv_data_array),部分展示如下:
# [['00000_00000.ppm;29;30;5;6;24;25;0']
# ['00000_00001.ppm;30;30;5;5;25;25;0']
# ['00000_00002.ppm;30;30;5;5;25;25;0']
# ...
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 index in range(len(fileNames)):
(shotName,suffix) = os.path.splitext(fileNames[index])
# 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, fileNames[index])
# 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_roi_png\GTSRB\Final_Training\Images\00000\00000_00000.png
# E:\DataSet\GTRSB\GTSRB_Final_Training_Images_roi_png\GTSRB\Final_Training\Images\00000\00000_00001.png
# E:\DataSet\GTRSB\GTSRB_Final_Training_Images_roi_png\GTSRB\Final_Training\Images\00000\00000_00002.png
# E:\DataSet\GTRSB\GTSRB_Final_Training_Images_roi_png\GTSRB\Final_Training\Images\00000\00000_00003.png
img = Image.open(file_from_path)
# 对于彩色图像,不管其图像格式是PNG,还是BMP,或者JPG,在PIL中,
# 使用Image模块的open()函数打开后,PIL会将它们解码为三通道的“RGB”图像。
# 用户可以基于这个“RGB”图像,对其进行处理。
csv_data_list = np.array(csv_data)[index, :].tolist()[0].split(";")
# print(csv_data_list),部分展示如下:
# ['00000_00000.ppm', '29', '30', '5', '6', '24', '25', '0']
# ['00000_00001.ppm', '30', '30', '5', '5', '25', '25', '0']
# ['00000_00002.ppm', '30', '30', '5', '5', '25', '25', '0']
# ['00000_00003.ppm', '31', '31', '5', '5', '26', '26', '0']
box = (int(csv_data_list[3]), int(csv_data_list[4]), int(csv_data_list[5]), int(csv_data_list[6]))
roi_img = img.crop(box)
# 获取兴趣ROI区域
roi_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, fileNames[index])
# 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, fileNames[index])
# print(file_to_path ),部分输出如下:
# E:\DataSet\GTRSB\GTSRB_Final_Training_Images_roi_png\GTSRB\Final_Training\Images\00000\GT - 00000.csv
# E:\DataSet\GTRSB\GTSRB_Final_Training_Images_roi_png\GTSRB\Final_Training\Images\00001\GT - 00001.csv
# E:\DataSet\GTRSB\GTSRB_Final_Training_Images_roi_png\GTSRB\Final_Training\Images\00002\GT - 00002.csv
# E:\DataSet\GTRSB\GTSRB_Final_Training_Images_roi_png\GTSRB\Final_Training\Images\00003\GT - 00003.csv
shutil.copy(file_from_path, file_to_path)
# shutil.copy(source, destination)函数实现文件复制功能,
# 将source文件复制到destination文件夹中,两个参数都是字符串格式。
# 如果destination是一个文件名称,那么它会被用来当作复制后的文件名称,即等于复制+重命名。
else:
print("dir_from_path不存在")
# 测试集文件格式转换器,将图片由ppm格式转为只有ROI区域的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) # 再创建一个新目录
# 判断源文件夹是否存在
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 fileName.endswith(".csv"):
csv_dir = os.path.join(dir_from_path, fileName)
print(csv_dir)
# 获取注解文件的绝对地址
# print(csv_dir),输出如下:
# E:\DataSet\GTRSB\GTSRB_Final_Test_Images\GTSRB\Final_Test\Images\GT-final_test.csv
csv_data = pd.read_csv(csv_dir)
# csv_data是一个DataFrama形式的数据结构
csv_data_array = np.array(csv_data)
# print(csv_data_array),输出如下:
# [['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']
# ...
for index in range(len(fileNames)): # 得到该文件下所有目录的路径
if index % 1000 == 0:
print("第"+str(index)+"个文件,开始处理该文件,fileName:" + str(fileNames[index]))
# 部分输出如下:
# 第0个文件,开始处理该文件,fileName: 00000.ppm
# 第1000个文件,开始处理该文件,fileName: 01000.ppm
# 第2000个文件,开始处理该文件,fileName: 02000.ppm
(shotName, suffix) = os.path.splitext(fileNames[index])
# print( (shotName, suffix)),部分输出如下:
# ('00000', '.ppm')
# ('00001', '.ppm')
# ('00002', '.ppm')
# ('00003', '.ppm')
if suffix == ".ppm":
# 对后缀为.ppm的文件进行格式转换
file_from_path = os.path.join(dir_from_path, fileNames[index])
# print(file_from_path ),部分输出如下:
# E:\DataSet\GTRSB\GTSRB_Final_Test_Images\GTSRB\Final_Test\Images\00000.ppm
# E:\DataSet\GTRSB\GTSRB_Final_Test_Images\GTSRB\Final_Test\Images\00001.ppm
# E:\DataSet\GTRSB\GTSRB_Final_Test_Images\GTSRB\Final_Test\Images\00002.ppm
# ...
file_to_path = os.path.join(dir_to_path, (shotName + ".png"))
# print(file_to_path),部分输出如下所示:
# E:\DataSet\GTRSB\GTSRB_Final_Test_Images_roi_png\GTSRB\Final_Test\Images\00000.png
# E:\DataSet\GTRSB\GTSRB_Final_Test_Images_roi_png\GTSRB\Final_Test\Images\00001.png
# E:\DataSet\GTRSB\GTSRB_Final_Test_Images_roi_png\GTSRB\Final_Test\Images\00002.png
# E:\DataSet\GTRSB\GTSRB_Final_Test_Images_roi_png\GTSRB\Final_Test\Images\00003.png
img = Image.open(file_from_path)
csv_data_list = np.array(csv_data)[index, :].tolist()[0].split(";")
print(csv_data_list)
# print(csv_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']
box = (int(csv_data_list[3]), int(csv_data_list[4]), int(csv_data_list[5]), int(csv_data_list[6]))
roi_img = img.crop(box)
# 获取兴趣ROI区域
roi_img.save(file_to_path)
elif suffix == ".csv":
# 复制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)
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_roi_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_roi_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_roi_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_roi_png\\GTSRB\\Final_Test\\Images"
test_dir_to_path = "E:\\DataSet\\GTRSB\\csv_test_data"
makeTestCSV(test_dir_root_path,test_dir_to_path )
运行程序,我们找到生成的文件,看看结果:
