解析PASCAL VOC和COCO格式数据集结构

PASCAL VOCCOCO都是既支持检测也支持分割的数据格式,本文主要分析PASCAL VOCCOCO`数据集中目标识别相关的内容

PASCAL VOC格式

目录结构

VOC格式数据集一般有着如下的目录结构:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
VOC_ROOT     #根目录
    ├── JPEGImages         # 存放源图片
         ├── aaaa.jpg     
         ├── bbbb.jpg  
         └── cccc.jpg
    ├── Annotations        # 存放xml文件,与JPEGImages中的图片一一对应,解释图片的内容等等
         ├── aaaa.xml 
         ├── bbbb.xml 
         └── cccc.xml 
    └── ImageSets          
        └── Main
          ├── train.txt    # txt文件中每一行包含一个图片的名称
          └── val.txt

其中JPEGImages目录中存放的是源图片的数据,(当然图片并不一定要是.jpg格式的,只是规定文件夹名字叫JPEGImages);   Annotations目录中存放的是标注数据,VOC的标注是xml格式的,文件名与JPEGImages中的图片一一对应;   ImageSets/Main目录中存放的是训练和验证时的文件列表,每行一个文件名(不包含扩展名),例如train.txt是下面这种格式的:

1
2
3
4
# train.txt
aaaa
bbbb
cccc

XML标注格式

xml格式的标注格式如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<annotation>
    <folder>VOC_ROOT</folder>                           
    <filename>aaaa.jpg</filename>  # 文件名
    <size>                         # 图像尺寸(长宽以及通道数)                      
        <width>500</width>
        <height>332</height>
        <depth>3</depth>
    </size>
    <segmented>1</segmented>       # 是否用于分割(在图像物体识别中无所谓)
    <object>                       # 检测到的物体
        <name>horse</name>         # 物体类别
        <pose>Unspecified</pose>   # 拍摄角度,如果是自己的数据集就Unspecified
        <truncated>0</truncated>   # 是否被截断(0表示完整)
        <difficult>0</difficult>   # 目标是否难以识别(0表示容易识别)
        <bndbox>                   # bounding-box(包含左下角和右上角xy坐标)
            <xmin>100</xmin>
            <ymin>96</ymin>
            <xmax>355</xmax>
            <ymax>324</ymax>
        </bndbox>
    </object>
    <object>                       # 检测到多个物体
        <name>person</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>198</xmin>
            <ymin>58</ymin>
            <xmax>286</xmax>
            <ymax>197</ymax>
        </bndbox>
    </object>
</annotation>

COCO格式

目录结构

COCO格式数据集的目录结构如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
COCO_ROOT     #根目录
    ├── annotations        # 存放json格式的标注
         ├── instances_train2017.json   
         └── instances_val2017.json
    └── train2017         # 存放图片文件
         ├── 000000000001.jpg 
         ├── 000000000002.jpg 
         └── 000000000003.jpg 
    └── val2017        
          ├── 000000000004.jpg 
          └── 000000000005.jpg

这里的train2017val2017称为set_nameannnotations文件夹中的json格式的标注文件名要与之对应并以instances_开头,也就是instances_{setname}.json

json标注格式

VOC一个文件一个xml标注不同,COCO所有的目标框标注都是放在一个json文件中的。 这个json文件解析出来是一个字典,格式如下:

1
2
3
4
5
6
7
{
  "info": info, 
  "images": [image], 
  "annotations": [annotation], 
  "categories": [categories],
  "licenses": [license],
}

制作自己的数据集的时候infolicenses是不需要的。只需要中间的三个字段即可。

其中images是一个字典的列表,每个图片的格式如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# json['images'][0]
{
  'license': 4,
  'file_name': '000000397133.jpg',
  'coco_url': 'http://images.cocodataset.org/val2017/000000397133.jpg',
  'height': 427,
  'width': 640,
  'date_captured': '2013-11-14 17:02:52',
  'flickr_url': 'http://farm7.staticflickr.com/6116/6255196340_da26cf2c9e_z.jpg',
  'id': 397133}

自己的数据集只需要写file_name,height,widthid即可。id是图片的编号,在annotations中也要用到,每张图是唯一的。

categories表示所有的类别,格式如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[
  {'supercategory': 'person', 'id': 1, 'name': 'person'},
  {'supercategory': 'vehicle', 'id': 2, 'name': 'bicycle'},
  {'supercategory': 'vehicle', 'id': 3, 'name': 'car'},
  {'supercategory': 'vehicle', 'id': 4, 'name': 'motorcycle'},
  {'supercategory': 'vehicle', 'id': 5, 'name': 'airplane'},
  {'supercategory': 'vehicle', 'id': 6, 'name': 'bus'},
  {'supercategory': 'vehicle', 'id': 7, 'name': 'train'},
  {'supercategory': 'vehicle', 'id': 8, 'name': 'truck'},
  {'supercategory': 'vehicle', 'id': 9, 'name': 'boat'}
  # ....
]

annotations是检测框的标注,一个bounding box的格式如下:

1
2
3
4
5
6
7
{'segmentation': [[0, 0, 60, 0, 60, 40, 0, 40]],
 'area': 240.000,
 'iscrowd': 0,
 'image_id': 289343,
 'bbox': [0., 0., 60., 40.],
 'category_id': 18,
 'id': 1768}

其中segmentation是分割的多边形,如果不知道直接填写[[x1, y1, x2, y1, x2, y2, x1, y2]]就可以了,area是分割的面积,bbox是检测框的[x, y, w, h]坐标,category_id是类别id,与categories中对应,image_id图像的id,idbboxid,每个检测框是唯一的。

See Also