Python實(shí)現(xiàn)隨機(jī)劃分圖片數(shù)據(jù)集的示例代碼
一、前言
前幾天需要?jiǎng)澐謹(jǐn)?shù)據(jù)集,就寫(xiě)了一個(gè)小demo去完成這個(gè)任務(wù)。
隨機(jī)劃分圖片數(shù)據(jù)集
任務(wù)描述:我的所有圖片保存在同一個(gè)文件夾里,需要隨機(jī)將圖片與標(biāo)注文件劃分為訓(xùn)練集和測(cè)試集。
處理過(guò)程:讀取文件列表,將列表打亂,截取列表一部分
二、實(shí)現(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' #劃分出來(lái)的驗(yàn)證集 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) # 這個(gè)可以修改劃分比例 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ù)集進(jìn)行移動(dòng)標(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ù)集進(jìn)行移動(dòng)標(biāo)注文件 MoveAn(filePathAn,filePath+'val')
三、方法補(bǔ)充
除了以上的方法,小編還為大家整理了其他劃分?jǐn)?shù)據(jù)集的方法,希望對(duì)大家有所幫助
方法一:使用random.sample將數(shù)據(jù)集隨機(jī)劃分為訓(xùn)練集與驗(yàn)證集并另存在文件夾中,設(shè)置隨機(jī)種子
import os import random import shutil def moveFile(input1,input2,save1,save2): pathDir = os.listdir(input1) # 取圖片的原始路徑 random.seed(1) filenumber = len(pathDir) # 原文件個(gè)數(shù) rate = 0.1 # 抽取的驗(yàn)證集的比例,占總數(shù)據(jù)的多少 picknumber = int(filenumber * rate) # 按照rate比例從文件夾中取一定數(shù)量圖片 sample = random.sample(pathDir, picknumber) # 隨機(jī)選取需要數(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)
方法二:通過(guò)train test_splt函數(shù)實(shí)現(xiàn)隨機(jī)劃分?jǐn)?shù)據(jù)
Python中,隨機(jī)劃分?jǐn)?shù)據(jù)集可以通過(guò)train test_splt函數(shù)實(shí)現(xiàn)。該函數(shù)可以將數(shù)據(jù)集隨機(jī)分成訓(xùn)練集和測(cè)試集,用于機(jī)器學(xué)習(xí)中的數(shù)據(jù)訓(xùn)練和測(cè)試。
函數(shù)的基本用法如下:
from sklearn.model_selection import train_test_split #X是所有的樣本特征,y是目標(biāo)變量,test_size是測(cè)試集占總樣本數(shù)的比例 # random_state是隨機(jī)數(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是測(cè)試集占總樣本數(shù)的比例。random_state用于設(shè)置隨機(jī)數(shù)發(fā)生器的種子,以保i每次劃分結(jié)果一致。函數(shù)會(huì)返回4個(gè)數(shù)組: X_train、X_test、y_train,y_test,分別代表訓(xùn)練集的特征、測(cè)試集的特征、訓(xùn)練集的目標(biāo)變量和測(cè)試集的目標(biāo)變量
方法三:將一個(gè)數(shù)據(jù)集按比例隨機(jī)分割成訓(xùn)練集、驗(yàn)證集、測(cè)試集
import random def split(fname, train_ratio, var_ratio): lines = fname.readlines() n_total = len(lines) # 獲取數(shù)據(jù)集的總長(zhǎng)度 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實(shí)現(xiàn)隨機(jī)劃分圖片數(shù)據(jù)集的示例代碼的文章就介紹到這了,更多相關(guān)Python隨機(jī)劃分?jǐn)?shù)據(jù)集內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
全面剖析Python的Django框架中的項(xiàng)目部署技巧
這篇文章主要全面剖析了Python的Django框架的部署技巧,包括Fabric等自動(dòng)化部署和建立單元測(cè)試等方面,強(qiáng)烈推薦!需要的朋友可以參考下2015-04-04python自定義函數(shù)實(shí)現(xiàn)一個(gè)數(shù)的三次方計(jì)算方法
今天小編就為大家分享一篇python自定義函數(shù)實(shí)現(xiàn)一個(gè)數(shù)的三次方計(jì)算方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01python 多進(jìn)程和協(xié)程配合使用寫(xiě)入數(shù)據(jù)
這篇文章主要介紹了python 多進(jìn)程和協(xié)程配合使用寫(xiě)入數(shù)據(jù),幫助大家利用python高效辦公,感興趣的朋友可以了解下2020-10-10Python實(shí)現(xiàn)http服務(wù)器(http.server模塊傳參?接收參數(shù))實(shí)例
這篇文章主要為大家介紹了Python實(shí)現(xiàn)http服務(wù)器(http.server模塊傳參?接收參數(shù))實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11Ubuntu 14.04+Django 1.7.1+Nginx+uwsgi部署教程
django+uwsgi的部署實(shí)在是太蛋疼了.網(wǎng)上已有的教程似乎有新版本的兼容問(wèn)題。最后跑到uwsgi官網(wǎng)上找的教程終于跑通了.. 不過(guò)官網(wǎng)的教程似乎有引導(dǎo)教學(xué)性質(zhì),部署的時(shí)候就顯得很繞彎路,在這里記錄下來(lái)精簡(jiǎn)內(nèi)容2014-11-11基于Python制作一個(gè)簡(jiǎn)單的文章搜索工具
這篇文章主要為大家詳細(xì)介紹了如何基于Python制作一個(gè)簡(jiǎn)單的文章搜索工具,都是一些基礎(chǔ)的應(yīng)用,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2023-05-05使用Keras預(yù)訓(xùn)練好的模型進(jìn)行目標(biāo)類別預(yù)測(cè)詳解
這篇文章主要介紹了使用Keras預(yù)訓(xùn)練好的模型進(jìn)行目標(biāo)類別預(yù)測(cè)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06Python入門(六)Python數(shù)據(jù)類型
這篇文章主要介紹了Python入門(六)Python數(shù)據(jù)類型,Python是一門非常強(qiáng)大好用的語(yǔ)言,也有著易上手的特性,本文為入門教程,需要的朋友可以參考下2023-04-04