import json import os #有多少个类别就在字典中写多少给对应的 name2id = {‘mask’:0,‘no-mask’:1} def convert(img_size,box): dw = 1./(img_size[0]) dh = 1./(img_size[1]) x = (box[0] + box[2])/2.0 - 1 y = (box[1] + box[3]) / 2.0 - 1 w = box[2] - box[0] h = box[3] - box[1] x = x * dw w = w * dw y = y * dh h = h * dh return (x,y,w,h) def decode_json (json_floder_path,json_name): #改为转换好的标签的路径 txt_name = “…\labels” + json_name [0:-5] + “.txt” txt_file = open(txt_name,‘w’) json_path = os.path.join(json_floder_path,json_name) data = json.load(open((json_path), ‘r’ ,encoding=‘gb2312’)) img_w = data[‘imageWidth’] img_h = data[‘imageHeight’] for i in data[‘shape’]: label_name = i[‘label’] if (i[‘shape_type’]==‘rectangel’): x1 = int(i[‘points’][0][0]) y1 = int(i[‘points’][0][1]) x2 = int(i[‘points’][1][0]) y2 = int(i[‘points’][1][1]) bb = (x1,y1,x2,y2) bbox = convert((img_w,img_h),bb) txt_file.write(str(name2id[label_name]) + “” + “”.join([str(a) for a in bbox]) + ‘\n’) if name == “main”: #标签的文件夹 json_floder_path = " " json_names = os.listdir(json_floder_path) for json_name in json_names: decode_json(json_floder_path, json_name)
时间: 2024-04-04 16:31:45 浏览: 90
这段代码看起来像是一个将Json格式的标注文件转换为YOLOv5格式的脚本。简单来说,它做了以下几件事情:
1. 定义了一个字典name2id,用于将标注文件中的类别名称映射为数字id;
2. 定义了一个函数convert,用于将标注框的坐标值从图像坐标系转换为归一化坐标系;
3. 定义了一个函数decode_json,用于读取Json格式的标注文件,提取其中的类别和标注框信息,将其转换为YOLOv5格式的标注信息,并将结果写入对应的txt文件中;
4. 在主函数中,遍历标注文件所在的文件夹,调用decode_json函数将每个标注文件转换为YOLOv5格式的标注信息。
需要注意的是,这段代码中可能存在一些小错误,比如矩形框的类型应该是"rectangle"而不是"rectangel",同时在写入txt文件时可能需要在类别id和坐标之间添加一个空格,否则可能会影响后续处理。
阅读全文