【项目021】Pascal VOC和MSCOCO数据集简介 返回首页

作者:欧新宇(Xinyu OU)
当前版本:Release v1.0
开发平台:Paddle 2.3.2, PaddleSeg-release-2.4
运行环境:Intel Core i7-7700K CPU 4.2GHz, nVidia GeForce GTX 1080 Ti
本教案所涉及的数据集仅用于教学和交流使用,请勿用作商用。

最后更新:2022年4月10日


一、数据标注的两种方法

面向目标检测的数据标注,主要有两种方法,即2D包围框和3D包围框。

1.1 2D包围框

在这种方法中,只需要在被检测的物体周围绘制矩形框。它们用于定义对象在图像中的位置。边框可以由矩形左上角的x、y轴坐标和右下角的x、y轴坐标来确定。

Project02101BBox2D

优点和缺点:

1.2 3D包围框

类似于2D边框,3D边框还可以显示目标的深度。这种标注是通过将二维图像平面上的边界框向后投影到三维长方体来实现的。它允许系统区分三维空间中的体积和位置等特征。

Project02102BBox3D

优点和缺点:

二、标注信息的两种格式

voc格式和coco格式是目标检测数据集常用的两种数据标注格式分别来源于著名的PascalVOC数据集和MSCOCO数据集。前者使用xml定义样本的标注,每个样本都包含一个xml文件;后者使用json文件定义标注,所有样本都保存在一个json文件中。

2.1 VOC数据格式

2.1.1 VOC数据格式简介

VOC数据格式源于Pascal VOC数据集,是目标检测数据集的一种标准标注格式,被广泛使用。对于VOC格式的数据集,每个图像文件都对应一个同名的xml文件,该xml文件中标记了物体框的坐标和类别等信息,xml文件具体中字段描述如下:

<annotation>
    <folder>images</folder>              # 图像保存的路径
    <filename>road0.png</filename>       # 图像的名称(文件名)
    <size>                               # 图像的图像尺寸,包括图像宽度、图像高度、图像深度
        <width>267</width>
        <height>400</height>
        <depth>3</depth>
    </size>
    <segmented>0</segmented>
    <object>                             # 图像中每个对象的具体信息,若图像中包含多个目标,则会有多个<object>
        <name>trafficlight</name>        # 目标对象的类别
        <pose>Unspecified</pose>         # 目标对象的姿态描述(非必须字段)
        <truncated>0</truncated>
        <occluded>0</occluded>           # 目标对象是否被遮挡(非必须字段)
        <difficult>0</difficult>         # 目标对象是否是很难识别(非必须字段)
        <bndbox>                         # 目标对象的坐标,用左上角坐标和右下角坐标表示:`xmin`、`ymin`、`xmax`、`ymax`
            <xmin>98</xmin>
            <ymin>62</ymin>
            <xmax>208</xmax>
            <ymax>232</ymax>
        </bndbox>
    </object>
</annotation>

2.1.2 显示voc-xml标签样例

# xml标签样例
import os
import xml.dom.minidom

# 1.本地路径; 2. AIStudio路径
dataset_root = 'D:\\Workspace\\ExpDatasets\\Roadsign'
# dataset_root = '/home/aistudio/work/PaddleDetection/dataset/roadsign_voc/'

sample_data = os.path.join(dataset_root, 'annotations_voc', 'road650.xml')
dom = xml.dom.minidom.parse(sample_data)
print(dom.toprettyxml(indent="", newl="", encoding=None))
<?xml version="1.0" ?><annotation>
    <folder>images</folder>
    <filename>road650.png</filename>
    <size>
        <width>300</width>
        <height>400</height>
        <depth>3</depth>
    </size>
    <segmented>0</segmented>
    <object>
        <name>speedlimit</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <occluded>0</occluded>
        <difficult>0</difficult>
        <bndbox>
            <xmin>126</xmin>
            <ymin>110</ymin>
            <xmax>162</xmax>
            <ymax>147</ymax>
        </bndbox>
    </object>
</annotation>

2.2 coco数据格式

2.2.1 coco数据格式简介

coco数据格式源于微软发起的MSCOCO数据集,与VOC数据格式不同,它将所有训练图像的标注信息都存放到一个json文件中。数据以字典嵌套的形式进行存放。在json文件中,主要存放了 info, licenses, images, annotations, categories的信息:

常用的标注信息包括:

{
"images": [{                       ### 关于图像文件的信息
    "file_name": "road651.png",    # 图像的文件名
    "height": 400,                 # 图像的高度
    "width": 300,                  # 图像的宽度
    "id": 106                      # 图像的编号
}],
"type": "instances",               ### 目标对象的类型:实例
"annotations": [{                  ### 关于具体目标对象的信息
    "area": 899,                   # 目标对象的面积(像素)
    "iscrowd": 0,                  # 目标对象是否拥挤(非必须)
    "bbox": [114, 126, 31, 29],    # 目标对象边界框坐标(xmin, ymin, width, heigh)
    "category_id": 0,              # 目标对象的类别 ID
    "ignore": 0,                   # 是否忽略该目标
    "image_id": 839,               # 该目标所属图像的ID
    "id": 1,                       # 目标对象的编号
    "segmentation": []             # 分割标注(图像分割中有效)
}],
"categories": [{                   ### 关于类别的信息
        "supercategory": "none",   # 超类名称
        "id": 1,                   # 类别ID
        "name": "speedlimit"       # 类别名称
    }, {
        "supercategory": "none",
        "id": 2,
        "name": "crosswalk"
}]

2.2.2 显示coco-json标签样例

# xml标签样例
import os
import json

# 1. 数据集路径设置:本地路径; AIStudio路径
dataset_root = 'D:\\Workspace\\ExpDatasets\\Roadsign'
# dataset_root = '/home/aistudio/data/roadsign/'

coco_anno_path = os.path.join(dataset_root, 'annotations_coco', 'train.json')
with open(coco_anno_path, 'r', encoding='utf-8') as f_coco_anno:
    coco_anno = json.load(f_coco_anno)

# 2. coco标注的keys
print('字典的键(Key):', coco_anno.keys())

# 3. 查看一共多少张图
print('图像数量:', len(coco_anno['images']))

# 4. 查看一共多少个目标物体
print('标注物体数量:', len(coco_anno['annotations']))

# 5. 查看类别信息
category = json.dumps(coco_anno['categories'], indent=4, ensure_ascii=False, sort_keys=False, separators=(',', ':'))
print('物体类别:', category)

# 6. 查看一个目标物体标注信息
object0 = json.dumps(coco_anno['annotations'][0], indent=4, ensure_ascii=False, sort_keys=False, separators=(',', ':'))
print('目标物体i的标注信息:', object0)
    字典的键(Key): dict_keys(['images', 'type', 'annotations', 'categories'])
    图像数量: 701
    标注物体数量: 991
    物体类别: [
        {
            "supercategory":"none",
            "id":1,
            "name":"speedlimit"
        },
        {
            "supercategory":"none",
            "id":2,
            "name":"crosswalk"
        },
        {
            "supercategory":"none",
            "id":3,
            "name":"trafficlight"
        },
        {
            "supercategory":"none",
            "id":4,
            "name":"stop"
        }
    ]
    目标物体i的标注信息: {
        "area":899,
        "iscrowd":0,
        "bbox":[
            114,
            126,
            31,
            29
        ],
        "category_id":1,
        "ignore":0,
        "segmentation":[],
        "image_id":0,
        "id":1
    }