matlab划分训练集验证和测试集代码_Matlab按图⽚分割数据为训练集和测试集并⽣成l。。。
1 clear;close all;clc;
2 %%
3 %程序实现的功能
4 %1、把指定路径的数据(已按类别放置在不同的⽂件夹中),随机的把其中的75%的划分为训练集,25%划分为测试集
5 %2、训练集按类别放在指定路径的train⽂件夹中,测试集按类别放在指定路径的val⽂件夹中
6 %3、在train和val⽂件夹的同级⽂件夹按照caffe需求⽣成对应的和的label
7 %%
8 %程序中⽤到的之前不清楚的函数如下9 %1)disp:⽤来在界⾯上显⽰⼀些必要的信息,⽅便查看程序进度。disp(' ')可以起到在界⾯上换⾏显⽰的作⽤10 %2)str2double:带起之前⼀直使⽤的str2num,matlab的提⽰是这样函数效率更⾼。⽽且这两个函数输出的数据类型都是double类型。11 %3)r
andperm(n):⽣成⼀个1到n直接的随机数列12 %4)copyfile(a,b):把⽂件a复制到路径b,路径b带有最后的\符号13 %
14 %
15 %
16 %%matlab生成随机数
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:countSourceList37 if(length(dirSourceList(numDirList).name)>=2)%根据这个过滤掉在此⽂件夹可能的、、⽂件38 continue;39 end40 fileName=dir([pathSource,'\',dirSourceList(numDirList).name]);%读取⼦⽂件夹中的图⽚
41
42 %统计⼦⽂件夹中的⽂件个数43 fileSum=length(fileName);44 fileNum=fileSum-2;%为了⽣成对应于读取的从3开始的⽂件,只能先减去2,然后⽣成随机数后加上245 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 %拷贝测试集数据val60 %在程序中增加⼀些输出信息,⽅便查看程序执⾏进度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 end77 %%
78 %拷贝训练集数据train79 %在程序中增加⼀些输出信息,⽅便查看程序执⾏进度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 end95 end96 disp('数据拷贝完毕');97
98
99 %%
100 %⽣成label101 disp('开始⽣成label');102 %考虑到最好写个程序,能够⼀步完整所有操作。所以在这程序下⾯加上⽣成label的功能103 %在上⾯的程序中,已经有变量pathCreDirTrain(⽬标Train的路径)、pathCreDirVal(⽬标Val的路径)104 %先⽣成train⽂件夹中的label105 disp('开始⽣成trainlabel');106 dirTrainList=dir(pathCreDirTrain);%读取⽂件夹列表,这种⽅式读取会保留原⽂件.(在结构体中第⼀个)和上⼀层⽬录..(在结构体第⼆个)107 countTrainList=length(dirTrainList);%⽂件夹个数108 fid =
fopen([pathDestination,'\',''],'w');%打开train⽂件夹时,对应的⽂本⽂件
109 for numList=3:countTrainList%⽂件夹从3开始110 if(length(dirTrainList(numList).name)>=2)%根据这个过滤掉在此⽂件夹可能的⽂件111 continue;112 end113 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 end121
end122 fclose(fid);%关闭⽂本⽂件123 fclose('all');%关闭所有连接,防⽌没关掉的情况124 disp('trainl
abel⽣成完毕');125
126 %在上⾯的程序中,已经有变量pathCreDirTrain(⽬标Train的路径)、pathCreDirVal(⽬标Val的路径)127 %先⽣成train⽂件夹中的label128 disp('开始⽣成vallabel');129 dirValList=dir(pathCreDirVal);%读取⽂件夹列表,这种⽅式读取会保留原⽂件.(在结构体中第⼀个)和上⼀层⽬录..(在结构体第⼆个)130 countValList=length(dirValList);%⽂件夹个数131 fid =
fopen([pathDestination,'\',''],'w');%打开train⽂件夹时,对应的⽂本⽂件
132 for numList=3:countValList%⽂件夹从3开始133 if(length(dirValList(numList).name)>=2)%根据这个过滤掉在此⽂件夹可能的⽂件134 continue;135 end136 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 end144 end145 fclose(fid);%关闭⽂本⽂件146 fclose('all');%关闭所有连接,防⽌没关掉的情况147 disp('vallabel⽣成完毕');
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论