笨蛋如我,學深度學習這么久,居然才學會划分數據集啊,我快被我自己蠢哭了,我的這個圖像集是從一個大佬那下載的,一共5類的圖像,大佬的博客在這https://blog.csdn.net/guyuealian/article/details/81560537 可以說是相當厲害了,但是我沒按照他的那種方式划分,我在網上找了幾個帖子做了參考,然后結合我自己的情況划分的。
import os import random import shutil from shutil import copy2 """os.listdir會將文件夾下的文件名集合成一個列表並返回""" def getDir(filepath): pathlist=os.listdir(filepath) return pathlist """制作五類圖像總的訓練集,驗證集和測試集所需要的文件夾,例如訓練集的文件夾中裝有五個文件夾,這些文件夾分別裝有一定比例的五類圖像""" def mkTotalDir(data_path): os.makedirs(data_path) dic=['train','validation','test'] for i in range(0,3): current_path=data_path+dic[i]+'/' #這個函數用來判斷當前路徑是否存在,如果存在則創建失敗,如果不存在則可以成功創建 isExists=os.path.exists(current_path) if not isExists: os.makedirs(current_path) print('successful '+dic[i]) else: print('is existed') return """傳入的參數是五類圖像原本的路徑,返回的是這個路徑下各類圖像的名稱列表和圖像的類別數""" def getClassesMes(source_path): classes_name_list=getDir(source_path) classes_num=len(classes_name_list) return classes_name_list,classes_num """change_path其實就是制作好的五類圖像總的訓練集,驗證集和測試集的路徑,sourcepath和上面一個函數相同 這個函數是用來建訓練集,測試集,驗證集下五類圖像的文件夾,就是建15個文件夾,當然也可以建很多類 """ def mkClassDir(source_path,change_path): classes_name_list,classes_num=getClassesMes(source_path) for i in range(0,classes_num): current_class_path=os.path.join(change_path,classes_name_list[i]) isExists=os.path.exists(current_class_path) if not isExists: os.makedirs(current_class_path) print('successful '+classes_name_list[i]) else: print('is existed') """ source_path:原始多類圖像的存放路徑 train_path:訓練集圖像的存放路徑 validation_path:驗證集圖像的存放路徑 test_path:測試集圖像的存放路徑 """ def divideTrainValidationTest(source_path,train_path,validation_path,test_path): """先獲取五類圖像的名稱列表和類別數目""" classes_name_list,classes_num=getClassesMes(source_path) """調用上面的函數,在訓練集驗證集和測試集文件夾下建立五類圖像的文件夾""" mkClassDir(source_path,train_path) mkClassDir(source_path,validation_path) mkClassDir(source_path,test_path) """ 先將一類圖像的路徑拿出來,將這個路徑下所有這類的圖片,就是800張圖片的文件名做成一個列表,使用os.listdir函數, 然后再將列表里面的所有圖像名進行shuffle就是隨機打亂,然后從打亂后的圖像中抽7成放入訓練集,2成放入驗證集,1成 放入測試集的圖像名稱列表 """ for i in range(0,classes_num): source_image_dir=os.listdir(source_path+classes_name_list[i]+'/') random.shuffle(source_image_dir) train_image_list=source_image_dir[0:int(0.7*len(source_image_dir))] validation_image_list=source_image_dir[int(0.7*len(source_image_dir)):int(0.9*len(source_image_dir))] test_image_list=source_image_dir[int(0.9*len(source_image_dir)):] """ 找到每一個集合列表中每一張圖像的原始圖像位置,然后將這張圖像復制到目標的路徑下,一共是五類圖像 每類圖像隨機被分成三個去向,使用shutil庫中的copy2函數進行復制,當然也可以使用move函數,但是move 相當於移動圖像,當操作結束后,原始文件夾中的圖像會都跑到目標文件夾中,如果划分不正確你想重新划分 就需要備份,不然的話很麻煩 """ for train_image in train_image_list: origins_train_image_path=source_path+classes_name_list[i]+'/'+train_image new_train_image_path=train_path+classes_name_list[i]+'/' copy2(origins_train_image_path,new_train_image_path) for validation_image in validation_image_list: origins_validation_image_path=source_path+classes_name_list[i]+'/'+validation_image new_validation_image_path=validation_path+classes_name_list[i]+'/' copy2(origins_validation_image_path,new_validation_image_path) for test_image in test_image_list: origins_test_image_path=source_path+classes_name_list[i]+'/'+test_image new_test_image_path=test_path+classes_name_list[i]+'/' copy2(origins_test_image_path,new_test_image_path) if __name__=='__main__': data_path = 'D:/軟件/pycharmProject/wenyuPy/Dataset/VGG16/' source_path = 'C:/Users/Administrator/Desktop/dataset/ImageData/' train_path = 'D:/軟件/pycharmProject/wenyuPy/Dataset/VGG16/train/' validation_path = 'D:/軟件/pycharmProject/wenyuPy/Dataset/VGG16/validation/' test_path = 'D:/軟件/pycharmProject/wenyuPy/Dataset/VGG16/test/' mkTotalDir(data_path) divideTrainValidationTest(source_path, train_path, validation_path, test_path)
然后看一下划分結果,先看原始情況:
這就是source_path和下面的五類圖像,每一類圖像有800張,然后下面是划分后
這里面的這個路徑就是train_path,就是裝五類圖像訓練的那一部分的路徑,下面是其中一類划分過后的訓練集部分
可以看到有560張圖片啦
這就是我學習如何划分數據集的一天啦,將他們划分到不同的文件夾下是因為制作tfrecords的時候可能會更方便,我不太懂哈,如果有更好的划分方法希望大佬們賜教。
抱歉,由於我的問題,最后那個560張訓練集的圖片好像不小心被我刪掉了,我換了電腦,圖找不到了,但是程序本身是沒有問題的哈,就醬