文章目錄
-
- 1.需求
- 2.思路
-
- 2.1 複制的基礎功能
- 2.2周遊源檔案夾
- 2.3 建立目的檔案夾
- 2.4 每個檔案複制5次
- 2.5 要多用fprintf來檢查是不是有問題!
- 3.代碼
- 小結
這個代碼主要解決的是建構5折交叉驗證資料集,使之更自動,保護眼睛,保護腦細胞,自用為主。
1.需求
我現在有一個檔案夾
5折交叉驗證資料集
,太長了簡稱為
a
好了。。。裡面有5個檔案夾,
image0
,
image1
…每個檔案夾下有8個類别
class1
,
class2
,
class3
…需要把類别中的檔案都複制到一個目标檔案夾
b
,這個檔案夾是這樣的,有5個子檔案夾,命名為
,
1
,
2
,
3
,
4
,(就是第幾折),每個檔案夾下又分成2個子檔案夾
train
,
test
,每個train檔案夾下有8個類,就是
a
那邊的8個類,
a和b的關系就是:
的測試集(即
test
)就是
image0
,
的訓練集(即
train
)就是
image1
,
image2
,
image3
,
image4
;
1
的測試集(即
test
)就是
image1
,
1
的訓練集(即
train
)就是
image0
,
image2
,
image3
,
image4
;
2
的測試集(即
test
)就是
image2
,
2
的訓練集(即
train
)就是
image0
,
image1
,
image3
,
image4
;
3
的測試集(即
test
)就是
image3
,
3
的訓練集(即
train
)就是
image0
,
image1
,
image2
,
image4
;
4
的測試集(即
test
)就是
image4
,
4
的訓練集(即
train
)就是
image0
,
image1
,
image2
,
image3
;
因為怕錯,是以用手動的方法,結果當時花了40分鐘,就是手動把每個類的東西全選然後複制1次,粘貼5次到不同的地方,我分神了,反正一共粘貼了200次。。。,于是搞好了很久之後,決定搞個代碼,萬一下次資料集更大怎麼辦,還是讓電腦來吧
2.思路
2.1 複制的基礎功能
先搞定簡單的複制,參考這篇部落格https://blog.csdn.net/YeziTong/article/details/84942629
sourcePath = '.\Square_train';
targetPath = '.\Square_test';
fileList = dir(sourcePath);
for k = 3 :5: length(fileList)
movefile([sourcePath,'\',fileList(k).name],targetPath);
end
%copyfile([sourcePath,'\',fileList(k).name],targetPath)
我用到的是原部落客注釋掉的copyfile,(複制功能),for循環對我意義不大,因為實作的功能不一樣,感謝部落客染血白衣
2.2周遊源檔案夾
然後實作對原始檔案下a的檔案周遊,受第一步的啟發,其實就是不斷地取出對應路徑,再拼接起來,主要注意for循環的起點,對于如果讀出來的内容是檔案夾的話,從3開始,如果讀出的内容全是檔案的話,從1開始。
2.3 建立目的檔案夾
建構新的檔案夾b,(全空,沒有檔案),主要使用mkdir函數,class1,class2的名字我在2.周遊源檔案夾a的時候自動擷取了,感覺這樣會比較友善,當然可能并不。。。
2.4 每個檔案複制5次
把檔案一個一個複制到檔案夾b的對應位置中,其實就是再次周遊原始檔案夾a,然後對裡面的每個檔案進行5次複制,根據它的具體情況,把它複制到不同的地方。
2.5 要多用fprintf來檢查是不是有問題!
3.代碼
% 用于複制檔案夾下的檔案,人力複制粘貼可能總的要花1小時
% demo裡面的代碼是有個周遊源檔案夾的過程,demo1的代碼沒有周遊源檔案夾的過程
tic
clc
clear all
sourcePath_root = 'G:\資料集\5折交叉驗證資料集'; %資料可用
targetPath_root = 'G:\資料集\無需人為複制粘貼5折交叉驗證資料集';
count=0;
%周遊源檔案夾
fileList = dir(sourcePath_root); %有檔案夾,是個length+2的列向量,是以從3開始算,1和2是.和..
% fprintf('路徑是:%s\n', sourcePath_root);
% target_leiming=cell(8,1);
for k=3:1:length(fileList)
sourcePath_ziwenjianjia_root=[sourcePath_root,'\',fileList(k).name];%imgage0的絕對路徑
% fprintf('路徑是:%s\n', sourcePath_ziwenjianjia_root);
leibieList=dir(sourcePath_ziwenjianjia_root);
for kk=3:length(leibieList) %有檔案夾,是個length+2的列向量,是以從3開始算,1和2是.和..
leibiePath=[sourcePath_ziwenjianjia_root,'\',leibieList(kk).name];%imgage0\class1的絕對路徑
if k==3
target_leiming(kk-2)=string(leibieList(kk).name);%因為都是一樣的,是以目标檔案夾的類名可以一次就好
end
dangqianleitupianPath=dir([leibiePath,'\','*.bmp']);
for kkk=1:1:length(dangqianleitupianPath)%沒有檔案夾,是個length的列向量,從1開始
filenamepath=[leibiePath,'\',dangqianleitupianPath(kkk).name];
fprintf('目前讀取的圖檔是:%s\n', filenamepath);
img = imread([leibieFilename,'\',dangqianleitupianPath(kkk).name]); %測試:讀取每張,用來說明圖檔都可以用
count=count+1;%測試,檢視一共讀取了多少張圖檔
end
end
end
%建立目的檔案夾
targetPath_root = 'G:\資料集\無需人為複制粘貼5折交叉驗證資料集';
% if ~exist(targetPath_root) %如果targetPath路徑不存在,則建立
% mkdir(targetPath_root);
% end
for j=0:4 %5折交叉有5個,因為pyhon做的原始資料集,是以命名從0開始
target_meigefoldPath=[targetPath_root,'\',num2str(j)];%檔案夾0的路徑,0表示第一折
target_meigefold_trainPath=[target_meigefoldPath,'\','train'];%0的底下有train和test兩個檔案夾
target_meigefold_testPath=[target_meigefoldPath,'\','test'];
for jj=1:8 %每一折有8個類
target_meigelei_trainPath(j+1,jj)=string([target_meigefold_trainPath,'\',char(target_leiming(jj))]);
if ~exist(target_meigelei_trainPath(j+1,jj)) %如路徑不存在,則建立
mkdir(target_meigelei_trainPath(j+1,jj));
end
target_meigelei_testPath(j+1,jj)=string([target_meigefold_testPath,'\',char(target_leiming(jj))]);
if ~exist( target_meigelei_testPath(j+1,jj)) %如果路徑不存在,則建立
mkdir( target_meigelei_testPath(j+1,jj));
end
end
end
%複制檔案夾imgage0檔案夾下的每個檔案都要複制5次,複制到0的test,複制到1,2,3,4的train
% 複制檔案夾imgage1檔案夾下的每個檔案都要複制5次,複制到1的test,複制到0,2,3,4的train
countcopy=0;
for k=3:1:length(fileList)
sourcePath_ziwenjianjia_root=[sourcePath_root,'\',fileList(k).name];%imgage0的絕對路徑
% fprintf('路徑是:%s\n', sourcePath_ziwenjianjia_root);
leibieList=dir(sourcePath_ziwenjianjia_root);
for kk=3:length(leibieList) %有檔案夾,是個length+2的列向量,是以從3開始算,1和2是.和..
leibiePath=[sourcePath_ziwenjianjia_root,'\',leibieList(kk).name];%imgage0\class1的絕對路徑
dangqianleitupianPath=dir([leibiePath,'\','*.bmp']);
for kkk=1:1:length(dangqianleitupianPath)%沒有檔案夾,是個length的列向量,從1開始
filenamepath=[leibiePath,'\',dangqianleitupianPath(kkk).name];
for y=1:5
if y~=(k-2) %如果image0不對應0,則入訓練集
copyfile(filenamepath,target_meigelei_trainPath(y,kk-2));%訓練集
% fprintf('目前正複制%s 到 %s\n', filenamepath,target_meigelei_trainPath(y,kk-2));
else
copyfile(filenamepath,target_meigelei_testPath(y,kk-2));%測試集
% fprintf('目前正複制%s 到 %s\n', filenamepath,target_meigelei_testPath(y,kk-2));
end
countcopy=countcopy+1;%測試,檢視一共複制了多少次,應該是圖檔數x5
end
end
end
end
toc
%有輸出語句來檢查 是224.986428 秒。
%沒有輸出語句 時間已過 181.491226 秒。
% 沒有周遊源檔案夾,沒有輸出語句,時間已過 160.426182 秒。
小結
源
image0 image1…——周遊變量k,k的取值為1到7,但參與到for循環的是3到7
image0裡面有8個類别,.——周遊變量kk ,kk的取值為1到10,但參與到for循環的是3到10
類别1裡面有若幹張圖檔——周遊變量kkk,kkk的取值為1到xxx
,參與到for循環的是1到xxx
目标
0,1…——周遊變量j,j的取值為1到5
0裡面有train和test,train裡面有8個類别,test裡面也有同樣的8個類别,8個類别周遊變量jj,jj的取值為1到8
y是循環5次的變量,因為每張圖檔要執行5次複制,是以y是1到5
因為是源檔案夾中周遊,然後複制,是以把相關的j,jj,y一般用k和kk,kkk表示
j=k-2
jj=kk-2
y=k-2
主要是源檔案夾和目标檔案夾的class是一樣的類别,而且順序要一樣才可以這麼做,不能說源的第1類是class1,但是目标的class1卻不是該數組的第一個元素,如果是這樣,上面的映射關系就沒有實際意義了。