Matlab按圖片分割數據為訓練集和測試集並生成label


自己弄數據集,真是非一般的體驗呀。雖然說這樣算是正在意義上經歷一個完整的項目,被迫學習了很多數據處理的問題。但是搞數據真是太蛋疼了。

想了很多方法,但最后發現其實自己整理的數據,最合理的分配訓練集和測試集的方法。就是先把數據全部整到一起,然后按一定比例從中隨機選出訓練集和測試集(這兩個肯定是不能重復的),比如這里的25%作為測試集,75%作為訓練集。

編寫這個程序一開始,主要是有些函數不知道怎么用。編這程序是發現了即使是matlab編寫程序都要用disp輸出一些信息,這樣更方便查看程序運行進度。其余就是新學習了一些函數,再把之前編寫的程序合起來。

  1 clear;close all;clc;
  2 %%
  3 %程序實現的功能
  4 %1、把指定路徑的數據(已按類別放置在不同的文件夾中),隨機的把其中的75%的划分為訓練集,25%划分為測試集
  5 %2、訓練集按類別放在指定路徑的train文件夾中,測試集按類別放在指定路徑的val文件夾中
  6 %3、在train和val文件夾的同級文件夾按照caffe需求生成對應的train.txt和val.txt的label
  7 %%
  8 %程序中用到的之前不清楚的函數如下
  9 %1)disp:用來在界面上顯示一些必要的信息,方便查看程序進度。disp(' ')可以起到在界面上換行顯示的作用
 10 %2)str2double:帶起之前一直使用的str2num,matlab的提示是這樣函數效率更高。而且這兩個函數輸出的數據類型都是double類型。
 11 %3)randperm(n):生成一個1到n直接的隨機數列
 12 %4)copyfile(a,b):把文件a復制到路徑b,路徑b帶有最后的\符號
 13 %
 14 %
 15 %
 16 %%
 17 disp('程序開始執行');
 18 %%%%%%需要更改的參數(即兩個路徑)%%%%%%%%%%%%%%%%%%%%%%%%%%
 19 
 20 pathSource='C:\Users\Dy\Desktop\歸一化后的圖像\sjz';
 21 
 22 pathDestination='C:\Users\Dy\Desktop\歸一化后的圖像\sjfg';
 23 
 24 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 25 %在目標路徑創建train、val文件夾
 26 pathCreDirTrain=[pathDestination,'\','train','\'];
 27 mkdir(pathCreDirTrain);
 28 pathCreDirVal=[pathDestination,'\','val','\'];
 29 mkdir(pathCreDirVal);
 30 
 31 
 32 %讀取文件夾列表,這種方式讀取會保留原文件.(在結構體中第一個)和上一層目錄..(在結構體第二個)
 33 dirSourceList=dir(pathSource);
 34 countSourceList=length(dirSourceList);%文件夾個數
 35 %拷貝數據到目標路徑
 36 for numDirList=3:countSourceList
 37     if(length(dirSourceList(numDirList).name)>=2)%根據這個過濾掉在此文件夾可能的train.txt、val.txt、count.txt文件
 38         continue;
 39     end    
 40     fileName=dir([pathSource,'\',dirSourceList(numDirList).name]);%讀取子文件夾中的圖片
 41     
 42     %統計子文件夾中的文件個數
 43     fileSum=length(fileName);
 44     fileNum=fileSum-2;%為了生成對應於讀取的從3開始的文件,只能先減去2,然后生成隨機數后加上2
 45     disp(' ');%加入一個空格,作為在界面顯示中一個類似於換行的工具
 46     %在程序中增加一些輸出信息,方便查看數據內容
 47     disp(['原始數據子文件夾',num2str(dirSourceList(numDirList).name),'中有圖片:',num2str(fileNum)]);
 48     
 49     %由於matlab讀取文件的規則,在文件列表中肯定最前面會有.和..這兩個文件
 50     %所以想到先生成fileSum-2范圍內的隨機數,然后再各項加2,就為真正要找的隨機數
 51     numFileList=randperm(fileNum);
 52     numFileList=numFileList+2;
 53     partitionPosition=round(fileNum/4);%這是通過四舍五入確定的分割位置。
 54     
 55     %在程序中增加一些輸出信息,方便查看數據內容
 56 %     disp(['先拷貝val(前25%)后拷貝train(后75%)']);
 57     
 58    %%
 59     %拷貝測試集數據val
 60     %在程序中增加一些輸出信息,方便查看程序執行進度
 61     disp(['在val文件夾下創建子文件夾',num2str(dirSourceList(numDirList).name)]);
 62     disp(['拷貝',num2str(partitionPosition),'張圖片到val文件夾下子文件夾',num2str(dirSourceList(numDirList).name),'']);
 63      
 64     %不知道這種拷貝東西到別的地方,是先拷貝數據量比較多的部分,還是數據量比較少的部分,這有什么講究。
 65     %在目標val文件夾中,創建對應的子文件夾
 66     pathCreValDir=[pathCreDirVal,dirSourceList(numDirList).name,'\'];
 67     mkdir(pathCreValDir);
 68     
 69     %在程序中增加一些輸出信息,方便查看程序執行進度
 70     disp(['復制測試數據到val子文件夾',num2str(dirSourceList(numDirList).name),'']);
 71     
 72     %復制圖片到指定路徑
 73     for picNum=1:partitionPosition%由於是要讀取numFileList中生成的隨機數據,所以從1開始
 74         copyfile([pathSource,'\',dirSourceList(numDirList).name,'\',fileName(numFileList(picNum)).name], ...
 75             pathCreValDir);
 76     end
 77    %%
 78     %拷貝訓練集數據train
 79     %在程序中增加一些輸出信息,方便查看程序執行進度
 80     disp(['在train文件夾下創建子文件夾',num2str(dirSourceList(numDirList).name)]);
 81     disp(['拷貝',num2str(fileNum-partitionPosition),'張圖片到train文件夾下子文件夾',num2str(dirSourceList(numDirList).name),'']);  
 82     
 83     %在目標train文件夾中,創建對應的子文件夾
 84     pathCreTrainDir=[pathCreDirTrain,dirSourceList(numDirList).name,'\'];
 85     mkdir(pathCreTrainDir);  
 86     
 87     %在程序中增加一些輸出信息,方便查看程序執行進度
 88     disp(['復制訓練數據到Train子文件夾',num2str(dirSourceList(numDirList).name),'']);
 89     
 90     %復制圖片到指定路徑
 91     for picNum=partitionPosition+1:fileNum%由於是要讀取numFileList中生成的隨機數據,所以從1開始
 92         copyfile([pathSource,'\',dirSourceList(numDirList).name,'\',fileName(numFileList(picNum)).name], ...
 93             pathCreTrainDir);
 94     end    
 95 end
 96 disp('數據拷貝完畢');
 97 
 98 
 99 %%
100 %生成label
101 disp('開始生成label');
102 %考慮到最好寫個程序,能夠一步完整所有操作。所以在這程序下面加上生成label的功能
103 %在上面的程序中,已經有變量pathCreDirTrain(目標Train的路徑)、pathCreDirVal(目標Val的路徑)
104 %先生成train文件夾中的label
105 disp('開始生成trainlabel');
106 dirTrainList=dir(pathCreDirTrain);%讀取文件夾列表,這種方式讀取會保留原文件.(在結構體中第一個)和上一層目錄..(在結構體第二個)
107 countTrainList=length(dirTrainList);%文件夾個數
108 fid = fopen([pathDestination,'\','train.txt'], 'w');%打開train文件夾時,對應的文本文件
109 for numList=3:countTrainList%文件夾從3開始
110     if(length(dirTrainList(numList).name)>=2)%根據這個過濾掉在此文件夾可能的train.txt文件
111         continue;
112     end
113     fileName=dir([pathCreDirTrain,'\',dirTrainList(numList).name]);%讀取子文件夾
114     fileSum=length(fileName);%統計子文件夾中的文件個數
115     for fileNum=3:fileSum%文件從3開始
116         fprintf(fid,'%s', [dirTrainList(numList).name,'/',fileName(fileNum).name]);%輸入:子文件/圖片名稱
117         fprintf(fid,'%s', ' ');%空格間隔符    
118         fprintf(fid,'%d', str2double(dirTrainList(numList).name));%加入label,即文件夾名稱
119         fprintf(fid,'\n');%換行
120     end
121 end
122 fclose(fid);%關閉文本文件
123 fclose('all');%關閉所有連接,防止沒關掉的情況
124 disp('trainlabel生成完畢');
125 
126 %在上面的程序中,已經有變量pathCreDirTrain(目標Train的路徑)、pathCreDirVal(目標Val的路徑)
127 %先生成train文件夾中的label
128 disp('開始生成vallabel');
129 dirValList=dir(pathCreDirVal);%讀取文件夾列表,這種方式讀取會保留原文件.(在結構體中第一個)和上一層目錄..(在結構體第二個)
130 countValList=length(dirValList);%文件夾個數
131 fid = fopen([pathDestination,'\','val.txt'], 'w');%打開train文件夾時,對應的文本文件
132 for numList=3:countValList%文件夾從3開始
133     if(length(dirValList(numList).name)>=2)%根據這個過濾掉在此文件夾可能的train.txt文件
134         continue;
135     end
136     fileName=dir([pathCreDirVal,'\',dirValList(numList).name]);%讀取子文件夾
137     fileSum=length(fileName);%統計子文件夾中的文件個數
138     for fileNum=3:fileSum%文件從3開始
139         fprintf(fid,'%s', [dirValList(numList).name,'/',fileName(fileNum).name]);%輸入:子文件/圖片名稱
140         fprintf(fid,'%s', ' ');%空格間隔符    
141         fprintf(fid,'%d', str2double(dirValList(numList).name));%加入label,即文件夾名稱
142         fprintf(fid,'\n');%換行
143     end
144 end
145 fclose(fid);%關閉文本文件
146 fclose('all');%關閉所有連接,防止沒關掉的情況
147 disp('vallabel生成完畢');

 


免責聲明!

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



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