yolo目标检测
处理labelme矩形的标注 json转化txt
# 导入必要的库
import json
import os
# 定义一个标签到ID的映射
name2id = {'left_horn1': 0, 'left_horn2': 1, 'right_horn1': 2, 'right_horn2': 3}
# 定义转换函数,用于将坐标从原图到缩放图的转换
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)
# 解码JSON文件,并写入TXT文件
def decode_json(json_floder_path, json_name):
txt_name = r'D:\python\yolov5\data_test\train\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['shapes']:
label_name = i['label']
if i['shape_type'] == 'rectangle': # 如果形状是矩形
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') # 写入TXT文件
# 主函数,遍历指定目录下的所有JSON文件,并解码它们
if __name__ == '__main__':
json_floder_path = r'D:\python\yolov5\data_test\train\json\\' # JSON文件目录路径
json_names = os.listdir(json_floder_path) # 获取目录下的所有文件名
for json_name in json_names: # 遍历每一个JSON文件
decode_json(json_floder_path, json_name) # 解码JSON文件,并将结果写入TXT文件