labelme标注好的json文件目标检测矩形框转换为yolo所需要的txt格式
labelme标注好的json文件目标检测矩形框转换为yolo所需要的txt格式
·
使用labeme进行矩形框标注,
标注完的json文件中的矩形框转换为yolo,由于yolo所需的txt格式是 x y w h,所以针对之前的那篇博客进行改进
转换代码如下
注意要修改的地方有三个,
json文件夹,txt要保存到的文件夹,和class类别文件
注意这里的class类别用逗号隔开,中间没有空格,
注意类别名称的顺序要和yaml文件的顺序对应上,如果对应不上,训练出来类别名会错误
# -*- coding: utf-8 -*-
import json
import os
import argparse
from tqdm import tqdm
import glob
import cv2
import numpy as np
def convert_label_json(json_dir, save_dir, classes):
json_paths = os.listdir(json_dir)
classes = classes.split(',')
for json_path in tqdm(json_paths):
path = os.path.join(json_dir, json_path)
with open(path, 'r', encoding='utf-8') as load_f:
json_dict = json.load(load_f)
h, w = json_dict['imageHeight'], json_dict['imageWidth']
# save txt path
txt_path = os.path.join(save_dir, json_path.replace('json', 'txt'))
with open(txt_path, 'w') as txt_file:
for shape_dict in json_dict['shapes']:
label = shape_dict['label']
label_index = classes.index(label)
points = shape_dict['points']
# Assuming points contain two points: top-left and bottom-right
x1, y1 = points[0]
x2, y2 = points[1]
# Calculate center x, center y, width, height
x_center = (x1 + x2) / 2 / w
y_center = (y1 + y2) / 2 / h
width = (x2 - x1) / w
height = (y2 - y1) / h
# Format the output string
label_str = f"{label_index} {x_center} {y_center} {width} {height}\n"
txt_file.write(label_str)
# def convert_label_json(json_dir, save_dir, classes):
# json_paths = os.listdir(json_dir)
# classes = classes.split(',')
#
# for json_path in tqdm(json_paths):
# # for json_path in json_paths:
# path = os.path.join(json_dir, json_path)
# # print(path)
# # with open(path, 'r') as load_f:
# with open(path, 'r', encoding='utf-8') as load_f:
# print(load_f)
# json_dict = json.load(load_f, )
# h, w = json_dict['imageHeight'], json_dict['imageWidth']
#
# # save txt path
# txt_path = os.path.join(save_dir, json_path.replace('json', 'txt'))
# txt_file = open(txt_path, 'w')
#
# for shape_dict in json_dict['shapes']:
# label = shape_dict['label']
# label_index = classes.index(label)
# points = shape_dict['points']
#
# points_nor_list = []
#
# for point in points:
# points_nor_list.append(point[0] / w)
# points_nor_list.append(point[1] / h)
#
# points_nor_list = list(map(lambda x: str(x), points_nor_list))
# points_nor_str = ' '.join(points_nor_list)
#
# label_str = str(label_index) + ' ' + points_nor_str + '\n'
# txt_file.writelines(label_str)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='json convert to txt params')
# parser.add_argument('--json-dir', type=str, default=r'D:\dyh\only_tuqi_tongyiweizhi\labels_json', help='json path dir')
# parser.add_argument('--save-dir', type=str, default=r'D:\dyh\only_tuqi_tongyiweizhi\labels_txt', help='txt save dir')
parser.add_argument('--json-dir', type=str, default=r"G:\1010",
help='json path dir')
parser.add_argument('--save-dir', type=str, default=r'G:\1010',
help='txt save dir')
# parser.add_argument('--classes', type=str, default='FlangeA', help='classes')
# parser.add_argument('--classes', type=str, default='biaomiankeng,huahen,saobian,biaoji_jiantou,biaoji_shugang,wenlucanliu,dakeng,kepeng,biaoji_yuandian,xiu,yuanhushang,yaliaodou,heipi,bianyuan_geda', help='classes')
parser.add_argument('--classes', type=str, default='tuqi,aoxian', help='classes')
args = parser.parse_args()
json_dir = args.json_dir
save_dir = args.save_dir
classes = args.classes
convert_label_json(json_dir, save_dir, classes)
更多推荐
所有评论(0)