bdd100k数据标签格式转到VOC2007格式

2023-05-16

需要修改的部分:

1、BDD_FOLDER:修改成自己的bdd数据集root路径

2、如果训练的为 traffic light 类,且类别为[‘red’,‘green’,‘yellow’,‘none’],这些属性属于
label[‘attributes’][“trafficLightColor”],而不属于大类label[‘category’]
因此,如果要训练大类,例如训练’traffic light’类,而不是细分的[‘red’,‘green’,‘yellow’,‘none’],则需修改.

59行把traffic light改为自己要训练的类
注释63行
解注释72行
注释73行
解注释77行
注释78

3、训练细分类

59行把traffic light改为自己要训练的类
63行把trafficLightColor改成自己大类下面的细分属性

转换代码如下, 此处的代码的只把 traffic light 类转换, 不区别red, green, yellow等:

import os
import os.path as osp

import json
import shutil

from xml.etree.ElementTree import Element, SubElement
from xml.etree import ElementTree
from xml.dom import minidom
from PIL import Image
from tqdm import tqdm

DEBUG = False

# bdd100k数据的根目录
BDD_FOLDER = "/home/wsy/data/06_dataset_transform/01_trafficlight/bdd100k_kaggle"
# 保存转换后筛选出的VOC的图片目录
img_dir = "/home/wsy/data/06_dataset_transform/01_trafficlight/bdd100ktovoc2007/images"

if DEBUG:
    XML_PATH = "./xml"
else:
    # 保存转换后筛选出的VOC的标签目录
    XML_PATH = "/home/wsy/data/06_dataset_transform/01_trafficlight/bdd100ktovoc2007/xml"

def mkr(path):
    if os.path.exists(path):
        shutil.rmtree(path)
        os.mkdir(path)
    else:
        os.makedirs(path, exist_ok=True)     # os.makedirs() 递归创建文件夹

def bdd_to_voc(bdd_folder, xml_folder):
    image_path = bdd_folder + "/images/100k/%s"
    label_path = bdd_folder + "/labels/bdd100k_labels_images_%s.json"

    classes = set()

    for trainval in ['train', 'val']:
        image_folder = image_path % trainval
        json_path = label_path % trainval
        xml_folder_ = osp.join(xml_folder, trainval)

        mkr(osp.join(img_dir, trainval))  # 创建筛选出要保存的图片的文件夹

        if not os.path.exists(xml_folder_):
            os.makedirs(xml_folder_)

        with open(json_path) as f:
            j = f.read()
        data = json.loads(j)
        for datum in tqdm(data):
            tmp_list = []
            annotation = Element('annotation')
            SubElement(annotation, 'folder').text ='VOC2007'
            SubElement(annotation, 'filename').text = datum['name']
            source = get_source()
            owner = get_owner()
            annotation.append(source)
            annotation.append(owner)
            size = get_size(osp.join(image_folder, datum['name']))
            annotation.append(size)
            SubElement(annotation, 'segmented').text ='0'
            # additional information
            #for key, item in datum['attributes'].items():
            #    SubElement(annotation, key).text = item

            # bounding box
            for label in datum['labels']:
                if label['category'] != "traffic light":
                    continue
                else:
                    tmp_list.append(1)
                # color = label['attributes']["trafficLightColor"]
                try:
                    box2d = label['box2d']
                except KeyError:
                    continue
                else:
                    bndbox = get_bbox(box2d)

                object_ = Element('object')
                SubElement(object_, 'name').text = label['category']
                # SubElement(object_, 'name').text = color
                SubElement(object_, 'pose').text = "Unspecified"
                SubElement(object_, 'truncated').text = '0'
                SubElement(object_, 'difficult').text = '0'
                classes.add(label['category'])
                # classes.add(color)

                object_.append(bndbox)
                annotation.append(object_)
            if len(tmp_list) == 0:
                continue
            xml_filename = osp.splitext(datum['name'])[0] + '.xml'
            with open(osp.join(xml_folder_, xml_filename), 'w') as f:
                f.write(prettify(annotation))
            # save selects image to another folder.
            img_path = osp.join(image_folder, osp.splitext(datum['name'])[0] + '.jpg')
            dst_imgpath = osp.join(img_dir, trainval)
            shutil.copy(img_path, dst_imgpath)
    print("all of classes are ", classes)

def get_owner():
    owner = Element('owner')
    SubElement(owner, 'flickrid').text ='NULL'
    SubElement(owner, 'name').text ='lijing'
    return owner

def get_source():
    source = Element('source')
    SubElement(source, 'database').text ='voc_bdd'
    SubElement(source, 'annotation').text ='VOC2007'
    SubElement(source, 'image').text ='flickr'
    SubElement(source, 'flickrid').text ='NULL'
    return source




def get_size(image_path):
    i = Image.open(image_path)
    sz = Element('size')
    SubElement(sz, 'width').text = str(i.width)
    SubElement(sz, 'height').text = str(i.height)
    SubElement(sz, 'depth').text = str(3)
    return sz


def get_bbox(box2d):
    bndbox = Element('bndbox')
    SubElement(bndbox, 'xmin').text = str(int(round(box2d['x1'])))
    SubElement(bndbox, 'ymin').text = str(int(round(box2d['y1'])))
    SubElement(bndbox, 'xmax').text = str(int(round(box2d['x2'])))
    SubElement(bndbox, 'ymax').text = str(int(round(box2d['y2'])))
    return bndbox


def prettify(elem):
    rough_string = ElementTree.tostring(elem, 'utf-8')
    reparsed = minidom.parseString(rough_string)
    return reparsed.toprettyxml(indent="\t")


if __name__ == "__main__":
    bdd_to_voc(BDD_FOLDER, XML_PATH)

成功运行后会生成:
XML_PATH目录,在该目录下有,xml文件的train和val两个目录,里面存放的为VOC数据集所需xml注释文件。
img_dir目录下, 会有筛选出的与xml文件对应的train和val图片.

借鉴文章: https://blog.csdn.net/l297969586/article/details/89248108

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

bdd100k数据标签格式转到VOC2007格式 的相关文章

  • 完整的前端项目开发流程

    一个项目从一开始的计划到最后的上线 大概要经过以下的流程 产品设计原型审评项目分工项目开发项目测试项目构建项目上线 1产品设计 主要负责人 产品经理 产品经理前期负责收集销售 客户 领导的零散需求 然后做需求分析 完成产品设计 需求分析 需
  • debian11 sid

    编辑 etc apt sources list xff0c 增加下面二行 xff1a deb http ftp us debian org debian sid main contrib non free deb src http ftp
  • 单片机学习——定时器/计数器

    单片机必学系列 单片机学习 中断系统 单片机学习 存储器详解 xff08 程序存储器 片内RAM 拓展RAM EEPROM xff09 单片机学习 定时器 计数器 单片机学习 A D转换 更新ing 单片机学习 定时器 计数器 单片机必学系
  • ros bag包转mp4视频

    先在 rosbag2video py 脚本中修改相关配置参数 或者在终端命令改也行 如果使用脚本里的默认参数 则可直接运行 python rosbag2video py 2022 02 02 10 41 38 bag 代码如下 span c
  • 零基础入门Jetson Nano——通过OpenCV调用CSI和USB摄像头

    Jetson Nano学习 摄像头调用 前言一 CSI摄像头的调用1 安装v4l2 utils协助工具2 查看摄像头挂载情况3 查看挂载的摄像头详细参数情况4 检测摄像头能否正常工作5 使用OpenCV调用CSI摄像头方式一 利用Gstre
  • HTML搜索框的制作过程

    1 搜索框的构成 input标签和button标签我的理解应该就类似于行内块元素 xff0c 可以设置宽高 xff0c 但同时又不独占一行placeholder 占位文本 就是输入框一开始默认显示的文本 span class token t
  • Linux

    Linux 文件管理创建目录创建文件复制剪切 重命名删除归档 xff08 解压 压缩 xff09 文件查看帮助文档查看信息文件显示当前工作目录切换目录请屏显示文件内容文件内容搜索文件搜索链接文件搜索命令所在位置 Linux系统查看进程终止进
  • isalpha()库函数

    C C 43 43 isalpha 库函数 isalpha 函数用来检测一个字符是否是字母 xff0c 包括大写字母和小写字母 头文件 xff1a 属于ctype h头文件 xff1b 但也包含在iostream头文件下 语法原型 xff1
  • 计算机网络(谢希仁-第八版)第四章习题全解

    4 01 网络层向上提供的服务有哪两种 xff1f 试比较其优缺点 xff1f 虚电路服务和数据报服务 虚电路 优点 xff1a 1 可以提供可靠的通信服务 2 因为数据是沿着建立的虚电路进行传输的 xff0c 因此分组的首部不需要携带完整
  • Linux下线程池(ThreadPool)

    目录 一 线程池相关概念及其优点 二 线程池的实现 一 线程池相关概念及其优点 线程池一种线程使用模式 xff0c 线程过多会带来这个调度的开销进而影响整体的性能 xff0c 而线程池是提前准备好了线程等待着管理者进行分配任务 1 线程池的
  • Golang协程常见面试题

    协程面试题 交替打印奇数和偶数N个协程打印1到maxVal交替打印字符和数字交替打印字符串三个协程打印ABCChannel练习 交替打印奇数和偶数 下面让我们一起来看看golang当中常见的算法面试题 使用两个goroutine交替打印1
  • JS 几种常见的遍历方式

    JS 几种常见的遍历方式 目录 JS 几种常见的遍历方式for循环for in 循环for of 循环forEach循环map方法参考资料 for循环 普通的写法let arr 61 1 2 3 for let i 61 0 i lt ar
  • mp4 转 jpg 图片

    先在 rosbag2video py 脚本中修改相关配置参数 然后运行脚本 python mp4 2 jpg py 代码如下 span class token keyword import span span class token mod

随机推荐