TensorFlow实战(五)——交通标志牌(GTSRB数据集)的格式转换(二)

 前言:

      在上一篇博客学习了如何将数据集转换成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 )

运行程序,我们找到生成的文件,看看结果:




  • 2
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值