目标检测进阶:1.COCO数据集与VOC数据集

avatar
作者
筋斗云
阅读量:0

目录

一、COCO数据集

1.COCO数据集下载

2.COCO数据集相关介绍

Captions.json文件

instances.json文件

Person_keypoints.json文件

3.提取instances中的边界框信息

二、VOC数据集

1.VOC数据集下载

VOC2007训练集验证集百度云资源(提取码6zg6)https://pan.baidu.com/s/1xKJwIcfAQ1nsi7CZUqqCiwVOC2007测试集百度云资源(提取码zpms)https://pan.baidu.com/s/1zDQqKRgaXjqfvGPMkSkjQg

2.VOC数据集相关介绍

Annotation文件夹

ImageSets文件夹

JPEGImages文件夹

SegmentationClass文件夹

SegmentationObject文件夹

3.提取xml文件中的边界框信息


一、COCO数据集

COCO(Common Objects in Context)数据集是一个大型的、丰富的图像数据集,广泛用与计算机视觉领域,特别是目标检测、分割、姿态估计和图像标题生成等任务。COCO数据集由微软提供,旨在推动场景理解的研究。

1.COCO数据集下载

     COCO数据集官网下载(需要科学上网)icon-default.png?t=N7T8https://cocodataset.org/

COCO2014数据集_数据集-飞桨AI Studio星河社区COCO2014icon-default.png?t=N7T8https://aistudio.baidu.com/datasetdetail/28191COCO2017-完整数据集_数据集-飞桨AI Studio星河社区object instances(目标实例), object keypoints(目标上的关键点), 和image captions(看图说话),使用JSON文件存储,COCO数据集共有大类12个,小类80个icon-default.png?t=N7T8https://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训练集验证集icon-default.png?t=N7T8http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tarVOC2007测试集icon-default.png?t=N7T8http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tarVOC2012训练集验证集icon-default.png?t=N7T8http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar

VOC2007训练集验证集百度云资源(提取码6zg6)icon-default.png?t=N7T8https://pan.baidu.com/s/1xKJwIcfAQ1nsi7CZUqqCiwVOC2007测试集百度云资源(提取码zpms)icon-default.png?t=N7T8https://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的数据集为例进行提取,提取的信息整理后的格式如下所示。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!