用深度学习做物体检测的都离不开数据集,本文教你如何制作自己的数据集,格式为Pascalvoc。整个流程如下。
1.首先下载数据集制作工具Label-Image。下载地址为:https://tzutalin.github.io/labelImg/
使用方法非常简单,网上各种教程。
2.建立Pascalvoc目录结构,在指定目录下建立Annatations、ImageSets、JPEGImages三个文件夹即可。在ImageSets目录下建立Main文件夹。目录结构如下:
./
Annatations
ImageSets
Main
JPEGImages
3.由于Pascalvoc图像命名格式为000001.jpg,因此你需要把你的图像也按照这种排序规则命名。这里提供一份python程序:
# -*- coding:utf8 -*-
import os
import sys
class BatchRename():
'''''
批量重命名文件夹中的图片文件
'''
def __init__(self):
#给定目标目录
self.path = './JPEGImages'
def rename(self):
filelist = os.listdir(self.path)
total_num = len(filelist)
i = 1
n = 6
for item in filelist:
if item.endswith('.jpg'):
n = 6 - len(str(i))
src = os.path.join(os.path.abspath(self.path), item)
dst = os.path.join(os.path.abspath(self.path), str(0)*n + str(i) + '.jpg')
try:
os.rename(src, dst)
#print ('converting %s to %s ...' % (src, dst) )
i = i + 1
except:
continue
if __name__ == '__main__':
demo = BatchRename()
demo.rename()
4.用Label-Image工具依次对./JPEGImages文件夹中的所有图像进行标注,每一张图像都会生成对应的xxx.xml文件,将所有的xml文件放在Annatations目录里。下面是标注的例子:
5.最后划分训练样本,测试样本,验证样本。
Matlab版代码如下:
%%
%该代码根据已生成的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.6;%trainval占整个数据集的百分比,剩下部分就是test所占百分比
train_percent=0.6;%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);
Python版代码如下:
# -*- coding:utf8 -*-
import os
import random
trainval_percent = 0.66
train_percent = 0.5
xmlfilepath = 'Annatations'
txtsavepath = 'ImageSets\Main'
total_xml = os.listdir(xmlfilepath)
num=len(total_xml)
list=range(num)
tv=int(num*trainval_percent)
tr=int(tv*train_percent)
trainval= random.sample(list,tv)
train=random.sample(trainval,tr)
ftrainval = open('ImageSets/Main/trainval.txt', 'w')
ftest = open('ImageSets/Main/test.txt', 'w')
ftrain = open('ImageSets/Main/train.txt', 'w')
fval = open('ImageSets/Main/val.txt', 'w')
for i in list:
name=total_xml[i][:-4]+'\n'
if i in trainval:
ftrainval.write(name)
if i in train:
ftrain.write(name)
else:
fval.write(name)
else:
ftest.write(name)
ftrainval.close()
ftrain.close()
fval.close()
ftest .close()
下一篇将会介绍如何用Tensorflow-SSD算法训练自己制作的Pascalvoc数据集。