在深度學習的訓練時,經常會碰到訓練的樣本數據集和標簽數據集是在一個文件夾中,這個時候我們就不得不進行一些數據的預處理和文件的分類,例如將訓練(training data)數據集和標簽數據集(label data)分別放到不同的文件夾或者將訓練數據集按照分類放到類別文件中,這樣子的操作是為了我們能方便的讀取和處理相關的圖片數據。這篇博文主要是講我在做項目過程碰到的其中一中情況,就是訓練樣本數據和標簽數據在一個主文件夾下的不同文件夾內,這里有兩種處理方式供參考。
1. 將文件分別放到不同的文件
利用Python的shutil.copy()函數對數據進行分類放到不同的文件夾。
import os import cv2 import shutil import numpy as np # 定義獲取文件名的方法 def getFileNames(rootDir): fileNames = [] # 利用os.walk()函數獲取根目錄下文件夾名稱,子文件夾名稱及文件名稱 for dirName, subDirList, fileList in os.walk(rootDir): for fname in fileList: # 用os.path.split()函數來判斷並獲取文件的后綴名 if os.path.splitext(fname)[1] == '.png': fileNames.append(dirName+'/'+fname) return fileNames # 讀取文件並且移動文件到相應的文件夾 def readImgAndMove(imgPath): # 定義分類的文件夾名,判斷是否存在,如若沒有則創建相應的文件夾 data_destination = './train/' label_destination = './label/' if not (os.path.exists(data_destination) and os.path.exists(label_destination)): os.makedirs(data_destination) os.makedirs(label_destination) # 根據文件名的特征進行分類並復制相應的文件到新文件夾 for item in imgPath: if os.path.splitext(item)[1] == '.png' and 'XXX_123' in os.path.splitext(item)[0]: shutil.copy(item, label_destination) elif os.path.splitext(item)[1] == '.png' and 'YYY_123' in os.path.splitext(item)[0]: shutil.copy(item, data_destination)
2. 將訓練數據和標簽數據同時讀取出來保存成矩陣形式
第二種方法就如小標題所說,將圖片保存成矩陣形式,深度學習一個很根本的原因就是通過矩陣運算來得到預測結果的,所以我們也可以將圖片利用OpenCV根據文件名稱和格式進行讀取,並保存成數組或者矩陣形式,方便后續的操作。
import os import cv2 import numpy as np # 獲取訓練數據和標簽數據的文件名 def getFileNames(rootDir): dataListNames = [] labelListNames = [] for dirName, subDirList, fileList in os.walk(rootDir): for fname in fileList: if os.path.splitext(fname)[1] == '.png' and 'XXX_123' in os.path.splitext(fname)[0]: labelListNames.append(dirName+'/'+fname) elif os.path.splitext(fname)[1] == '.png' and 'YYY_123' in os.path.splitext(fname)[0]: dataListNames.append(dirName+'/'+fname) return dataListNames, labelListNames # 根據文件路徑和文件名讀取相應數據 def readImg(imgPath): imgs = [] for item in imgPath: img = cv2.imread(item) imgs.append(img) return np.array(imgs)
如對上述代碼有疑問,請查詢相關的的Python模塊進行理解。讀取文件數據還是相對比較簡單,希望對有需要的小伙伴有所幫助,本人也一路在邊學邊探索,歡迎一起討論。
注:有可能圖片的大小不一,這個時候如果你采用的是第二種方法,那么你還得將數據先進行padding或者resize到同一個大小,再將數據合並進行打亂之類的操作。