在尝试使用yolov5的分割功能的时候遇到了需要将自己弄的分割标签json文件转化为txt文件的问题。之前使用的转换代码只能转换规则的标签(如矩形框标签),看了很多博主写的转换代码大多数都是只能转换规则的标签,好不容易找到一个博主写的代码可以转换不规则标签了但是又没有对标签进行归一化,使得转换后的文件依旧不可用。不经意间翻到了一个博主用yolov8分割自己的数据集的记录,在他的记录中有一段可以转换不规则标签的python代码。代码如下:
# 处理labelme多边形矩阵的标注 json转化txt,提取点
import json
import os
name2id = {'chip': 0} # 修改你的类别并且赋与index
def decode_json(json_floder_path, txt_outer_path, json_name):
txt_name = txt_outer_path + json_name[:-5] + '.txt'
with open(txt_name, 'a') as f:
json_path = os.path.join(json_floder_path, json_name)
data = json.load(open(json_path, 'r', encoding='gb2312', errors='ignore'))
img_w = data['imageWidth']
img_h = data['imageHeight']
isshape_type = data['shapes'][0]['shape_type']
print(isshape_type)
dw = 1. / (img_w)
dh = 1. / (img_h)
for i in data['shapes']:
label_name = i['label']
if (i['shape_type'] == 'polygon'):
point = []
for lk in range(len(i['points'])):
x = float(i['points'][lk][0])
y = float(i['points'][lk][1])
point_x = x * dw
point_y = y * dh
point.append(point_x)
point.append(point_y)
f.write(str(name2id[label_name]) + " " + " ".join([str(a) for a in point]) + '\n')
f.close()
if __name__ == "__main__":
json_floder_path = r'F:\Workprojects\front_corner_drop\train_data\json' # 存放json的文件夹的绝对路径
txt_outer_path = r'F:\Workprojects\front_corner_drop\labels\segment' # 存放txt的文件夹绝对路径
json_names = os.listdir(json_floder_path)
flagcount = 0
for json_name in json_names:
decode_json(json_floder_path, txt_outer_path, json_name)
flagcount += 1
print('-----------转化完毕------------')
该段代码就可以完美的实现将不规则标签的json文件转换为txt文件。当然,规则的标签也是可以进行转换的。