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 image文件夹下是各类别文件夹,如下:
(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("成功生成文件列表")