BDD数据集地址:Profilehttps://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)
主要就是转换方法,这个代码比较简单,看一下也就懂了,如果格式不太一样稍微修改一下照样好使。