Pascalvoc数据集制作

用深度学习做物体检测的都离不开数据集,本文教你如何制作自己的数据集,格式为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目录里。下面是标注的例子:

Pascalvoc数据集制作_第1张图片

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数据集。

你可能感兴趣的:(Pascalvoc数据集制作)