1. 程式人生 > >TensorFlow實戰(五)——交通標誌牌(GTSRB資料集)的格式轉換(二)

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)  # 打亂順序
        # pri