制作VOC数据集

一、VOC数据集长什么样
PASCAL VOC为图像识别和分类提供了一整套标准化的优秀的数据集,从2005年到2012年每年都会举行一场图像识别challenge。
本文主要分析PASCAL VOC数据集中和图像中物体识别相关的内容。
在这里采用PASCAL VOC2012作为例子。下载地址为:点击打开链接。(本文中的系统环境为ubuntu14.04)
下载完之后解压,可以在VOCdevkit目录下的VOC2012中看到如下的文件:

其中在图像物体识别上着重需要了解的是Annotations(xml图片信息)、ImageSets[challenge对应的图像数据,main存放训练测试的.txt,包括每一类图片(txt:前面的表示图像的name,后面的1代表正样本,-1代表负样本。)train.txt(数据位置)]和JPEGImages(图片)。

①JPEGImages:JPEGImages文件夹中包含了PASCAL VOC所提供的所有的图片信息,包括了训练图片和测试图片。
这些图像都是以“年份_编号.jpg”格式命名的。
图片的像素尺寸大小不一,但是横向图的尺寸大约在500*375左右,纵向图的尺寸大约在375*500左右,基本不会偏差超过100。

②Annotations:存放的是xml格式的标签文件,每一个xml文件都对应于JPEGImages文件夹中的一张图片。
xml文件的具体格式如下:(对于2007_000392.jpg)


    VOC2012                           
    2007_000392.jpg                               //文件名
                                                               //图像来源(不重要)
        The VOC2007 Database
        PASCAL VOC2007
        flickr
    
                                                   //图像尺寸(长宽以及通道数)                        
        500
        332
        3
    

    1                                   //是否用于分割(在图像物体识别中01无所谓)
                                                               //检测到的物体
        horse                                         //物体类别
        Right                                         //拍摄角度
        0                                   //是否被截断(0表示完整)
        0                                   //目标是否难以识别(0表示容易识别)
                                                           //bounding-box(包含左下角和右上角xy坐标)
            100
            96
            355
            324
        

    

                                                               //检测到多个物体
        person
        Unspecified
        0
        0
        
            198
            58
            286
            197
        

    

对应的图片为:
③ImageSets:存放的是每一种类型的challenge对应的图像数据。
在ImageSets下有四个文件夹:
Action下存放的是人的动作(例如running、jumping等等,这也是VOC challenge的一部分)
Layout下存放的是具有人体部位的数据(人的head、hand、feet等等,这也是VOC challenge的一部分)
Main下存放的是图像物体识别的数据,总共分为20类。
Segmentation下存放的是可用于分割的数据。

主要说Main文件夹
Main文件夹下包含了20个分类的***_train.txt、***_val.txt和***_trainval.txt。
这些txt中的内容都差不多如下:
前面的表示图像的name,后面的1代表正样本,-1代表负样本。
_train中存放的是训练使用的数据,每一个class的train数据都有5717个。
_val中存放的是验证结果使用的数据,每一个class的val数据都有5823个。
_trainval将上面两个进行了合并,每一个class有11540个。
需要保证的是train和val两者没有交集,也就是训练数据和验证数据不能有重复,在选取训练数据的时候 ,也应该是随机产生的。
④SegmentationClass和SegmentationObject:这两个文件夹下保存了物体分割后的图片
 

二、制作自己的数据集

存入JPEGImages文件夹——你可以直接从各种渠道下载得到所需要的图片集,存入到JPEGImages文件夹下,命名格式统一为“%6d.jpg”,(000001.jpg)

第二步:生成Main文件夹下的.txt文件——在主目录下运行以下代码既可生成test.txt、train.txt、val.txt、trainval.txt四个文件,请注意每一个path地址是否正确

# -*- coding:utf-8 -*- 
# -*- python3.5 
import os 
import random 

trainval_percent = 0.7 #可以自己设置
train_percent = 0.8    #可以自己设置

xmlfilepath = 'Annotations' #地址填自己的
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(txtsavepath+'/trainval.txt', 'w') 
ftest = open(txtsavepath+'/test.txt', 'w') 
ftrain = open(txtsavepath+'/train.txt', 'w') 
fval = open(txtsavepath+'/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() 
print('Well finshed')

运行完成,得到四个txt文件:可以打开看一看,内容就是各个图片的索引,意味着哪些图片用做训练,哪些用做测试。

③  生成.xml标签

cvs生成.xml(以Google openimage为例):点击下载代码

txt同理换一下数据就好

 


---------------------   
参考:1.https://blog.csdn.net/zhangjunbob/article/details/52769381  

             2.https://blog.csdn.net/zzZ_CMing/article/details/81131101

你可能感兴趣的:(Python,目标检测)