Python實現(xiàn)隨機劃分圖片數(shù)據(jù)集的示例代碼
一、前言
前幾天需要劃分?jǐn)?shù)據(jù)集,就寫了一個小demo去完成這個任務(wù)。
隨機劃分圖片數(shù)據(jù)集
任務(wù)描述:我的所有圖片保存在同一個文件夾里,需要隨機將圖片與標(biāo)注文件劃分為訓(xùn)練集和測試集。
處理過程:讀取文件列表,將列表打亂,截取列表一部分
二、實現(xiàn)代碼如下
import os import random import shutil def get_imlist(path): return [os.path.join(path, f) for f in os.listdir(path) if f.endswith('.jpg')] def getData(src_path): dest_dir = src_path+'val' #劃分出來的驗證集 if not os.path.isdir(dest_dir): os.mkdir(dest_dir) img_list = get_imlist(src_path) random.shuffle(img_list) le = int(len(img_list) * 0.8) # 這個可以修改劃分比例 for f in img_list[le:]: shutil.move(f, dest_dir) ''' 函數(shù)功能: 劃分?jǐn)?shù)據(jù)集 ''' def SplitImg(filePath): getData(filePath) ''' 函數(shù)功能: 根據(jù)劃分的數(shù)據(jù)集進行移動標(biāo)注文件 ''' def MoveAn(filePathAn,filePathImg): Imgs=os.listdir(filePathImg) if not os.path.isdir(filePathAn+'val'): os.mkdir(filePathAn+'val') for file in os.listdir(filePathAn): #print(filePathAn,filePathImg) #print(os.path.join(filePathAn,file),os.path.join(filePathAn+'val',file)) if file[:-4]+'.jpg' in Imgs: shutil.move(os.path.join(filePathAn,file),os.path.join(filePathAn+'val',file)) if __name__=='__main__': filePath='./寵物/寵物'# 換成你的數(shù)據(jù)集 #拆分的數(shù)據(jù)集 SplitImg(filePath) filePathAn='./寵物/寵物An'# 換成你的標(biāo)注文件地址 # 根據(jù)數(shù)據(jù)集進行移動標(biāo)注文件 MoveAn(filePathAn,filePath+'val')
三、方法補充
除了以上的方法,小編還為大家整理了其他劃分?jǐn)?shù)據(jù)集的方法,希望對大家有所幫助
方法一:使用random.sample將數(shù)據(jù)集隨機劃分為訓(xùn)練集與驗證集并另存在文件夾中,設(shè)置隨機種子
import os import random import shutil def moveFile(input1,input2,save1,save2): pathDir = os.listdir(input1) # 取圖片的原始路徑 random.seed(1) filenumber = len(pathDir) # 原文件個數(shù) rate = 0.1 # 抽取的驗證集的比例,占總數(shù)據(jù)的多少 picknumber = int(filenumber * rate) # 按照rate比例從文件夾中取一定數(shù)量圖片 sample = random.sample(pathDir, picknumber) # 隨機選取需要數(shù)量的樣本圖片 print(sample) list_len=len(sample) print(list_len) list=[] for i in range(len(sample)): list.append(sample[i].split('.')[0]) print(list) for flie_name in list: path_img=os.path.join(input1,flie_name+'.jpg') shutil.move(path_img,save1) path_lab=os.path.join(input2,flie_name+'.txt') shutil.move(path_lab,save2) if __name__ == '__main__': input_path1='./train1200/images/train' input_path2= './train1200/labels/train' save_img='./train1200/images/val' save_lab='./train1200/labels/val' if not os.path.exists(save_lab): os.makedirs(save_lab) if not os.path.exists(save_img): os.makedirs(save_img) moveFile(input_path1,input_path2,save_img,save_lab)
方法二:通過train test_splt函數(shù)實現(xiàn)隨機劃分?jǐn)?shù)據(jù)
Python中,隨機劃分?jǐn)?shù)據(jù)集可以通過train test_splt函數(shù)實現(xiàn)。該函數(shù)可以將數(shù)據(jù)集隨機分成訓(xùn)練集和測試集,用于機器學(xué)習(xí)中的數(shù)據(jù)訓(xùn)練和測試。
函數(shù)的基本用法如下:
from sklearn.model_selection import train_test_split #X是所有的樣本特征,y是目標(biāo)變量,test_size是測試集占總樣本數(shù)的比例 # random_state是隨機數(shù)發(fā)生器的種子,保證每次劃分結(jié)果一致 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0,3, random_state=42)
其中,X是所有的樣本特征,是目標(biāo)變量,test_size是測試集占總樣本數(shù)的比例。random_state用于設(shè)置隨機數(shù)發(fā)生器的種子,以保i每次劃分結(jié)果一致。函數(shù)會返回4個數(shù)組: X_train、X_test、y_train,y_test,分別代表訓(xùn)練集的特征、測試集的特征、訓(xùn)練集的目標(biāo)變量和測試集的目標(biāo)變量
方法三:將一個數(shù)據(jù)集按比例隨機分割成訓(xùn)練集、驗證集、測試集
import random def split(fname, train_ratio, var_ratio): lines = fname.readlines() n_total = len(lines) # 獲取數(shù)據(jù)集的總長度 train_offset = int(n_total * train_ratio) val_offset = int(n_total * (train_ratio + var_ratio)) random.shuffle(fname.read()) # 按行打亂順序 train_data = open('train.txt.bio', 'wb') val_data = open('val.txt.bio', 'wb') test_data = open('test.txt.bio', 'wb') for i, line in enumerate(lines): if i < train_offset: train_data.write(line) elif i < val_offset: val_data.write(line) else: test_data.write(line) train_data.close() val_data.close() test_data.close() if __name__ == "__main__": fname = open('en/en_total.txt.bio', "rb") split(fname, train_ratio = 0.6, var_ratio = 0.2) fname.close()
到此這篇關(guān)于Python實現(xiàn)隨機劃分圖片數(shù)據(jù)集的示例代碼的文章就介紹到這了,更多相關(guān)Python隨機劃分?jǐn)?shù)據(jù)集內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python自定義函數(shù)實現(xiàn)一個數(shù)的三次方計算方法
今天小編就為大家分享一篇python自定義函數(shù)實現(xiàn)一個數(shù)的三次方計算方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01python 多進程和協(xié)程配合使用寫入數(shù)據(jù)
這篇文章主要介紹了python 多進程和協(xié)程配合使用寫入數(shù)據(jù),幫助大家利用python高效辦公,感興趣的朋友可以了解下2020-10-10Python實現(xiàn)http服務(wù)器(http.server模塊傳參?接收參數(shù))實例
這篇文章主要為大家介紹了Python實現(xiàn)http服務(wù)器(http.server模塊傳參?接收參數(shù))實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11Ubuntu 14.04+Django 1.7.1+Nginx+uwsgi部署教程
django+uwsgi的部署實在是太蛋疼了.網(wǎng)上已有的教程似乎有新版本的兼容問題。最后跑到uwsgi官網(wǎng)上找的教程終于跑通了.. 不過官網(wǎng)的教程似乎有引導(dǎo)教學(xué)性質(zhì),部署的時候就顯得很繞彎路,在這里記錄下來精簡內(nèi)容2014-11-11使用Keras預(yù)訓(xùn)練好的模型進行目標(biāo)類別預(yù)測詳解
這篇文章主要介紹了使用Keras預(yù)訓(xùn)練好的模型進行目標(biāo)類別預(yù)測詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06Python入門(六)Python數(shù)據(jù)類型
這篇文章主要介紹了Python入門(六)Python數(shù)據(jù)類型,Python是一門非常強大好用的語言,也有著易上手的特性,本文為入門教程,需要的朋友可以參考下2023-04-04