一、Pascal VOC
Pascal VOC数据集是目标检测的常用的大规模数据集之一,从05年到12年都会举办比赛,比赛任务task:
- 分类Classification
- 目标检测Object Detection
- 语义分割Class Segmentation
- 实例分割Object Segmentation
- Action Classification(专注于人体动作的一种分类)
- Person Layout(专注于人体各部位的一种目标检
A. 数据集包含种类
一共包含了20类。一共包含了20类。
Person: person
Animal: bird, cat, cow, dog, horse, sheep
Vehicle: aeroplane, bicycle, boat, bus, car, motorbike, train
Indoor: bottle, chair, dining table, potted plant, sofa, tv/monitor
B. V0C2007和V0C2012的区别
VOC2007中包含9963张标注过的图片, 由train/val/test三部分组成, 共标注出24,640个物体。
对于检测任务,VOC2012的trainval/test包含08-11年的所有对应图片。 trainval有11540张图片共27450个物体
C. VOC数据集文件结构
Pascal VOC数据集 由五个部分构成:JPEGImages,Annotations,ImageSets,SegmentationClass以及SegmentationObject。
.
└── VOCdevkit #根目录
└── VOC2012 #不同年份的数据集,这里只下载了2012的,还有2007等其它年份的
├── Annotations #存放xml文件,与JPEGImages中的图片一一对应,每个xml对应JPEGImage中的一张图片描述了图片信息
├── ImageSets #该目录下存放的都是txt文件,txt文件中每一行包含一个图片的名称,末尾会加上±1表示正负样本
│ ├── Action #【Action下存放的是人的动作(例如running、jumping等等)】
│ ├── Layout # 【Layout下存放的是具有人体部位的数据】
│ ├── Main # 【Main下存放的是图像物体识别的数据,总共分为20类。】
│ └── Segmentation # 【Segmentation下存放的是可用于分割的数据】
├── JPEGImages #存放源图片
├── SegmentationClass #【存放按照 class 分割的图片,语义分割相关;目标检测不需要】
└── SegmentationObject #【存放按照 object 分割的图片,实例分割相关;目标检测不需要】
- JPEGImages:存放的是训练与测试的所有图片。
- Annotations(注释):数据集标签的存储路径,通过XML文件格式,为图像数据存储各类任务的标签。其中部分标签为目标检测的标签。里面存放的是每张图片打完标签所对应的XML文件。每一张图片文件都对应一个xml文件。
- ImageSets:ImageSets文件夹下本次讨论的只有Main文件夹,此文件夹中存放的主要又有四个文本文件test.txt、train.txt、trainval.txt、val.txt, 其中分别存放的是测试集图片的文件名、训练集图片的文件名、训练验证集图片的文件名、验证集图片的文件名。
- SegmentationClass与SegmentationObject:存放的都是图片,且都是图像分割结果图,对目标检测任务来说没有用。class segmentation 标注出每一个像素的类别
- object segmentation 标注出每一个像素属于哪一个物体。
目录如下所示
VOC
├─Annotations
│ ├─img0001.xml
│ ├─img0002.xml
│ ├─img0003.xml
│ ├─img0004.xml
│ ├─img0005.xml
│ └─img0006.xml
│
├─ImageSets
│ └─Main
│ ├─test.txt
│ ├─train.txt
│ ├─trainval.txt
│ └─val.txt
│
└─JPEGImages
├─img0001.jpg
├─img0002.jpg
├─img0003.jpg
├─img0004.jpg
├─img0005.jpg
└─img0006.jpg
D. 标注信息是用xmI文件组织
xml文件的标注格式如下:
<annotation>
<folder>VOC2007</folder> # 图片所处文件夹
<filename>000001.jpg</filename> # 图片文件名
<path>pathto/000001.jpg</path>
<source>
<database>The VOC2007 Database</database>
<annotation>PASCAL VOC2007</annotation>
<image>flickr</image>
<flickrid>341012865</flickrid>
</source>
<owner>
<flickrid>Fried Camels</flickrid>
<name>Jinky the Fruit Bat</name>
</owner>
<size> # 图像尺寸,深度
<width>353</width>
<height>500</height>
<depth>3</depth>
</size>
<segmented>0</segmented> # 是否用于分割
<object> # 标注目标 1
<name>dog</name> # 物体类别
<pose>Left</pose> # 拍摄角度:front, rear, left, right, unspecified
<truncated>1</truncated> # 目标是否被截断(比如在图片之外),或者被遮挡(超过15%)
<difficult>0</difficult> # 检测难易程度,这个主要是根据目标的大小,光照变化,图片质量来判断,虽有标注, 但一般忽略这类物体
<bndbox> # 物体的bound box
<xmin>48</xmin>
<ymin>240</ymin>
<xmax>195</xmax>
<ymax>371</ymax>
</bndbox>
</object>
<object> # 标注目标 2
<name>person</name>
<pose>Left</pose>
<truncated>1</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>8</xmin>
<ymin>12</ymin>
<xmax>352</xmax>
<ymax>498</ymax>
</bndbox>
</object>
</annotation>
二、COCO数据集
COCO数据集有91类,虽然比ImageNet和SUN类别少,但是每一类的图像多,这有利于获得更多的每类中位于某种特定场景的能力,对比PASCAL VOC,其有更多类和图像。
和VOC相比,coco数据集上小目标多,单幅图片目标多,物体大多非中心分布,更符合日常环境,所以coco检测难度更大.
COCO难度更大,因为coco数据集每张图片中的物体数目很多,所以导致相对别的数据集,该数据集检测的准确率很低
为了更好的介绍这个数据集,微软在ECCV Workshops里发表这篇文章:Microsoft COCO: Common Objects in Context。从这篇文章中,我们了解了这个数据集以scene understanding为目标,主要从复杂的日常场景中截取,图像中的目标通过精确的segmentation进行位置的标定。图像包括91类目标,328,000影像和2,500,000个label。
A. coco数据集包含类别:
80类分别为
[‘person’, ‘bicycle’, ‘car’, ‘motorcycle’, ‘airplane’, ‘bus’, ‘train’, ‘truck’, ‘boat’, ‘traffic light’, ‘fire hydrant’, ‘stop sign’, ‘parking meter’, ‘bench’, ‘bird’, ‘cat’, ‘dog’, ‘horse’, ‘sheep’, ‘cow’, ‘elephant’, ‘bear’, ‘zebra’, ‘giraffe’, ‘backpack’, ‘umbrella’, ‘handbag’, ‘tie’, ‘suitcase’, ‘frisbee’, ‘skis’, ‘snowboard’, ‘sports ball’, ‘kite’, ‘baseball bat’, ‘baseball glove’, ‘skateboard’, ‘surfboard’, ‘tennis racket’, ‘bottle’, ‘wine glass’, ‘cup’, ‘fork’, ‘knife’, ‘spoon’, ‘bowl’, ‘banana’, ‘apple’, ‘sandwich’, ‘orange’, ‘broccoli’, ‘carrot’, ‘hot dog’, ‘pizza’, ‘donut’, ‘cake’, ‘chair’, ‘couch’, ‘potted plant’, ‘bed’, ‘dining table’, ‘toilet’, ‘tv’, ‘laptop’, ‘mouse’, ‘remote’, ‘keyboard’, ‘cell phone’, ‘microwave’, ‘oven’, ‘toaster’, ‘sink’, ‘refrigerator’, ‘book’, ‘clock’, ‘vase’, ‘scissors’, ‘teddy bear’, ‘hair drier’, ‘toothbrush’]
B. COCO 数据集文件结构
COCO_ROOT #根目录
├── annotations # 存放json格式的标注
│ ├── instances_train2017.json
│ └── instances_val2017.json
└── train2017 # 存放图片文件
│ ├── 000000000001.jpg
│ ├── 000000000002.jpg
│ └── 000000000003.jpg
└── val2017
├── 000000000004.jpg
└── 000000000005.jpg
与VOC一个文件一个xml标准不同的是,COCO所有的目标框标注都是在同一个json里(instances_train2017.json 或者 instances_val2017.json)。json解析出来是字典格式
coco共有3种标注类型,这3种类型共享这些基本类型:info、image、license,使用JSON文件存储。每种类型包含了训练和验证
- object instances(目标实例): 也就是目标检测object detection 标注;
- object keypoints(目标上的关键点);
- image captions(看图说话)
json文件的标注格式如下,以Object Instance为例,这种格式的文件从头至尾按照顺序分为以下段落:
(1)images字段列表元素的长度等同于划入训练集(或者测试集)的图片的数量;
(2)annotations字段列表元素的数量等同于训练集(或者测试集)中bounding box的数量;
(3)categories字段列表元素的数量等同于类别的数量
# 整个 json 文件格式
{
"info": info, # dict
"licenses": [license], # list,内部是dict
"images": [image], # list,内部是dict
"annotations": [annotation],# list,内部是dict
"categories": [category] # list,内部是dict
}
# 上面中每个字典的结构
info{ # 数据集信息描述
"year": int, # 数据集年份
"version": str, # 数据集版本
"description": str, # 数据集描述
"contributor": str, # 数据集提供者
"url": str, # 数据集下载链接
"date_created": datetime, # 数据集创建日期
}
license{
"id": int, # int 协议id号 在images中遵循的license即1
"name": str, # str 协议名
"url": str, # str 协议链接
}
# images是一个list,存放所有图片(dict)信息。image是一个dict,存放单张图片信息
image{
"id": int, # 图片的ID编号(每张图片ID唯一)
"width": int, # 图片宽
"height": int, # 图片高
"file_name": str, # 图片名字
"license": int, # 协议
"flickr_url": str, # flick图片链接url
"coco_url": str, # coco图片链接url
"date_captured": datetime, # 数据集获取日期
}
# annotations是一个list,存放所有标注(dict)信息。annotation是一个dict,存放单个目标标注信息。
annotation{
"id": int, # 图片中每个被标记物体的id编号,目标对象ID(每个对象ID唯一),每张图片可能有多个目标
"image_id": int, # 该物体所在图片的对应ID
"category_id": int, # 被标记物体的对应类别ID编号,与categories中的ID对应
"segmentation": RLE or [polygon], # 实例分割,对象的边界点坐标[x1,y1,x2,y2,....,xn,yn]
"area": float, # 对象区域面积
"bbox": [xmin,ymin,width,height], # 目标检测,对象定位边框[x,y,w,h]
"iscrowd": 0 or 1, # 表示是否是人群/ 0 or 1 目标是否被遮盖,默认为0
}
# 类别描述
categories{
"id": int, # 类别对应的ID编号(0默认为背景)
"name": str, # 子类别名字
"supercategory": str, # 主类别名字, 类别所属的大类,如卡车和轿车都属于机动车这个class
}
三、YOLO数据集格式
标签使用txt文本进行保存。yolo的目录如下所示:
dataset
├─images
│ ├─train
│ │ ├─ flip_mirror_himg0026393.jpg
│ │ ├─ flip_mirror_himg0026394.jpg
│ │ ├─ flip_mirror_himg0026395.jpg
│ │ ├─ flip_mirror_himg0027314.jpg
│ │ ├─ flip_mirror_himg0027315.jpg
│ │ └─flip_mirror_himg0027316.jpg
│ └─val
│ ├─ flip_mirror_himg0027317.jpg
│ └─flip_mirror_himg0027318.jpg
└─labels
├─train
│ ├─ flip_mirror_aimg0025023.txt
│ ├─ flip_mirror_aimg0025024.txt
│ ├─ flip_mirror_aimg0025025.txt
│ ├─ flip_mirror_aimg0025026.txt
│ ├─ flip_mirror_aimg0025027.txt
│ └─ flip_mirror_aimg0025028.txt
└─val
├─ flip_mirror_aimg0025029.txt
└─flip_mirror_aimg0025030.txt
标签使用txt文本进行保存。
yolo标注格式如下所示:
<object-class> <x> <y> <width> <height>
例如:
0 0.412500 0.318981 0.358333 0.636111
每一行代表标注的一个目标
- 0:对象的标签索引
- x,y:目标的中心坐标,相对于图片的H和W做归一化。即x/W,y/H。
- width,height:目标(bbox)的相对宽和高,相对于图像的H和W做归一化。