caffe对于训练数据格式,支持:lmdb、h5py……,其中lmdb数据格式常用于单标签数据,像分类等,经常使用lmdb的数据格式。对于回归等问题,或者多标签数据,一般使用h5py数据的格式。本文介绍两种生成caffe特定格式文件所需的标签文件train.txt和val.txt的方法。
1、用matlab语言编写
做的标签文件如下:(无打乱)
- image/Audi/000001.jpg 0
- image/Audi/000002.jpg 0
- image/Audi/000003.jpg 0
- image/Audi/000004.jpg 0
(Audi等文件夹内放的是该类别的图片,最好先对这些图片重命名为统一格式,如000001.jpg,000002.jpg这种格式,重命名代码 ,参考http://blog.csdn.net/sinat_30071459/article/details/50723212)
- clc;
- clear;
- %%下面生成顺序的trainval.txt和labels文件
- %先设置train占数据集的百分比,余下部分为val
- maindir='image\';
- wf = fopen('trainval.txt','w');
- lbf=fopen('labels.txt','w');
- train_percent=0.9;%val_percent=1-train_percent
-
- subdir = dir(maindir);
- ii=-1;
- numoffile=0;
- for i = 1:length(subdir)%第一层目录
- if ~strcmp(subdir(i).name ,'.') && ~strcmp(subdir(i).name,'..')
- ii=ii+1;
- label = subdir(i).name;
- fprintf(lbf,'%s\n',label);
- label=strcat(label,'/');
- subsubdir = dir(strcat(maindir,label));
- for j=1:length(subsubdir)
- if ~strcmp(subsubdir(j).name ,'.') && ~strcmp(subsubdir(j).name,'..')
- fprintf(wf,'%s%s%s %d\n','image/',label,subsubdir(j).name,ii);
- numoffile=numoffile+1;
- fprintf('处理标签为%d的第%d张图片\n',ii,j-2);
- end
- end
-
- end
- end
- fclose(wf);
- fclose(lbf);
-
- %%
- %下面将trainval的顺序打乱
- file=cell(1,numoffile);
- fin=fopen('trainval.txt','r');
- i=1;
- while ~feof(fin)
- tline=fgetl(fin);
- file{i}=tline;
- i=i+1;
- end
- fclose(fin);
-
- fprintf('\ntrainval.txt共%d行,开始打乱顺序....\n',numoffile);
- pause(1);
- rep=randperm(numoffile);
- fout=fopen('trainval.txt','w');
- for i=1:numoffile
- fprintf(fout,'%s\n',file{rep(i)});
- end
- fprintf('生成的trainval.txt已打乱顺序.\n');
- fclose(fout);
-
- %%
- %下面根据打乱顺序的trainval.txt生成train.txt和val.txt
- fprintf('开始生成train.txt和val.txt...\n');
- pause(1);
- train_file=fopen('train.txt','w');
- text_file=fopen('val.txt','w');
- trainvalfile=fopen('trainval.txt','r');
-
- num_train=sort(randperm(numoffile,floor(numoffile*train_percent)));
- num_test=setdiff(1:numoffile,num_train);
- i=1;
- while ~feof(trainvalfile)
- tline=fgetl(trainvalfile);
- if ismember(i,num_train)
- fprintf(train_file,'%s\n',tline);
- else
- fprintf(text_file,'%s\n',tline);
- end
- i=i+1;
- end
- fclose(train_file);
- fclose(text_file);
- fclose(trainvalfile);
- fprintf('共有图片%d张!\n',numoffile);
- fprintf('Done!\n');
2、用python语言编写
原文地址:http://m.blog.csdn.net/article/details?id=52149743
路径与标签之间是一个空格,标签最好从0开始。
将代码保存为.py的Python文件,运行该Python代码生成 txt 文件。
注:图像存储路径和代码.py文件的位置。
- <pre class="python" name="code">#coding:utf-8
- '''''
- Created on Jul 29, 2016
- @author: sgg
- '''
- "<span style=""font-family:Arial;font-size:18px;"">"
- "<span style=""font-size:18px;"">"
- "<span style=""font-size:18px;"">"
- import os
- def IsSubString(SubStrList,Str):
- flag=True
- for substr in SubStrList:
- if not(substr in Str):
- flag=False
- return flag
- #扫面文件
- def GetFileList(FindPath,FlagStr=[]):
- FileList=[]
- FileNames=os.listdir(FindPath)
- if len(FileNames)>0:
- for fn in FileNames:
- if len(FlagStr)>0:
- if IsSubString(FlagStr,fn):
- fullfilename=os.path.join(FindPath,fn)
- FileList.append(fullfilename)
- else:
- fullfilename=os.path.join(FindPath,fn)
- FileList.append(fullfilename)
- if len(FileList)>0:
- FileList.sort()
- return FileList
- train_txt=open('train.txt','w')
- #制作标签数据,如果是狗的,标签设置为0,如果是猫的标签为1
- imgfile=GetFileList('train/train_cat')#将数据集放在与.py文件相同目录下
- for img in imgfile:
- str1=img+' '+'1'+'\n' #用空格代替转义字符 \t
- train_txt.writelines(str1)
- imgfile=GetFileList('train/train_dog')
- for img in imgfile:
- str2=img+' '+'0'+'\n'
- train_txt.writelines(str2)
- train_txt.close()
- #测试集文件列表
- test_txt=open('val.txt','w')
- #制作标签数据,如果是男的,标签设置为0,如果是女的标签为1
- imgfile=GetFileList('val/test_cat')#将数据集放在与.py文件相同目录下
- for img in imgfile:
- str3=img+' '+'1'+'\n'
- test_txt.writelines(str3)
- imgfile=GetFileList('val/test_dog')
- for img in imgfile:
- str4=img+' '+'0'+'\n'
- test_txt.writelines(str4)
- test_txt.close()
- print("成功生成文件列表")