python將圖像划分成訓練集,驗證集和測試集


笨蛋如我,學深度學習這么久,居然才學會划分數據集啊,我快被我自己蠢哭了,我的這個圖像集是從一個大佬那下載的,一共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張訓練集的圖片好像不小心被我刪掉了,我換了電腦,圖找不到了,但是程序本身是沒有問題的哈,就醬


免責聲明!

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



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