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 %310 %411 %%
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文件

 

posted @ 2015-05-07 15:53  菜鸡一枚  阅读(2961)  评论(0编辑  收藏  举报