Matlab生成label
考虑到之前写的代码,每次要找到train或者val的文件夹作为地址给path,如果有train和val两个文件夹都存在的情况,那么就要操作两次。而之前写的代码,给了我想法。反正训练集和测试集肯定是存放在train和val中,那么直接到train和val存放的文件夹,然后在这生成train.txt和val.txt,那么就可以了。还可以固定文件名,直接去找有没有train和val文件夹,有再生成label。没有就算了。而根据之前写代码的经验,一直都想有变量trainflag和valflag,来控制是生成trainlabel或者是testlabel。所以就有了下面这个代码。感觉这真称的上是。就这个数字时间码项目的生成数据的终极版了。所以取名createlabelultimate,希望这个项目就不用再改这生成label的matlab代码了。代码其实还是很简单的。发现如果知道了要用啥函数,matlab按照C的方式写代码,太简单了。只不过就是程序运行的时间,可能慢点。。。。
1 clear;close all;clc; 2 %% 3 %程序如何操作: 4 %把变量path改为数据train和val所在的文件夹地址 5 %trainFlag和valFlag分别控制是否生成train或者val的labeltrain.txt和val.txt 6 %% 7 %下一步改进: 8 % 9 %% 10 %程序实现的功能 11 %1、在保存有train和val文件夹的总路径下,根据文件夹中的文件数据在train和val的平级文件夹下面生成train和val的label 12 %% 13 %程序中用到的之前不清楚的函数如下 14 %1)strcmp(a,b):如果字符串a和b相同,则输出1,否则输出0 15 %2) 16 %3) 17 %4) 18 %% 19 %变量命名规则: 20 %总路径下面的文件夹记为cata(catalogue) 21 %总路径下一层的文件夹记为dir(directory) 22 %最后一层就是各个文件记为file 23 tic; 24 %生成label 25 26 disp('程序开始执行'); 27 %程序假定路径文件夹下有train或者val文件夹,通过标志判断符绝对是否生成这两个txt的label 28 %%%%%%%%%%%%需要更改的参数(即文件夹路径)%%%%%%%%%% 29 30 path='C:\Users\Dy\Desktop\归一化后的图像\sjfg'; 31 %绝对是否生成trainlabel的标志判断符 32 trainFlag=1; 33 %绝对是否生成testlabel的标志判断符 34 valFlag=1; 35 36 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 37 %生成trainlabel 38 cataList=dir(path);%读取文件夹列表,这种方式读取会保留原文件.(在结构体中第一个)和上一层目录..(在结构体第二个) 39 countCata=length(cataList);%文件夹个数 40 %先生成train的label 41 if trainFlag 42 %先用for找到train文件夹的位置,如果找到了就相当于当前路径下面有train文件夹 43 trainCataPositionFlag=0; 44 for i=3:countCata 45 if strcmp(cataList(i).name,'train') 46 trainCataPositionFlag=i; 47 break; 48 end 49 end 50 %通过traincatapositionflag作为一个判断符号,绝对下一步是否生成label 51 %这种编程设置,主要是防止即使trainflag为真,但是当前路径下面没有train文件夹这种情况 52 if trainCataPositionFlag 53 disp('开始生成trainLabel'); 54 countTrain=0;%用于统计总共有多少个train数据 55 %如果trainCataPositionFlag非零,那么这个文件夹下肯定有train子文件夹 56 %所以下面就直接读取train子文件夹中的内容 57 dirList=dir([path,'\','train']);%读取文件夹列表,这种方式读取会保留原文件.(在结构体中第一个)和上一层目录..(在结构体第二个) 58 countDir=length(dirList);%文件夹个数 59 fid = fopen([path,'\','train.txt'], 'w');%打开数据文件夹时,对应的文本文件 60 for numDir=3:countDir%看train文件夹里面总共有多少个子文件夹 61 if(length(dirList(numDir).name)>=2)%根据这个过滤掉在此文件夹可能存在的各种txt文件 62 continue; 63 end 64 fileList=dir([path,'\','train','\',dirList(numDir).name]); 65 countFile=length(fileList); 66 countTrain=countTrain+countFile-2; 67 disp(['子文件夹',dirList(numDir).name,'中有个',' ',num2str(countFile-2),' ','样本']); 68 for numFile=3:countFile%把子文件夹中的每个文件名输入到对应的txt中 69 fprintf(fid,'%s', [dirList(numDir).name,'/',fileList(numFile).name]);%输入:子文件/图片名称 70 fprintf(fid,'%s', ' ');%空格间隔符 71 fprintf(fid,'%d', str2double(dirList(numDir).name));%加入label,即文件夹名称 72 fprintf(fid,'\n');%换行 73 end 74 end 75 fclose(fid);%关闭文本文件 76 fclose('all');%关闭所有连接,防止没关掉的情况 77 disp(['trainLabel生成完毕,共生成',num2str(countTrain),'个label']); 78 end 79 end 80 81 disp(' ');%用于分割命令窗口的train和val提示信息 82 83 %先生成test的label 84 if valFlag 85 %先用for找到train文件夹的位置,如果找到了就相当于当前路径下面有train文件夹 86 valCataPositionFlag=0; 87 for i=3:countCata 88 if strcmp(cataList(i).name,'val') 89 valCataPositionFlag=i; 90 break; 91 end 92 end 93 %通过traincatapositionflag作为一个判断符号,绝对下一步是否生成label 94 %这种编程设置,主要是防止即使trainflag为真,但是当前路径下面没有train文件夹这种情况 95 if valCataPositionFlag 96 disp('开始生成valLabel'); 97 countTest=0;%用于统计总共有多少个train数据 98 %如果trainCataPositionFlag非零,那么这个文件夹下肯定有train子文件夹 99 %所以下面就直接读取train子文件夹中的内容 100 dirList=dir([path,'\','val']);%读取文件夹列表,这种方式读取会保留原文件.(在结构体中第一个)和上一层目录..(在结构体第二个) 101 countDir=length(dirList);%文件夹个数 102 fid = fopen([path,'\','val.txt'], 'w');%打开数据文件夹时,对应的文本文件 103 for numDir=3:countDir%看train文件夹里面总共有多少个子文件夹 104 if(length(dirList(numDir).name)>=2)%根据这个过滤掉在此文件夹可能存在的各种txt文件 105 continue; 106 end 107 fileList=dir([path,'\','val','\',dirList(numDir).name]); 108 countFile=length(fileList); 109 countTest=countTest+countFile-2; 110 disp(['子文件夹',dirList(numDir).name,'中有个',' ',num2str(countFile-2),' ','样本']); 111 for numFile=3:countFile%把子文件夹中的每个文件名输入到对应的txt中 112 fprintf(fid,'%s', [dirList(numDir).name,'/',fileList(numFile).name]);%输入:子文件/图片名称 113 fprintf(fid,'%s', ' ');%空格间隔符 114 fprintf(fid,'%d', str2double(dirList(numDir).name));%加入label,即文件夹名称 115 fprintf(fid,'\n');%换行 116 end 117 end 118 fclose(fid);%关闭文本文件 119 fclose('all');%关闭所有连接,防止没关掉的情况 120 disp(['valLabel生成完毕,共生成',num2str(countTest),'个label']); 121 end 122 end 123 toc;
由于之前的代码,每次都要修改生成label的文件夹的路径,以及保存label的txt文件名。这感觉太麻烦了。而且考虑到其实到最后生成label的阶段,基本上文件夹的名称已经按照caffe create_imagenet.sh中的需求,改为了train或者val文件夹,这刚好和需要生成的label的txt同名称,这就为省略修改保存label的txt文件名提供了客观上的方便。所以下面程序的更改,就是这个思路。提取出路径中以\分割的最后一级文件夹的名称,一般为train或者val文件夹。用这个来做txt的文件名。
1 clear;close all;clc; 2 %% 3 %程序实现的功能 4 %1、在一个文件夹下,根据下面存在的子文件夹生成符合caffe要求的train.txt或者val.txt的label 5 %% 6 %程序中用到的之前不清楚的函数如下 7 %1)strfind(a,b):即找a中是否有b,如果a中有b,则输出b的位置序号。没有输出空数组 8 %2) 9 %3) 10 %4) 11 %% 12 tic; 13 %生成label 14 %路径 15 disp('程序开始执行'); 16 %%%%%%%%%%%%需要更改的参数(即文件夹路径)%%%%%%%%%% 17 18 path='C:\Users\Dy\Desktop\归一化后的图像\sjfg\train'; 19 20 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 21 dirList=dir(path);%读取文件夹列表,这种方式读取会保留原文件.(在结构体中第一个)和上一层目录..(在结构体第二个) 22 countList=length(dirList);%文件夹个数 23 %之前的程序如下,是自己手动选择是生成诸如train、val、count之类的txt 24 %但考虑到这样每次除了要更改文件夹路径之外,还要改txt的文件名,这样太麻烦了 25 %而且其实一般到了要生成的label的阶段,一般也都已经把文件夹的名称改为了诸如train或者val的名称 26 %所以可以直接根据’\‘分割路径,提取出最后的字符串,用这个来做文件名也可以。 27 %大部分情况下,这个程序都可以满足需求,而且节省了手动操作。是可以接受的 28 %少数特殊情况,其实自己直接修改txt文件名就可以了 29 30 count=0;%用于统计这个文件夹下各自文件夹中共有多少数据,也就是生成的txt中总共有多少行,多少label 31 position=strfind(path,'\');%根据\分割路径字符串 32 txtname=path(position(end)+1:end);%提取路径字符串最后的\之后的内容,及很大可能性是train或者val 33 fid = fopen([path,'\',txtname,'.txt'], 'w');%打开数据文件夹时,对应的文本文件 34 35 % fid = fopen([path,'\','count.txt'], 'w');%打开数据文件夹时,对应的文本文件 36 % fid = fopen([path,'\','train.txt'], 'w');%打开train文件夹时,对应的文本文件 37 % fid = fopen([path,'\','val.txt'], 'w');%打开val文件夹时,对应的文本文件 38 for numList=3:countList%文件夹从3开始 39 if(length(dirList(numList).name)>=2)%根据这个过滤掉在此文件夹可能的train.txt文件 40 continue; 41 end 42 fileName=dir([path,'\',dirList(numList).name]);%读取子文件夹 43 fileSum=length(fileName);%统计子文件夹中的文件个数 44 count=count+fileSum-2; 45 disp(['文件夹',dirList(numList).name,'中有个',' ',num2str(fileSum-2),' ','样本']); 46 for fileNum=3:fileSum%文件从3开始 47 fprintf(fid,'%s', [dirList(numList).name,'/',fileName(fileNum).name]);%输入:子文件/图片名称 48 fprintf(fid,'%s', ' ');%空格间隔符 49 fprintf(fid,'%d', str2num(dirList(numList).name));%加入label,即文件夹名称 50 fprintf(fid,'\n');%换行 51 end 52 end 53 fclose(fid);%关闭文本文件 54 fclose('all');%关闭所有连接,防止没关掉的情况 55 disp('程序执行完毕'); 56 disp(['总共标记了',' ',num2str(count),' ','个样本']); 57 toc;
下面这个代码,每次运行,要修改两个地方,第一个是路径,第二个是生成的txt文件名,感觉太麻烦了。所以就有了上面这个代码。
数据按照不同类别(放在不同的子文件夹下面),然后在总文件夹下面,根据caffe的需求生成label
%这个程序生成label的默认条件,为图片按照label(文件夹名),分别存放在不同的文件夹下面 clear;close all;clc; %生成label %路径 %%%%%%%%%%%%%%%%%change%%%%%%%%%%%%%%%%%%%%%%%%%% path='C:\Users\Dy\Desktop\彩色视频真实数据\sjz'; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% dirList=dir(path);%读取文件夹列表,这种方式读取会保留原文件.(在结构体中第一个)和上一层目录..(在结构体第二个) countList=length(dirList);%文件夹个数 %%%%%%%%%%%%%%%%%%change%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fid = fopen([path,'\','count.txt'], 'w');%打开train文件夹时,对应的文本文件 % fid = fopen([path,'\','train.txt'], 'w');%打开train文件夹时,对应的文本文件 % fid = fopen([path,'\','val.txt'], 'w');%打开val文件夹时,对应的文本文件 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% for numList=3:countList%文件夹从3开始 if(length(dirList(numList).name)>=2)%根据这个过滤掉在此文件夹可能的train.txt文件 continue; end fileName=dir([path,'\',dirList(numList).name]);%读取子文件夹 fileSum=length(fileName);%统计子文件夹中的文件个数 for fileNum=3:fileSum%文件从3开始 fprintf(fid,'%s', [dirList(numList).name,'/',fileName(fileNum).name]);%输入:子文件/图片名称 fprintf(fid,'%s', ' ');%空格间隔符 fprintf(fid,'%d', str2num(dirList(numList).name));%加入label,即文件夹名称 fprintf(fid,'\n');%换行 end end fclose(fid);%关闭文本文件 fclose('all');%关闭所有连接,防止没关掉的情况
下面的这个程序就是在一个文件夹,里面包含按各个类别存在的字图片中的
1 clear all;clc; 2 3 %写train的label 4 % path='C:\Users\Dy\Desktop\实验数据\train'; 5 % filedir=dir(path);%读取目录 6 % countdir=length(filedir); 7 % fid = fopen([path,'\','train.txt'], 'w');%打开文本文件 8 % for numdir=3:countdir 9 % file=dir([path,'\',filedir(numdir).name])%读取文件 10 % countfile=length(file); 11 % for numfile=3:countfile 12 % fprintf(fid,'%s', [filedir(numdir).name,'/',file(numfile).name]); 13 % fprintf(fid,'%s', ' ');%要注意这单独就是用一个空格分隔 14 % fprintf(fid,'%d', str2num(file(numfile).name(1)));%加入label,注意这里加入了一个字符串转换 15 % fprintf(fid,'\n');%换行 16 % end 17 % end 18 % fclose(fid);%关闭文本文件 19 % fclose('all'); 20 21 22 %写val的label 23 path='C:\Users\Dy\Desktop\实验数据\val'; 24 file=dir(path);%这种方式读取好像会保留原文件.(在结构体中第一个)和上一层目录..(在结构体第二个) 25 count=length(file); 26 fid = fopen([path,'\','val.txt'], 'w');%打开文本文件 27 for num=3:count 28 fprintf(fid,'%s', file(num).name); 29 fprintf(fid,'%s', ' '); 30 fprintf(fid,'%d', str2num(file(num).name(1)));%加入label,注意这里加入了一个字符串转换 31 fprintf(fid,'\n');%换行 32 end 33 fclose(fid);%关闭文本文件 34 fclose('all'); 35 %多次运行这程序会在文本最下面生成一个val.txt文件