|
在使用各种深度网络的时候,需要根据自己的需求,自己的数据fine-tuning自己的模型,首要的一步就是讲自己的数据制作成标准VOC数据集,本文记录自己利用matlab制作标准VOC数据集的方法。
1、将自己的图片数据规范命名
VOC标准数据集中图片名称都为“000001.jpg”…”000013.jpg”…都为6位数字,jpg格式。
根据以下代码将自己图片规范命名:
%假设图片放置于"images\"下,需要将其规范命名到"image-convert\"下
imgs = dir([
for i = 1:length(imgs)
imgPath = [
img = imread(imgPath);
imgPathTrans = [
imwrite(img,imgPathTrans);
end
生成的图片名称:

2、在图片中标注目标
这个部分代码写的很粗糙,只够满足当时需求
imgs = dir(['img-convert\','*.jpg']);
len = length(imgs);
fid = fopen('groundtruth.txt','w');
for i = 1:len
imagename = imgs(i).name;
image = imread(['img-convert\',imagename]);
while 1
[img,rect] = imcrop(image);
rect = round(rect);
label = input('please input lable:','s');
fprintf(fid,'%s %s %d %d %d %d\n',imagename,label,rect(1),rect(2),rect(1)+rect(3),rect(2)+rect(4));
isEnd = input('is this picture select over?','s');
if isEnd=='s'
break;
end
end
end
fclose(fid);
生成的文件格式:

3、利用groundtruth文件生成XML文件
到这一步,可以开始构建标准VOC的文件夹了,文件夹形式如下:
其中Annotations、ImageSets和JPEGImages是VOC数据集格式。
然后利用网上查到的代码,下载地址:将txt转成VOC标准数据集XML
利用此代码可以根据groundtruth文件生成标准XML文件:
每个图片会在Annotations下生成一个XML文件,如图:
于此同时,这个过程会把img-convert里的图片拷贝到JPEGImages文件夹下。
4、生成训练、验证数据集配置文件
这一步也是从网上找到的代码,将已有的样本分配为训练集和验证集,代码如下:
%%
%该代码根据已生成的xml,制作VOC2007数据集中的trainval.txt;train.txt;test.txt和val.txt
%trainval占总数据集的50%,test占总数据集的50%;train占trainval的50%,val占trainval的50%;
%上面所占百分比可根据自己的数据集修改,如果数据集比较少,test和val可少一些
%%
%注意修改下面四个值
xmlfilepath='Annotations';
txtsavepath='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\n',xmlfile(i+2).name(1:end-4));
if ismember(i,train)
fprintf(ftrain,'%s\n',xmlfile(i+2).name(1:end-4));
else
fprintf(fval,'%s\n',xmlfile(i+2).name(1:end-4));
end
else
fprintf(ftest,'%s\n',xmlfile(i+2).name(1:end-4));
end
end
fclose(ftrainval);
fclose(ftrain);
fclose(fval);
fclose(ftest);
将生成的四个文件放置在ImageSets\Main 文件夹下,即完成标准VOC数据集的制作。 |