VOC2007数据集解析(VOC_Visual Object Classes)

下载

首先从网站上下载VOC2007数据集下载链接

文件结构

概述

下载后的数据文件主要包含以下内容:
VOC2007数据集解析(VOC_Visual Object Classes)
由于我们是将数据用于检测,因此,我们只关注Annotation,ImageSets和JPEGImages三个文件夹。下面我们逐个分析每一个文件夹下面的内容:

JPEGImages

这个文件夹主要放置数据的原始图片,图片的文件名用00001.jpg进行命名。
VOC2007数据集解析(VOC_Visual Object Classes)

Annotations

这个文件夹放置的是对每一张图片的标注。标注使用XML文件的格式。XML是标记语言,形如HTML,详细概念参看百度。每一个XML文件对应一张图片的标注结果,我们以上图000005.jpg的标注为例进行说明。

首先该图的内容是这样的:
VOC2007数据集解析(VOC_Visual Object Classes)
这张图片对应的XML文件(000005.xml)标记结果如下:

<annotation>
    <folder>VOC2007</folder>
    <!--文件名-->
    <filename>000005.jpg</filename>.   
    <!--数据来源-->
    <source>
        <!--数据来源-->
        <database>The VOC2007 Database</database>
        <annotation>PASCAL VOC2007</annotation>
    <!--来源是flickr,一个雅虎的图像分享网站,下面是id,对于我们没有用-->
        <image>flickr</image>
        <flickrid>325991873</flickrid>
    </source>
    <!--图片的所有者,也没有用-->
    <owner>
        <flickrid>archintent louisville</flickrid>
        <name>?</name>
    </owner>
    <!--图像尺寸,宽、高、长-->
    <size>
        <width>500</width>
        <height>375</height>
        <depth>3</depth>
    </size>
    <!--是否用于分割,0表示用于,1表示不用于-->
    <segmented>0</segmented>
    <!--下面是图像中标注的物体,每一个object包含一个标准的物体-->
    <object>
        <!--物体名称,拍摄角度-->
        <name>chair</name>
        <pose>Rear</pose>
        <!--是否被裁减,0表示完整,1表示不完整-->
        <truncated>0</truncated>
        <!--是否容易识别,0表示容易,1表示困难-->
        <difficult>0</difficult>
        <!--bounding box的四个坐标-->
        <bndbox>
            <xmin>263</xmin>
            <ymin>211</ymin>
            <xmax>324</xmax>
            <ymax>339</ymax>
        </bndbox>
    </object>
    <object>
        <name>chair</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>165</xmin>
            <ymin>264</ymin>
            <xmax>253</xmax>
            <ymax>372</ymax>
        </bndbox>
    </object>
    <object>
        <name>chair</name>
        <pose>Unspecified</pose>
        <truncated>1</truncated>
        <difficult>1</difficult>
        <bndbox>
            <xmin>5</xmin>
            <ymin>244</ymin>
            <xmax>67</xmax>
            <ymax>374</ymax>
        </bndbox>
    </object>
    <object>
        <name>chair</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>241</xmin>
            <ymin>194</ymin>
            <xmax>295</xmax>
            <ymax>299</ymax>
        </bndbox>
    </object>
    <object>
        <name>chair</name>
        <pose>Unspecified</pose>
        <truncated>1</truncated>
        <difficult>1</difficult>
        <bndbox>
            <xmin>277</xmin>
            <ymin>186</ymin>
            <xmax>312</xmax>
            <ymax>220</ymax>
        </bndbox>
    </object>
</annotation>

Imagesets

VOC2007/ImageSets/Main/文件夹包含txt文件,这些文件指定哪些是图片用于哪一个类的训练还是验证,其中1表示正例,-1表示反例。
PS:暂且不知道为什么还有有一个trainval这样的文件,表示训练集和验证集一起的文件。

自定义数据集转化成VOC格式

解决JPEGSets

首先全部图片保存到JPEGSets里面,很简单。图片的命名方式采用如VOC一样。训练和验证数据混放一起。

解决Annotation文件

使用标注软件对数据手动标注,软件会自动生成图片信息的xml文件。
软件下载
密码:ayyy

软件简单介绍

我下载的是win版本,懒人,不想重新编译源代码。

  1. 导入图片
  2. 点击左侧的create Rect 创建标注框
  3. 可以创建新的Label
  4. 最后点击verifyImage进行确认,导出XML文件
    VOC2007数据集解析(VOC_Visual Object Classes)
<annotation verified="yes">
    <folder>Desktop</folder>
    <filename>20161009190557135.jpeg</filename>
    <path>C:/Users/Administrator/Desktop/20161009190557135.jpeg</path>
    <source>
        <database>Unknown</database>
    </source>
    <size>
        <width>500</width>
        <height>332</height>
        <depth>3</depth>
    </size>
    <segmented>0</segmented>
    <object>
        <name>person</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>199</xmin>
            <ymin>51</ymin>
            <xmax>287</xmax>
            <ymax>202</ymax>
        </bndbox>
    </object>
    <object>
        <name>horse</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>94</xmin>
            <ymin>100</ymin>
            <xmax>350</xmax>
            <ymax>321</ymax>
        </bndbox>
    </object>
    <object>
        <name>person</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>1</difficult>
        <bndbox>
            <xmin>377</xmin>
            <ymin>156</ymin>
            <xmax>417</xmax>
            <ymax>206</ymax>
        </bndbox>
    </object>
    <object>
        <name>person</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>1</difficult>
        <bndbox>
            <xmin>64</xmin>
            <ymin>108</ymin>
            <xmax>109</xmax>
            <ymax>172</ymax>
        </bndbox>
    </object>
</annotation>

解决Imagesets里的文件

先抄别人一份代码,然后自己修改

import os
import random

trainval_percent = 0.66
train_percent = 0.5
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('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()

转载自:https://blog.****.net/qq_33297776/article/details/79758342