深度学习常见数据集格式解析

深度学习中常见的数据集格式(主流的目标检测网络要求的格式)主要分为VOC、COCO以及YOLO格式,但是不同的数据标注软件导出的标注格式可能不尽相同,所以我们需要了解不同数据格式的特点以及如何互相转化。

 

VOC

        VOC(Visual Object Classes)是一个流行的计算机视觉数据集,用于目标检测、图像分类和语义分割等任务。 VOC 数据集包含了多个类别的物体,如人、汽车、动物等,每个物体类别都有其对应的标注信息。

        VOC 数据集格式通常由两部分组成:图像和标注文件。图像部分是一些图片文件,可以是JPEG、PNG等格式。标注部分是一个 XML 文件,它包含了所有图像中出现的物体类别、位置和其他信息。

        在 VOC 数据集中,每个图像文件都有一个唯一的标识符。对于每个图像,标注文件都包含一个 根元素,其下有多个子元素。其中, 指定了图像所在的文件夹, 指定了图像文件的名称。 元素描述了图像的尺寸,包括宽度和高度。 元素指定了每个物体的类别、位置和其他信息,包括 等。

一个 VOC 数据集的标注文件可以看作如下格式:


    my_dataset
    image1.jpg
    
        640
        480
        3
    
    
        car
        
            100
            200
            400
            400
        
        0
    
    
        person
        
            50
            100
            200
            350
        
        0
    

         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格式

        COCO(Common Objects in Context)是一个广泛使用的计算机视觉数据集,用于目标检测、图像分割、姿态估计等任务。COCO 数据集包含了超过 80 个类别的物体,如人、动物、交通工具等,每个物体类别都有其对应的标注信息。

        COCO 数据集格式通常由两部分组成:图像和注释文件。图像部分是一些图片文件,可以是JPEG格式。注释部分是一个 JSON 文件,它包含了所有图像中出现的物体类别、位置和其他信息。

        在 COCO 数据集中,每个图像文件都有一个唯一的标识符。对于每个图像,注释文件都包含一个 images 字段,其中包括了图像的文件名、宽度和高度等信息。注释文件还包括一个 annotations 字段,其中包括了每个物体的类别、位置和其他信息,包括 idimage_idcategory_idbboxareaiscrowd 等。

        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'])

深度学习常见数据集格式解析_第1张图片

你可能感兴趣的:(深度学习,人工智能)