BDD100K数据集json格式转txt格式

BDD数据集地址:Profileicon-default.png?t=N2N8https://bdd-data.berkeley.edu/portal.html#download

目前网上能找到的BDD数据集json格式转txt格式的代码和目前BDD提供的json文件的格式有所不同。之前提供的json是每张图片一个json文件,现在是将数据集中所有的分割信息放到了一个json文件中了,所以查了很多都不适用,所以自己动手写了一个,供大家参考。

所适用的json格式在下面,能看懂吧

{
    "frames":[
        {
            "name":xxx,
            "url":xxx,
            ...
            "labels":[
                {
                    "id":xxx,
                    "index":xxx,
                    "category":xxx,
                    "box2d":{
                    "x1": 447.0,
                    "y1": 392.0,
                    "x2": 524.0,
                    "y2": 420.0
                },
                "box3d":xxx,
                "xxx":xxx
                },
                {
                    "id":xxx,
                    "index":xxx,
                    "category":xxx,
                    "box2d":{
                    "x1": 447.0,
                    "y1": 392.0,
                    "x2": 524.0,
                    "y2": 420.0
                },
                "box3d":xxx,
                "xxx":xxx
                }
            ]
        }
    ]
}

转换python代码

import os
import json

class BDD_to_YOLOv5:
    def __init__(self):
        # 转换后需要写入的目录
        self.writepath = "/Users/xxx/Desktop/postgraduate/data/BDD_txt/val/"
        # 设定yolo要求的种类
        self.bdd100k_width_ratio = 1.0/1280
        self.bdd100k_height_ratio = 1.0/720
        # 定义自己需要的数据名称以及代码
        self.select_categorys = ["person", "rider", "car", "bus", "truck", "bike", "motor", "train"]
        self.categorys_nums = {
            "person": 0,
            "rider": 1,
            "car": 2,
            "bus": 3,
            "truck": 4,
            "bike": 5,
            "motor": 6,
            "train": 7
        }
    # 转换方法
    def bdd_to_yolov5(self, path):
        lines = ""
        with open(path) as fp:
            # 将json文件读到 j 中
            j = json.load(fp)
            # 遍历json中的frames,新的数据集所有的图片都在frames中,每个objs是一张图片的信息
            for objs in j["frames"]:
                # 给每张图片创建一个txt文件储存信息
                write = open(self.writepath + "%s.txt" %objs["name"], 'w')
                # 每个labels是一个种类的信息
                for labels in objs["labels"]:
                    if labels["category"] in self.select_categorys:
                        temp_category = labels["category"]
                        idx = self.categorys_nums[temp_category]
                        cx = (labels["box2d"]["x1"] + labels["box2d"]["x2"]) / 2.0
                        cy = (labels["box2d"]["y1"] + labels["box2d"]["y2"]) / 2.0
                        w = labels["box2d"]["x2"] - labels["box2d"]["x1"]
                        h = labels["box2d"]["y2"] - labels["box2d"]["y1"]
                        if w <= 0 or h <= 0:
                            continue
                        # 根据图片尺寸进行归一化
                        cx, cy, w, h = cx * self.bdd100k_width_ratio, cy * self.bdd100k_height_ratio, w * \
                            self.bdd100k_width_ratio, h * self.bdd100k_height_ratio
                        line = f"{idx} {cx:.6f} {cy:.6f} {w:.6f} {h:.6f}\n"
                        lines += line
                if len(lines) != 0:
                    write.writelines(lines)
                    write.close()
                    
if __name__ == "__main__":
    # 需要转换的json文件所在的路径
    bdd_labels_dir = "/Users/xxx/Desktop/postgraduate/data/bdd100k_3/labels/ins_seg/rles/val/"
    fileList = os.listdir(bdd_labels_dir)
    obj = BDD_to_YOLOv5()
    for path in fileList:
        filepath = bdd_labels_dir+path
        # print(path)
        obj.bdd_to_yolov5(filepath)

主要就是转换方法,这个代码比较简单,看一下也就懂了,如果格式不太一样稍微修改一下照样好使。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值