主要参考下面这个博客:
http://blog.csdn.net/sinat_30071459/article/details/50723212
1、首先对图片按照VOC2007里面图片的格式进行重命名
function imgName( ) path = 'C:\Users\lenovo\Desktop\racket_dect\paizi\';%所有图片存放的路径 D = dir([path '*.jpg']);%将该路径下的所有文件读取成一个结构体 for i = 1:length(D)%遍历每一张图片 image_name = D(i).name;%每一张图片的名字 I = imread(strcat(path,image_name));%读取每一张图片 nz = strcat('%0',num2str(6),'d');%给该图片重命名名字的位数 temp_id = sprintf(nz,i);%按序数给所有图片命名,前面补0 name2 = strcat(temp_id,'.jpg'); imwrite(I,name2);%以新名字保存图片 end end
2、用脚本程序对图片进行标注
注意在脚本程序标注的过程中,按一下m再按n,这样才能成功将你标注的矩形框坐标保存在output.txt中
利用脚本程序把所有图片标注完了后,首先用下面这个程序对生成的output.txt文件中的内容进行一些修改
clc clear all close all fidin1=fopen('C:\Users\lenovo\Desktop\racket_dect\paizi\output.txt','r+');% 需要读取的文件 i=0; while ~feof(fidin1) tline=fgetl(fidin1);%读取一行 i=i+1; %fprintf(fidout,'%s\n',tline); newtline{i}=tline; newtline{i}=strrep(tline,'m','person');%替换的函数 end fclose(fidin1); %%重新以写的形式打开,写入覆盖原来的内容 fidin1=fopen('C:\Users\lenovo\Desktop\racket_dect\拍子\output.txt','w+'); for j=1:1:i fprintf(fidin1,'%s\r\n',newtline{j}); end fclose(fidin1); end
接下来是新建两个文件夹:
新建文件夹Annotations,将之后生成的XML文件全部放到该文件夹里。
新建文件夹ImageSets,并在ImageSets里再新建文件夹,命名为Main。
我们可以通过xml名字(或图片名),生成四个txt文件,保存在Main中。
3、利用下面这段代码将这个output文件转化成XML文件,每张图对应一个XML文件
%% %该代码可以做voc2007数据集中的xml文件, %txt文件每行格式为:000002.jpg dog 44 28 132 121 %即每行由图片名、目标类型、包围框坐标组成,空格隔开 %如果一张图片有多个目标,则格式如下:(比如两个目标) %000002.jpg dog 44 28 132 121 %000002.jpg car 50 27 140 110 %包围框坐标为左上角和右下角 %作者:小咸鱼_ %CSDN:http://blog.csdn.net/sinat_30071459 %% clc; clear; %注意修改下面四个变量 imgpath='C:\Users\Administrator\Desktop\plane_master\code\makeDataset\Images\';%图像存放文件夹 txtpath='C:\Users\Administrator\Desktop\plane_master\code\makeDataset\Images\output.txt';%txt文件 xmlpath_new='C:\Users\Administrator\Desktop\plane_master\code\makeDataset\Annotations/';%修改后的xml保存文件夹 foldername='VOC2007';%xml的folder字段名 fidin=fopen(txtpath,'r'); lastname='begin'; while ~feof(fidin) tline=fgetl(fidin); str = regexp(tline, ' ','split'); filepath=[imgpath,str{1}]; img=imread(filepath); [h,w,d]=size(img); imshow(img); rectangle('Position',[str2double(str{3}),str2double(str{4}),str2double(str{5})-str2double(str{3}),str2double(str{6})-str2double(str{4})],'LineWidth',4,'EdgeColor','r'); pause(0.1); if strcmp(str{1},lastname)%如果文件名相等,只需增加object object_node=Createnode.createElement('object'); Root.appendChild(object_node); node=Createnode.createElement('name'); node.appendChild(Createnode.createTextNode(sprintf('%s',str{2}))); object_node.appendChild(node); node=Createnode.createElement('pose'); node.appendChild(Createnode.createTextNode(sprintf('%s','Unspecified'))); object_node.appendChild(node); node=Createnode.createElement('truncated'); node.appendChild(Createnode.createTextNode(sprintf('%s','0'))); object_node.appendChild(node); node=Createnode.createElement('difficult'); node.appendChild(Createnode.createTextNode(sprintf('%s','0'))); object_node.appendChild(node); bndbox_node=Createnode.createElement('bndbox'); object_node.appendChild(bndbox_node); node=Createnode.createElement('xmin'); node.appendChild(Createnode.createTextNode(sprintf('%s',num2str(str{3})))); bndbox_node.appendChild(node); node=Createnode.createElement('ymin'); node.appendChild(Createnode.createTextNode(sprintf('%s',num2str(str{4})))); bndbox_node.appendChild(node); node=Createnode.createElement('xmax'); node.appendChild(Createnode.createTextNode(sprintf('%s',num2str(str{5})))); bndbox_node.appendChild(node); node=Createnode.createElement('ymax'); node.appendChild(Createnode.createTextNode(sprintf('%s',num2str(str{6})))); bndbox_node.appendChild(node); else %如果文件名不等,则需要新建xml copyfile(filepath, 'JPEGImages'); %先保存上一次的xml if exist('Createnode','var') tempname=lastname; tempname=strrep(tempname,'.jpg','.xml'); xmlwrite(tempname,Createnode); end Createnode=com.mathworks.xml.XMLUtils.createDocument('annotation'); Root=Createnode.getDocumentElement;%根节点 node=Createnode.createElement('folder'); node.appendChild(Createnode.createTextNode(sprintf('%s',foldername))); Root.appendChild(node); node=Createnode.createElement('filename'); node.appendChild(Createnode.createTextNode(sprintf('%s',str{1}))); Root.appendChild(node); source_node=Createnode.createElement('source'); Root.appendChild(source_node); node=Createnode.createElement('database'); node.appendChild(Createnode.createTextNode(sprintf('My Database'))); source_node.appendChild(node); node=Createnode.createElement('annotation'); node.appendChild(Createnode.createTextNode(sprintf('VOC2007'))); source_node.appendChild(node); node=Createnode.createElement('image'); node.appendChild(Createnode.createTextNode(sprintf('flickr'))); source_node.appendChild(node); node=Createnode.createElement('flickrid'); node.appendChild(Createnode.createTextNode(sprintf('NULL'))); source_node.appendChild(node); owner_node=Createnode.createElement('owner'); Root.appendChild(owner_node); node=Createnode.createElement('flickrid'); node.appendChild(Createnode.createTextNode(sprintf('NULL'))); owner_node.appendChild(node); node=Createnode.createElement('name'); node.appendChild(Createnode.createTextNode(sprintf('xiaoxianyu'))); owner_node.appendChild(node); size_node=Createnode.createElement('size'); Root.appendChild(size_node); node=Createnode.createElement('width'); node.appendChild(Createnode.createTextNode(sprintf('%s',num2str(w)))); size_node.appendChild(node); node=Createnode.createElement('height'); node.appendChild(Createnode.createTextNode(sprintf('%s',num2str(h)))); size_node.appendChild(node); node=Createnode.createElement('depth'); node.appendChild(Createnode.createTextNode(sprintf('%s',num2str(d)))); size_node.appendChild(node); node=Createnode.createElement('segmented'); node.appendChild(Createnode.createTextNode(sprintf('%s','0'))); Root.appendChild(node); object_node=Createnode.createElement('object'); Root.appendChild(object_node); node=Createnode.createElement('name'); node.appendChild(Createnode.createTextNode(sprintf('%s',str{2}))); object_node.appendChild(node); node=Createnode.createElement('pose'); node.appendChild(Createnode.createTextNode(sprintf('%s','Unspecified'))); object_node.appendChild(node); node=Createnode.createElement('truncated'); node.appendChild(Createnode.createTextNode(sprintf('%s','0'))); object_node.appendChild(node); node=Createnode.createElement('difficult'); node.appendChild(Createnode.createTextNode(sprintf('%s','0'))); object_node.appendChild(node); bndbox_node=Createnode.createElement('bndbox'); object_node.appendChild(bndbox_node); node=Createnode.createElement('xmin'); node.appendChild(Createnode.createTextNode(sprintf('%s',num2str(str{3})))); bndbox_node.appendChild(node); node=Createnode.createElement('ymin'); node.appendChild(Createnode.createTextNode(sprintf('%s',num2str(str{4})))); bndbox_node.appendChild(node); node=Createnode.createElement('xmax'); node.appendChild(Createnode.createTextNode(sprintf('%s',num2str(str{5})))); bndbox_node.appendChild(node); node=Createnode.createElement('ymax'); node.appendChild(Createnode.createTextNode(sprintf('%s',num2str(str{6})))); bndbox_node.appendChild(node); lastname=str{1}; end %处理最后一行 if feof(fidin) tempname=lastname; tempname=strrep(tempname,'.jpg','.xml'); xmlwrite(tempname,Createnode); end end fclose(fidin); file=dir(pwd); for i=1:length(file) if length(file(i).name)>=4 && strcmp(file(i).name(end-3:end),'.xml') fold=fopen(file(i).name,'r'); fnew=fopen([xmlpath_new file(i).name],'w'); line=1; while ~feof(fold) tline=fgetl(fold); if line==1 line=2; continue; end expression = ' '; replace=char(9); newStr=regexprep(tline,expression,replace); fprintf(fnew,'%s\n',newStr); end fprintf('已处理%s\n',file(i).name); fclose(fold); fclose(fnew); delete(file(i).name); end end
4、利用下面这段代码根据XML文件生成test.txt(测试集),train.txt(训练集),val.txt(验证集),trainval.txt(训练和验证集),trainval大概是整个数据集的50%,test也大概是整个数据集的50%;train大概是trainval的50%,val大概是trainval的50%。将这四个txt放在ImageSets\Main中。
function select_xml2txt() %% %该代码根据已生成的xml,制作VOC2007数据集中的trainval.txt;train.txt;test.txt和val.txt %trainval占总数据集的50%,test占总数据集的50%;train占trainval的50%,val占trainval的50%; %上面所占百分比可根据自己的数据集修改,如果数据集比较少,test和val可少一些 %% %注意修改下面四个值 xmlfilepath='C:\Users\Administrator\Desktop\plane_master\code\makeDataset\Annotations'; txtsavepath='C:\Users\Administrator\Desktop\plane_master\code\makeDataset\ImageSets\Main\'; trainval_percent=0.5;%trainval占整个数据集的百分比,剩下部分就是test所占百分比 train_percent=0.5;%train占trainval的百分比,剩下部分就是val所占百分比 %% xmlfile=dir(xmlfilepath); numOfxml=length(xmlfile)-2;%减去.和.. 总的数据集大小 trainval=sort(randperm(numOfxml,floor(numOfxml*trainval_percent))); test=sort(setdiff(1:numOfxml,trainval)); trainvalsize=length(trainval);%trainval的大小 train=sort(trainval(randperm(trainvalsize,floor(trainvalsize*train_percent)))); val=sort(setdiff(trainval,train)); ftrainval=fopen([txtsavepath 'trainval.txt'],'w'); ftest=fopen([txtsavepath 'test.txt'],'w'); ftrain=fopen([txtsavepath 'train.txt'],'w'); fval=fopen([txtsavepath 'val.txt'],'w'); for i=1:numOfxml if ismember(i,trainval) fprintf(ftrainval,'%s\r\n',xmlfile(i+2).name(1:end-4)); if ismember(i,train) fprintf(ftrain,'%s\r\n',xmlfile(i+2).name(1:end-4)); else fprintf(fval,'%s\r\n',xmlfile(i+2).name(1:end-4)); end else fprintf(ftest,'%s\r\n',xmlfile(i+2).name(1:end-4)); end end fclose(ftrainval); fclose(ftrain); fclose(fval); fclose(ftest); end
5、最后新建文件夹JPEGImages,将所有训练图片放在这个文件夹里(注意不要把output.txt也放进去)
并且用自己生成的这三个文件夹来替换voc2007数据集中的Annotations、ImageSets和JPEGImages文件夹,自己的数据集就制作完成了,之后就是修改faster-rcnn源码了。