TensorFlow實戰(五)——交通標誌牌(GTSRB資料集)的格式轉換(二)
阿新 • • 發佈:2019-01-03
前言:
在上一篇部落格學習瞭如何將資料集轉換成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