Python讀取不同文件夾下的圖片並且分類放到新創建的訓練文件夾和標簽文件夾


在深度學習的訓練時,經常會碰到訓練的樣本數據集和標簽數據集是在一個文件夾中,這個時候我們就不得不進行一些數據的預處理和文件的分類,例如將訓練(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到同一個大小,再將數據合並進行打亂之類的操作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM