【python】從原始數據集中抽取作爲測試集,統計文件夾下的文件個數

背景:由於處理小樣本學習過程中特別容易出現過擬合現象,有因爲是小樣本,所以一般處理方法會增強,增強後的數據包含大量的相似圖像,這時al驗證集可能就無法起到作用,因此需要提前從原始數據中提取一部分樣本作爲測試集。

這裏要區分以下訓練集、驗證集以及測試集的概念:

  1. 訓練集是用來訓練模型使用的數據,
  2. 驗證集是在訓練過程中用來迭代驗證模型的準確率,這部分數據並不參與訓練,但是可以通過這一部分數據來檢驗模型每次迭代準確率的變化。
  3. 測試集是在模型訓練完成後,我們進行最終測試的數據。和驗證集不同的是:驗證集和訓練集都是在數據增強後分離的,自然可能出現 一張圖像經過平移旋轉增強到了6張,前五張作爲訓練集,最後一張作爲了驗證集,由於這6張圖像都是從一張得到的,存在高度相似的情況,所以驗證集此時就發揮不出分析模型好壞的作用,充當了“臥底”的角色

先說一下如何統計文件夾內的數量:

     for file in fileNames:
        #獲取臨時的路徑
        temp_path=os.path.join(pathc, file)
        #os.listdir能夠獲得該路徑下的列表,我們在和len()方法相結合就能夠快速的得到文件夾下的數量,
        file_count=len(os.listdir(temp_path))

下面在說一下整體代碼主要功能:在原始數據集文件夾中,根據每個子文件夾包括的數量大小,從中抽取10%作爲測試集。

主函數:

if __name__ == "__main__":
    #提取到測試文件夾目錄下
    patha="/home/scsc/dataset/2000_test"
    # 合併圖像總的文件夾
    pathc = "/home/scsc/dataset/rename_2000images"
    #遍歷當前文件夾
    fileNames = os.listdir(pathc)
    #遍歷子文件夾,獲取每個文件夾內的圖像數量,根據圖像數量提取測試圖像數
    for file in fileNames:
        #獲取臨時的路徑
        temp_path=os.path.join(pathc, file)
        #os.listdir能夠獲得該路徑下的列表,我們在和len()方法相結合就能夠快速的得到文件夾下的數量,
        file_count=len(os.listdir(temp_path))
        train_size = int(file_count * 0.9)
        #獲取訓練集的大小
        test_size = file_count-train_size
        #將子目錄、目標目錄、拷貝的數量作爲參數傳遞到拷貝方法中
        CopyFile(os.path.join(pathc,file), patha + "/" + file,test_size)

拷貝方法:根據size進行判斷,將選中的文件拷貝到指定的測試集目錄下,操作完成後,移除當前圖像,如果size爲0則完成當前文件夾抽取工作

def CopyFile(filepath, newPath,size):
    # 獲取當前路徑下的文件名,返回List
    fileNames = os.listdir(filepath) 
    for file in fileNames:
        # 將文件命加入到當前文件路徑後面
        newDir = filepath + '/' + file
        if size==0:
            return
        # 如果是文件
        if os.path.isfile(newDir):  
            print(newDir)
            print(newPath)
            #驗證文件夾是否存在,若不存在則創建一個新的文件夾
            isExists = os.path.exists(newPath)
            # 判斷結果
            if not isExists:
                # 如果不存在則創建目錄
                os.makedirs(newPath)
            #驗證圖片是否正常,若不正常則跳過,不進行復制錯誤圖像,並且打印出錯誤圖像的名
            img = cv2.imread(newDir)
            newFile = newPath +'/'+ file
            shutil.copyfile(newDir, newFile)
            os.remove(newDir)
        #如果不是文件,遞歸這個文件夾的路徑
        else:
            CopyFile(newDir,newPath)
        size = size - 1

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章