目录
一、COCO数据集
COCO(Common Objects in Context)数据集是一个大型的、丰富的图像数据集,广泛用与计算机视觉领域,特别是目标检测、分割、姿态估计和图像标题生成等任务。COCO数据集由微软提供,旨在推动场景理解的研究。
1.COCO数据集下载
COCO数据集官网下载(需要科学上网)https://cocodataset.org/#download
COCO2014数据集_数据集-飞桨AI Studio星河社区COCO2014https://aistudio.baidu.com/datasetdetail/28191COCO2017-完整数据集_数据集-飞桨AI Studio星河社区object instances(目标实例), object keypoints(目标上的关键点), 和image captions(看图说话),使用JSON文件存储,COCO数据集共有大类12个,小类80个https://aistudio.baidu.com/datasetdetail/97273
2.COCO数据集相关介绍
COCO数据集总共有80个类,在COCO2014中训练集、验证集和测试集总共有164,063张图像。
- Person: person
- Animal:bird, cat, dog, horse, sheep, cow, elephant, bear, zebra, giraffe
- Vehicle:bicycle, car, motorbike, aeroplane, bus, train, truck, boat
- Facilities:traffic light, fire hydrant, stop sign, parking meter, bench
- Necessities:backpack, umbrella, handbag, tie, suitcase
- Sports:frisbee, skis, snowboard, sports ball, kite, baseball bat, baseball glove, skateboard, surfboard, tennis racket
- Kitchen:bottle, wine glass, cup, fork, knife,spoon, bowl
- Food:banana, apple, sandwich, orange, broccoli, carrot, hot dog, pizza, donut, cake,
- Furniture:chair, sofa, pottedplant, bed, diningtable, toilet, tvmonitor
- Electronic:laptop, mouse, remote, keyboard, cell phone
- Appliance:microwave, oven, toaster, sink, refrigerator
- Indoor:book, clock, vase, scissors, teddy bear, hair drier, toothbrush
COCO数据集下载并解压后主要有2个文件夹。
images | 包含了数据集的图片(训练集、验证集和测试集的图片) |
annotations | 包含了与图片对应的标注文件,主要是JSON格式的标注文件 |
以COCO2014为例,images中包含三个文件夹,train2014、val2014和test2014,这三个文件夹里分别代表训练集、验证集和测试集的图片,所有的图片基本上都是JPG格式。
annotation文件夹中有captions_train2014.json、captions_val2014.json、captions_test2014.json、instances_train2014.json、instances_val2014.json、instances_test2014.json、person_keypoints_train2014.json、person_keypoints_val2014.json、person_keypoints_test2014.json。这些都是标注文件,文件名后的train、val、test代表是训练集、验证集和测试集的标注文件。
Captions.json文件
Captions.json文件里的内容是对数据集的相关介绍信息,如数据集的版本号、年份、作者、数据集的许可证信息、图片的相关信息(每张图片的名称、尺寸、URL)等。
instances.json文件
instances.json文件是一个关键的标注文件,它包含了图像中实例(如物体、人等)的详细信息。
主要内容是annotations和categories。annotations包含标注信息,每个标注项代表一个目标实例的详细信息,bbox(边界框),segmentation(分割掩码)、area(实例所占据面积)、iscrowd(标注位)、category_id(类别ID)和id(标注ID)等。
- bbox:一个包含四个值的数组[x,y,w,h],表示标注对象的边界框,x和y是边界框的左上角坐标,w和h是边界框的宽度和高度。
- segmentation:实例的分割掩码(可选)。这可以是一个多边形列表,表示实例的像素级轮廓;也可以是一个二进制掩码(在某些情况下),其中每个像素都标识为前景(实例)或背景。
- iscrowd:指示实例是否是“杂乱”的,(例如,一群紧密排列的物体被视为单个实例)。在COCO数据集中,这通常用于人群等密集场景。
Person_keypoints.json文件
Person_keypoints.json文件是人体关键点检测任务的标注信息,其中主要内容是关键点标注信息,主要是annotations中的kerpoints(关键点)和bbox(边界框)。
- keypoints:一个长度为3*k的数组,集中k是关键点总数(在COCO数据集中,对于人体关键点检测任务,k通常是17)。每个关键点由三个值组成:[x,y,v],x和y是关键点的坐标值,v是可见性标志(v=0表示关键点未标注,v=1表示关键点标注了但不可见,v=2表示关键点标注了且可见)。
- bbox:一个包含四个值的数组[x,y,w,h],表示标注对象的边界框,x和y是边界框的左上角坐标,w和h是边界框的宽度和高度。
3.提取instances中的边界框信息
提取的数据量较大,需要在pycharm中设置txt文本的最大限制。
加入以下代码
idea.max.intellisense.filesize=20000
idea.max.content.load.filesize=20000
然后重启pytcharm
边界框信息提取代码如下
import json
def extract_annotation(coco_data, list_file): # 提取xml中的信息
d = {}
for annotation in coco_data['annotations']:
# 检查annotation中是否包含bbox字段(理论上应该总是包含)
if 'bbox' in annotation:
# bbox格式为[x, y, width, height],其中(x, y)是左上角坐标
bbox = annotation['bbox']
# 将提取出的bbox转成[x1,y1,x2,y2],x1和y1是左上角坐标,x2和y2是右下角坐标
bbox[2] = bbox[0] + bbox[2]
bbox[3] = bbox[1] + bbox[3]
# 将图像ID和类别ID与边界框一起存储,以便于后续处理
category_id = annotation['category_id']
bbox.append(category_id)
image_id = annotation['image_id']
if image_id not in d.keys():
d[image_id] = []
d[image_id].append(bbox) # 汇聚属于同一图片的标注信息
lines = list(d.keys())
for line in lines:
bboxes = d[line]
filename = '{:012}.jpg'.format(line)
for b in bboxes:
filename = filename + " " + ",".join([str(int(a)) for a in b])
list_file.write(filename + '\n') # 写入信息
if __name__ == "__main__":
# coco数据集版本,以COCO2014为例
coco_year = 2014
# 加载JSON文件
with open('annotations/instances_train{}.json'.format(coco_year), 'r') as f:
coco_data = json.load(f)
with open('train.txt', 'w') as g:
extract_annotation(coco_data, g)
with open('annotations/instances_val{}.json'.format(coco_year), 'r') as f:
coco_data = json.load(f)
with open('val.txt', 'w') as g:
extract_annotation(coco_data, g)
# 加载JSON文件
with open('annotations/instances_test{}.json'.format(coco_year), 'r') as f:
coco_data = json.load(f)
with open('test.txt', 'w') as g:
extract_annotation(coco_data, g)
以上代码以COCO2014数据集为例进行提取,提取的信息整理后的格式如下所示。
二、VOC数据集
VOC数据集全称Visual Object Classes(视觉对象类别)数据集,是一个广泛应用于计算机视觉领域的数据集,特别是在目标检测、图像分割和图像分类等任务中。VOC数据集最初由英国牛津大学的计算机视觉小组创建,并在PASCAL VOC挑战赛中使用,该数据包含大量的带有标注信息的图像,用于训练和评估图像识别算法。VOC数据集涵盖了多个年度的发布,每个年度都包含了训练集、验证集和测试集。
1.VOC数据集下载
VOC2007训练集验证集http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tarVOC2007测试集http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tarVOC2012训练集验证集http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar
VOC2007训练集验证集百度云资源(提取码6zg6)https://pan.baidu.com/s/1xKJwIcfAQ1nsi7CZUqqCiwVOC2007测试集百度云资源(提取码zpms)https://pan.baidu.com/s/1zDQqKRgaXjqfvGPMkSkjQg
2.VOC数据集相关介绍
VOC数据集总共有20个类,在VOC2007中训练集、验证集和测试集总共有9963张图像,包含24640个目标。
- 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
VOC2007下载并解压后有五个文件夹。
Annotations | 进行目标检测任务是的标签文件,xml格式 |
ImageSets | 存放数据集分割文件,文本格式 |
JPEGImages | 存放所有图片,jpg格式 |
SegmentationClass | 存放语义分割图片,png格式 |
SementationObject | 存放实例分割图片,png格式 |
-
Annotation文件夹
Annotation中每一个xml文件对应一张图片的标签信息,如下所示
<annotation>
<folder>VOC2007</folder>
<filename>000001.jpg</filename> #对应图片名称
<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>
<name>dog</name> #第一个目标信息,类别,坐标位置等
<pose>Left</pose>
<truncated>1</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>48</xmin>
<ymin>240</ymin>
<xmax>195</xmax>
<ymax>371</ymax>
</bndbox>
</object>
<object>
<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>
-
ImageSets文件夹
ImageSets文件夹中存放三种数据集分割文件夹(Layout,Main,Segmentation),其中Main文件夹存放的是用于分类和检测的数据集分割文件,Layout文件夹用于 person layout任务,Segmentation用于分割任务。如下图所示里面的各个文本文件中是各样本名,代表某张图片和对应的标签文件作为train或val或test。
除了数据集分割文件,在Main文件夹中还有各个类别在train或val或test中的ground truth,这个ground truth是为了方便分类任务而提供的。如下图所示,第一列代表那一个样本,即样本名,第二列只有1和-1,代表该图片是否属于该类,如areoplane_train.txt文本中的000012样本就不属于areoplane类,所以为-1,即0000012.jpg中并没有飞机目标。而000033样本就属于areoplane类,代表0000033.jpg中有飞机目标。
-
JPEGImages文件夹
JPEGImages存放所有图片(训练集、验证集、测试集),所有图片均为JPG格式。如下图所示
-
SegmentationClass文件夹
SegmentationClass文件夹是存放语义分割任务中用到的标签图片。在语义分割任务中,不同类别像素点会被标注为不同的颜色,从而实现对每个像素点的分类。
-
SegmentationObject文件夹
SegmentationObject文件夹是存放实例分割任务中用到的标签图片。在实例分割任务中,不仅要区分不同类别的对象,还需要区分同一类别的不同对象。
3.提取xml文件中的边界框信息
XML中信息读取代码如下所示
import xml.etree.ElementTree as ET
import numpy as np
# ----------------------------------------------VOC数据集中所有类-----------------------------------------------------------#
classes = ['aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable',
'dog', 'horse', 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor']
nums = np.zeros(len(classes))
def extract_annotation(year, image_id, list_file): # 提取xml中的信息
in_file = open('VOC%s/Annotations/%s.xml' % (year, image_id), encoding='utf-8')
tree = ET.parse(in_file)
root = tree.getroot()
filename = root.find('filename').text # 图片名
for obj in root.iter('object'):
cls = obj.find('name').text # 类别
difficult = 0
if obj.find('difficult') != None:
difficult = obj.find('difficult').text
if cls not in classes or int(difficult) == 1: # 不属于classes中的类或者检测难度较大的则舍弃
continue
cls_id = classes.index(cls) # 类别转成数值id
xmlbox = obj.find('bndbox') # 坐标信息
b = (int(float(xmlbox.find('xmin').text)), int(float(xmlbox.find('ymin').text)),
int(float(xmlbox.find('xmax').text)), int(float(xmlbox.find('ymax').text)))
filename = filename + " " + ",".join([str(a) for a in b]) + ',' + str(cls_id)
list_file.write(filename + '\n') # 写入信息
if __name__ == "__main__":
voc_year = 2007 # 下载的VOC数据集版本 以VOC2007为例
with open('VOC%s/ImageSets/Main/train.txt' % (voc_year)) as f: # 获得训练集的所有样本名
train_names = f.readlines()
train_names = [line.rstrip('\n') for line in train_names]
with open('VOC%s/train.txt' % (voc_year), 'w') as g: # 提取信息
for name in train_names:
extract_annotation(voc_year, name, g)
with open('VOC%s/ImageSets/Main/val.txt' % (voc_year)) as f: # 获得验证集的所有样本名
val_names = f.readlines()
val_names = [line.rstrip('\n') for line in val_names]
with open('VOC%s/val.txt' % (voc_year), 'w') as g:
for name in val_names:
extract_annotation(voc_year, name, g)
with open('VOC%s/ImageSets/Main/test.txt' % (voc_year)) as f: # 获得测试集的所有样本名
test_names = f.readlines()
test_names = [line.rstrip('\n') for line in test_names]
with open('VOC%s/test.txt' % (voc_year), 'w') as g:
for name in test_names:
extract_annotation(voc_year, name, g)
以上代码以VOC2007的数据集为例进行提取,提取的信息整理后的格式如下所示。