PASCAL VOC 2012 数据集详解

{TOC}

在目标检测中,如果对数据不了解,在数据集处理这块有时候会看得云里雾里。比如

  1. trainval 这个词到底指什么
  2. 标签中的 bbox 中的 ymax, xmax, ymin, xmin 取值范围是多少,如何计算的?
  3. 图片与标签是如何关联起来的等等

本文的目的:

  1. 明白数据集是如何组织的
  2. TensorFlow 是如何对数据做处理的。

数据集详解

在目标检测中,主要用到了 Annotations,ImageSets,JPEGImages

其中 ImageSets/Main/ 保存了具体数据集的索引,Annotations 保存了标签数据, JPEGImages 保存了图片内容。

ImageSets

ImageSets/Main/ 文件夹以 , {class}_trainval.txt {class}_val.txt 的格式命名。 train.txt val.txt 例外

包括 Action,Layout,Main,Segmentation 四个文件夹

  1. Action:存放的是人的动作(例如running、jumping等等,这也是VOC challenge的一部分)
  2. Layout:存放的是具有人体部位的数据(人的head、hand、feet等等,这也是VOC challenge的一部分
  3. Main:存放的是图像物体识别的数据,总共分为20类。
  4. Segmentation:存放的是可用于分割的数据。

ImageSets/Main/ 文件夹以 , {class}_trainval.txt {class}_val.txt 的格式命名。 train.txt val.txt 例外

aeroplane_train.txt
aeroplane_trainval.txt
aeroplane_val.txt
bicycle_train.txt
bicycle_trainval.txt
bicycle_val.txt
bird_train.txt
bird_trainval.txt
bird_val.txt
boat_train.txt
boat_trainval.txt
boat_val.txt
bottle_train.txt
bottle_trainval.txt
bottle_val.txt
bus_train.txt
bus_trainval.txt
bus_val.txt
car_train.txt
car_trainval.txt
car_val.txt
cat_train.txt
cat_trainval.txt
cat_val.txt
chair_train.txt
chair_trainval.txt
chair_val.txt
cow_train.txt
cow_trainval.txt
cow_val.txt
diningtable_train.txt
diningtable_trainval.txt
diningtable_val.txt
dog_train.txt
dog_trainval.txt
dog_val.txt
horse_train.txt
horse_trainval.txt
horse_val.txt
motorbike_train.txt
motorbike_trainval.txt
motorbike_val.txt
person_train.txt
person_trainval.txt
person_val.txt
pottedplant_train.txt
pottedplant_trainval.txt
pottedplant_val.txt
sheep_train.txt
sheep_trainval.txt
sheep_val.txt
sofa_train.txt
sofa_trainval.txt
sofa_val.txt
train.txt
train_train.txt
train_trainval.txt
train_val.txt
trainval.txt
tvmonitor_train.txt
tvmonitor_trainval.txt
tvmonitor_val.txt
val.txt
  1. {class}_train.txt 保存类别为 class 的训练集的所有索引,每一个 class 的 train 数据都有 5717 个。
  2. {class}_val.txt 保存类别为 class 的验证集的所有索引,每一个 class 的val数据都有 5823 个
  3. {class}_trainval.txt 保存类别为 class 的训练验证集的所有索引,每一个 class 的val数据都有11540 个

每个文件包含内容为

2011_003194 -1
2011_003216 -1
2011_003223 -1
2011_003230  1
2011_003236  1
2011_003238  1
2011_003246  1
2011_003247  0
2011_003253 -1
2011_003255  1
2011_003259  1
2011_003274 -1
2011_003276 -1

注:1代表正样本,-1代表负样本。

VOC2012/ImageSets/Main/train.txt 保存了所有训练集的文件名,从 VOC2012/JPEGImages/ 找到文件名对应的图片文件。VOC2012/Annotations/ 找到文件名对应的标签文件

VOC2012/ImageSets/Main/val.txt 保存了所有验证集的文件名,从 VOC2012/JPEGImages/ 找到文件名对应的图片文件。VOC2012/Annotations/ 找到文件名对应的标签文件

读取 JPEGImages 和 Annotation 文件转换为 tf 的 Example 对象,写入 {train|test}{index}_of{num_shard} 文件。每个文件写的 Example 的数量为 total_size/num_shard。(不同数据集可以适当调节 num_shard 来控制每个输出文件的大小)

Annotations

文件夹中文件以 {id}.xml (id 保存在 VOC2012/ImageSets/Main/文件夹 ) 格式命名的 xml 文件,保存如下关键信息

  1. 物体 label : name ,如下例子为 person
  2. 图片尺寸: depth, height, width
  3. 物体 bbox : bndbox 下 xmax, xmin, ymax, ymin
    <annotation>
        <filename>2009_001137.jpgfilename>
        <folder>VOC2012folder>
        <object>
            <name>personname>
            <bndbox>
                <xmax>355xmax>
                <xmin>187xmin>
                <ymax>334ymax>
                <ymin>121ymin>
            bndbox>
            <difficult>0difficult>                //目标是否难以识别(0表示容易识别)
            <occluded>0occluded>
            <pose>Unspecifiedpose>                //拍摄角度
            <truncated>0truncated>                //是否被截断(0表示完整)
        object>
        <object>
            <name>pottedplantname>
            <bndbox>
                <xmax>500xmax>
                <xmin>376xmin>
                <ymax>261ymax>
                <ymin>1ymin>
            bndbox>
            <difficult>0difficult>
            <occluded>1occluded>
            <pose>Unspecifiedpose>
            <truncated>1truncated>
        object>
        <segmented>1segmented>
        <size>
            <depth>3depth>
            <height>334height>
            <width>500width>
        size>
        <source>
            <annotation>PASCAL VOC2009annotation>
            <database>The VOC2009 Databasedatabase>
            <image>flickrimage>
        source>
    annotation>

JPEGImages

以 2009_001137.jpg 为例,解码之后获取 image_data(图片内容的二进制),height, width

数据集转换为 TF Record

以上面例子为例,最终的 TFRecord 为

TF Example 
{
'filename' : 'VOC{year}/JPEGImages/{id}.jpg'
'height' :  height
'width' :   width
'classes' : [classes.index(person), classes.index(person)]
'y_mins' : [float(121)/334, float(1)/334]  # 各个 object 的  ymin
'x_mins' : [float(187)/500, float(376)/500]
'y_maxes' : [float(334)/334, float(261)/334]
'x_maxes' : [ float(355)/500, float(500)/500]
'encoded' : '图片内容二进制'
}

其中

classes = [
    "aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat",
    "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person",
    "pottedplant", "sheep", "sofa", "train", "tvmonitor"
]

注:difficult = 1 的直接跳过,不进行处理。

以上为将一张图片及标签转为 TF Example,对于整个数据集,依次遍历数据集即可。

你可能感兴趣的:(tensorflow)