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

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

 

VOC

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

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

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

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

<annotation>
    <folder>my_dataset</folder>
    <filename>image1.jpg</filename>
    <size>
        <width>640</width>
        <height>480</height>
        <depth>3</depth>
    </size>
    <object>
        <name>car</name>
        <bndbox>
            <xmin>100</xmin>
            <ymin>200</ymin>
            <xmax>400</xmax>
            <ymax>400</ymax>
        </bndbox>
        <difficult>0</difficult>
    </object>
    <object>
        <name>person</name>
        <bndbox>
            <xmin>50</xmin>
            <ymin>100</ymin>
            <xmax>200</xmax>
            <ymax>350</ymax>
        </bndbox>
        <difficult>0</difficult>
    </object>
</annotation>

         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
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值