深度学习中常见的数据集格式(主流的目标检测网络要求的格式)主要分为VOC、COCO以及YOLO格式,但是不同的数据标注软件导出的标注格式可能不尽相同,所以我们需要了解不同数据格式的特点以及如何互相转化。
VOC(Visual Object Classes)是一个流行的计算机视觉数据集,用于目标检测、图像分类和语义分割等任务。 VOC 数据集包含了多个类别的物体,如人、汽车、动物等,每个物体类别都有其对应的标注信息。
VOC 数据集格式通常由两部分组成:图像和标注文件。图像部分是一些图片文件,可以是JPEG、PNG等格式。标注部分是一个 XML 文件,它包含了所有图像中出现的物体类别、位置和其他信息。
在 VOC 数据集中,每个图像文件都有一个唯一的标识符。对于每个图像,标注文件都包含一个
根元素,其下有多个子元素。其中,
指定了图像所在的文件夹,
指定了图像文件的名称。
元素描述了图像的尺寸,包括宽度和高度。 元素指定了每个物体的类别、位置和其他信息,包括
、
和
等。
一个 VOC 数据集的标注文件可以看作如下格式:
my_dataset
image1.jpg
640
480
3
VOC数据集目录如下:
|dataset # 根目录
| |--- JPEGImages # 存放源图片
| | |--- aaa.jpg
| | |--- bbb.jpg
| | |--- ccc.jpg
| |--- Annotations # 存放xml文件,与JPEGImages中的图片一一对应
| | |--- aaa.xml
| | |--- bbb.xml
| | |--- ccc.xml
| |--- ImageSets
| | |--- Main
| | | |--- train.txt # txt文件中每一行包含一个图片名称
| | | |--- val.txt
解析xml文件可使用如下代码:
from xml.etree.ElementTree as ET
def parse_path(xml_path):
# 读取xml
tree = ET.parse(xml_path)
# 获取根节点
root = tree.getroot()
# 读取图片名
image_name = root.find('filename').text
# 获取图片尺寸(宽、高)
size = root.find('size')
w = int(size.find('width').text)
h = int(size.find('height').text)
bboxes = []
# 遍历每一个`object`, 读取box框
for obj in root.findall('object'):
name = obj.find('name').text
bnd_box = obj.find('bndbox')
bbox = [
int(bnd_box.find('xmin').text),
int(bnd_box.find('ymin').text),
int(bnd_box.find('xmax').text),
int(bnd_box.find('ymax').text),
labels[name]]
bboxes.append(bbox)
return image_name, bboxes
COCO(Common Objects in Context)是一个广泛使用的计算机视觉数据集,用于目标检测、图像分割、姿态估计等任务。COCO 数据集包含了超过 80 个类别的物体,如人、动物、交通工具等,每个物体类别都有其对应的标注信息。
COCO 数据集格式通常由两部分组成:图像和注释文件。图像部分是一些图片文件,可以是JPEG格式。注释部分是一个 JSON 文件,它包含了所有图像中出现的物体类别、位置和其他信息。
在 COCO 数据集中,每个图像文件都有一个唯一的标识符。对于每个图像,注释文件都包含一个 images
字段,其中包括了图像的文件名、宽度和高度等信息。注释文件还包括一个 annotations
字段,其中包括了每个物体的类别、位置和其他信息,包括 id
、image_id
、category_id
、bbox
、area
和 iscrowd
等。
COCO数据集目录如下:其中train2017、val2017分别存放训练集和验证集中的图片,annotations/中存放json格式的标注文件,分别对应训练集和验证集。
|dataset
| |--- annotations
| | |--- instances_train2017.json
| | |--- instances_val2017.json
| |--- train2017
| | |--- 1.jpg
| | |--- 2.jpg
| |--- val2017
| | |---3.jpg
| | |---4.jpg
一个 COCO 数据集的注释文件可以看作如下格式:
{
"images": [
{
"id": 1,
"width": 640,
"height": 480,
"file_name": "image1.jpg"
},
{
"id": 2,
"width": 800,
"height": 600,
"file_name": "image2.jpg"
}
],
"annotations": [
{
"id": 1,
"image_id": 1,
"category_id": 1,
"bbox": [100, 200, 300, 200],
"area": 60000,
"iscrowd": 0
},
{
"id": 2,
"image_id": 1,
"category_id": 2,
"bbox": [50, 100, 150, 250],
"area": 37500,
"iscrowd": 0
},
{
"id": 3,
"image_id": 2,
"category_id": 3,
"bbox": [200, 150, 400, 300],
"area": 120000,
"iscrowd": 0
}
],
"categories": [
{"id": 1, "name": "person"},
{"id": 2, "name": "car"},
{"id": 3, "name": "dog"}
]
}
解析json文件可参考如下代码:
annotation = {}
with open('sheep.json', 'r') as f:
data = json.load(f)
w = int(data['width'])
h = int(data['height'])
bboxes = []
labels = []
for i in range(len(data['step_1']['result'])):
box_info = data['step_1']['result'][i]
bbox = [
int(data['step_1']['result'][i]['x']),
int(data['step_1']['result'][i]['y']),
int(data['step_1']['result'][i]['width']),
int(data['step_1']['result'][i]['height'])
]
bboxes.append(bbox)
labels.append(data['step_1']['result'][i]['attribute'])