【数据集转换】VOC数据集转COCO数据集·代码实现+操作步骤

这篇具有很好参考价值的文章主要介绍了【数据集转换】VOC数据集转COCO数据集·代码实现+操作步骤。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在自己的数据集上实验时,往往需要将VOC数据集转化为coco数据集,因为这种需求所以才记录这篇文章,代码出处未知,感谢开源。

在远程服务器上测试目标检测算法需要用到测试集,最常用的是coco2014/2017和voc07/12数据集。


coco数据集的地址为http://cocodataset.org/#download
voc和coco的镜像为https://pjreddie.com/projects/pascal-voc-dataset-mirror/

一、数据集格式对比

1.1 VOC数据集

VOC_ROOT     #根目录
    ├── JPEGImages         # 存放源图,(当然图片并不一定要是**.jpg格式的,只是规定文件夹名字叫JPEGImages**);
    │     ├── aaaa.jpg     
    │     ├── bbbb.jpg  
    │     └── cccc.jpg
    ├── Annotations        # 存放xml文件,VOC的标注是xml格式,与JPEGImages中的图片一一对应
    │     ├── aaaa.xml 
    │     ├── bbbb.xml 
    │     └── cccc.xml 
    └── ImageSets          
        └── Main
          ├── train.txt    # txt文件中每一行包含一个图片的名称
          └── val.txt

1.2 COCO数据集

COCO_ROOT     #根目录
    ├── annotations        # 存放json格式的标注
    │     ├── instances_train2017.json   
    │     └── instances_val2017.json
    └── train2017         # 存放图片文件
    │     ├── 000000000001.jpg 
    │     ├── 000000000002.jpg 
    │     └── 000000000003.jpg 
    └── val2017        
          ├── 000000000004.jpg 
          └── 000000000005.jpg 

1.2.3 json标注格式

VOC一个文件一个xml标注不同,COCO所有的目标框标注都是放在一个json文件中的。
这个json文件解析出来是一个字典,格式如下:

{
  "info": info, 
  "images": [image], 
  "annotations": [annotation], 
  "categories": [categories],
  "licenses": [license],
}

二、转换步骤

2.1 程序总体目录

【数据集转换】VOC数据集转COCO数据集·代码实现+操作步骤

【数据集转换】VOC数据集转COCO数据集·代码实现+操作步骤

 2.2  标签文件转换代码实现(xml文件转json格式)VOC_To_CoCo_01.py

这里需要运行三次,因为train.txt val.txt test.txt是三个文件,具体看注释

import sys
import os
import json
import xml.etree.ElementTree as ET

START_BOUNDING_BOX_ID = 0


PRE_DEFINE_CATEGORIES = {"air-hole": 1, "broken-arc": 2, "hollow-bead": 3,
                         "overlap": 4, "unfused": 5, "bite-edge": 6, "crack": 7,
                         "slag-inclusion": 8}  # 修改的地方,修改为自己的类别

# If necessary, pre-define category and its id
#  PRE_DEFINE_CATEGORIES = {"aeroplane": 1, "bicycle": 2, "bird": 3, "boat": 4,
#  "bottle":5, "bus": 6, "car": 7, "cat": 8, "chair": 9,
#  "cow": 10, "diningtable": 11, "dog": 12, "horse": 13,
#  "motorbike": 14, "person": 15, "pottedplant": 16,
#  "sheep": 17, "sofa": 18, "train": 19, "tvmonitor": 20}


def get(root, name):
    vars = root.findall(name)
    return vars


def get_and_check(root, name, length):
    vars = root.findall(name)
    if len(vars) == 0:
        raise NotImplementedError('Can not find %s in %s.' % (name, root.tag))
    if length > 0 and len(vars) != length:
        raise NotImplementedError('The size of %s is supposed to be %d, but is %d.' % (name, length, len(vars)))
    if length == 1:
        vars = vars[0]
    return vars


def get_filename_as_int(filename):
    try:
        filename = os.path.splitext(filename)[0]
        return filename
    except:
        raise NotImplementedError('Filename %s is supposed to be an integer.' % (filename))


# xml_list为xml文件存放的txt文件名    xml_dir为真实xml的存放路径    json_file为存放的json路径
def convert(xml_list, xml_dir, json_file):
    list_fp = open(xml_list, 'r')
    json_dict = {"images": [], "type": "instances", "annotations": [],
                 "categories": []}
    categories = PRE_DEFINE_CATEGORIES
    bnd_id = START_BOUNDING_BOX_ID
    for line in list_fp:
        line = line.strip()
        line = line + ".xml"
        print("Processing %s" % (line))
        xml_f = os.path.join(xml_dir, line)
        tree = ET.parse(xml_f)
        root = tree.getroot()
        path = get(root, 'path')
        if len(path) == 1:
            filename = os.path.basename(path[0].text)
        elif len(path) == 0:
            filename = get_and_check(root, 'filename', 1).text
        else:
            raise NotImplementedError('%d paths found in %s' % (len(path), line))
        ## The filename must be a number
        image_id = get_filename_as_int(filename)
        size = get_and_check(root, 'size', 1)
        width = int(get_and_check(size, 'width', 1).text)
        height = int(get_and_check(size, 'height', 1).text)
        image = {'file_name': filename, 'height': height, 'width': width,
                 'id': image_id}
        json_dict['images'].append(image)
        ## Cruuently we do not support segmentation
        #  segmented = get_and_check(root, 'segmented', 1).text
        #  assert segmented == '0'
        for obj in get(root, 'object'):
            category = get_and_check(obj, 'name', 1).text
            if category not in categories:
                new_id = len(categories)
                categories[category] = new_id
            category_id = categories[category]
            bndbox = get_and_check(obj, 'bndbox', 1)
            xmin = int(get_and_check(bndbox, 'xmin', 1).text) - 1
            ymin = int(get_and_check(bndbox, 'ymin', 1).text) - 1
            xmax = int(get_and_check(bndbox, 'xmax', 1).text)
            ymax = int(get_and_check(bndbox, 'ymax', 1).text)
            assert (xmax > xmin)
            assert (ymax > ymin)
            o_width = abs(xmax - xmin)
            o_height = abs(ymax - ymin)
            ann = {'area': o_width * o_height, 'iscrowd': 0, 'image_id':
                image_id, 'bbox': [xmin, ymin, o_width, o_height],
                   'category_id': category_id, 'id': bnd_id, 'ignore': 0,
                   'segmentation': []}
            json_dict['annotations'].append(ann)
            bnd_id = bnd_id + 1

    for cate, cid in categories.items():
        cat = {'supercategory': 'none', 'id': cid, 'name': cate}
        json_dict['categories'].append(cat)
    json_fp = open(json_file, 'w')
    json_str = json.dumps(json_dict)
    json_fp.write(json_str)
    json_fp.close()
    list_fp.close()


if __name__ == '__main__':
    # xml_list为xml文件存放的txt文件名    xml_dir为真实xml的存放路径    json_file为存放的json路径
    # xml_list = './data/VOCdevkit/ImageSets/Main/test.txt'
    # xml_list = './data/VOCdevkit/ImageSets/Main/train.txt'
    xml_list = './data/VOCdevkit/ImageSets/Main/val.txt'
    xml_dir = './data/VOCdevkit/Annotations'
    # json_dir = './data/COCO/annotations/test.json'  # 注意!!!这里test.json先要自己创建,不然
    # json_dir = './data/COCO/annotations/train.json'  # 注意!!!这里test.json先要自己创建,不然
    json_dir = './data/COCO/annotations/val.json'  # 注意!!!这里test.json先要自己创建,不然																  #程序回报权限不足
    convert(xml_list, xml_dir, json_dir)

2.3 数据集图像文件copy代码实现(复制图片数据集到coco中)VOC_To_CoCo_02.py

# VOC_To_CoCo_02.py

import os
import shutil

images_file_path = './VOCdevkit/JPEGImages/'
split_data_file_path = './VOCdevkit/ImageSets/Main/'
new_images_file_path = './output/'

if not os.path.exists(new_images_file_path + 'train'):
    os.makedirs(new_images_file_path + 'train')
if not os.path.exists(new_images_file_path + 'val'):
    os.makedirs(new_images_file_path + 'val')
if not os.path.exists(new_images_file_path + 'test'):
    os.makedirs(new_images_file_path + 'test')

dst_train_Image = new_images_file_path + 'train/'
dst_val_Image = new_images_file_path + 'val/'
dst_test_Image = new_images_file_path + 'test/'

total_txt = os.listdir(split_data_file_path)
for i in total_txt:
    name = i[:-4]
    if name == 'train':
        txt_file = open(split_data_file_path + i, 'r')
        for line in txt_file:
            line = line.strip('\n')
            line = line.strip('\r')
            srcImage = images_file_path + line + '.jpg'
            dstImage = dst_train_Image + line + '.jpg'
            shutil.copyfile(srcImage, dstImage)
        txt_file.close()
    elif name == 'val':
        txt_file = open(split_data_file_path + i, 'r')
        for line in txt_file:
            line = line.strip('\n')
            line = line.strip('\r')
            srcImage = images_file_path + line + '.jpg'
            dstImage = dst_val_Image + line + '.jpg'
            shutil.copyfile(srcImage, dstImage)
        txt_file.close()
    elif name == 'test':
        txt_file = open(split_data_file_path + i, 'r')
        for line in txt_file:
            line = line.strip('\n')
            line = line.strip('\r')
            srcImage = images_file_path + line + '.jpg'
            dstImage = dst_test_Image + line + '.jpg'
            shutil.copyfile(srcImage, dstImage)
        txt_file.close()
    else:
        print("Error, Please check the file name of folder")

三、效果展示

【数据集转换】VOC数据集转COCO数据集·代码实现+操作步骤文章来源地址https://www.toymoban.com/news/detail-444653.html

到了这里,关于【数据集转换】VOC数据集转COCO数据集·代码实现+操作步骤的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • VOC和COCO数据集讲解

    相对其他计算机视觉任务,目标检测算法的数据格式更为复杂。为了对数据进行统一的处理,目标检测数据一般都会做成 VOC 或者 COCO 的格式。 VOC 和 COCO 都是既支持检测也支持分割的数据格式,本文主要分析 PASCAL VOC 和 COCO 数据集中物体识别相关的内容,并学习如何制作自己

    2024年02月06日
    浏览(41)
  • VOC数据集格式转COCO数据集格式

            项目需要coco格式的数据集但是自己的数据集是VOC格式的该如何转换呢。 VOC格式   coco格式:  因为VOC格式的数据集中图片是放在一个文件下的,所以需要先划分训练集、验证集和测试集的比例,需要改两行文件路径和划分比例 然后 根据划分的三个TXT文件将VOC的xml转

    2024年02月05日
    浏览(26)
  • 目标检测任务中常用的数据集格式(voc、coco、yolo)

    VOC数据集(Annotation的格式是xmI) Pascal VOC数据集是目标检测的常用的大规模数据集之一,从05年到12年都会举办比赛,比赛任务task: 分类Classification 目标检测Object Detection 语义分割Class Segmentation 实例分割Object Segmentation Action Classification(专注于人体动作的一种分类) Person Layout(

    2024年02月14日
    浏览(34)
  • 伪装目标检测中数据集的标注格式:COCO和VOC

    1.OSFormer中提供的COD10K的json格式,是coco的格式,但由于伪装目标检测任务的特殊性,标注信息中还有一个segmentation段 首先将一整个json文件分解: 然后转化为VOC格式: 这样生成的xml文件,没有之前COD10K标注的segmentation信息,还需要进一步考虑,在转换为xml的脚本中加上识别

    2024年04月27日
    浏览(37)
  • 将YOLO数据集转成COCO格式,单个文件夹转为单个json文件,例如.../images/train转为instance_train.json

    参考链接 :objectdetection-tricks/tricks_4.py 相关视频教学:tricks_4 用于yolov5和v7中的yolo格式转换coco格式的脚本.(如何在v5和v7中输出ap_small,ap_middle,ap_large coco指标) 还可以参考相关的VOC转COCO的方式:damo-yolo/voc2coco.py 代码效果 :将数据集转成COCO格式, 单个文件夹 转为 单个json 文件

    2024年02月01日
    浏览(37)
  • 深度学习目标检测数据VisDrone2019(to yolo / voc / coco)---MMDetection数据篇

    配备摄像头的无人机(或通用无人机)已被快速部署到广泛的应用领域,包括农业、航空摄影、快速交付和监视。因此,从这些平台上收集的视觉数据的自动理解要求越来越高,这使得计算机视觉与无人机的关系越来越密切。我们很高兴为各种重要的计算机视觉任务展示一个大

    2024年02月04日
    浏览(35)
  • 100种目标检测数据集【voc格式yolo格式json格式coco格式】+YOLO系列算法源码及训练好的模型

    提示:本文介绍并分享了应用于 各行业 、 各领域 非常有用的 目标检测数据集 (感谢您的关注+三连, 数据集持续更新中… ),其中绝大部分数据集作者 已应用于各种实际落地项目 ,数据集 整体质量好 , 标注精确 ,数据的 多样性充分 , 训练 模型拟合较好 ,具有较高

    2023年04月09日
    浏览(36)
  • 目标检测,将voc格式转化为coco格式详细过程

    在目标检测方法研究中,数据集的格式至关重要,为了减小模型的训练时长,需要现在小数据集进行模型研究,从而需要将VOC数据集转化为coco格式。下面一步一步来看: 1. 下载VOC数据集 Pascal VOC,即Pattern Analysis, Statical Modeling and Computational Learning V isual O bject C lasses。详细可参

    2024年02月05日
    浏览(29)
  • YOLO格式数据集(.txt)如何转换为VOC格式数据集(.xml)

    前言: 安装好python环境与编译器 转换: 将标注文件从文本格式( .txt )转换为 XML 格式( .xml )可以通过以下步骤完成: 解析文本标注文件:打开 .txt 文件,逐行读取每个标注,并解析边界框坐标和类别信息。 创建 XML 文件:使用 Python 的内置库 xml.etree.ElementTree 创建一个

    2024年02月12日
    浏览(29)
  • segmentation后 mask图片数据转换成coco对应的json格式

    segmentation后 mask二值图片数据转换成coco对应的json格式 转出来之后的json数据中segmentation部分会有一些问题,它不是一个1 * n维度的数据 而是包含了很多段,需要合并 如图: 合并之前: 合并之后,所有的边缘点在一个list中: 最终转好的格式如下图: 合并代码:

    2024年02月12日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包