| |
| import json |
| import os |
| import argparse |
| from tqdm import tqdm |
| |
| |
| def convert_label_json(json_dir, save_dir, classes): |
| """ |
| 将标注文件从 JSON 格式转换为 YOLO 格式的文本文件,并进行坐标归一化。 |
| :param json_dir: 包含 JSON 文件的目录路径 |
| :param save_dir: 保存转换后文本文件的目录路径 |
| :param 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'] |
| |
| |
| 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'] |
| |
| |
| 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__": |
| """ |
| 命令行用法示例: |
| python json2txt_nomalize.py --json-dir my_datasets/color_rings/jsons --save-dir |
| my_datasets/color_rings/txts --classes "cat,dog" |
| """ |
| |
| parser = argparse.ArgumentParser(description='json 转换为 txt 参数') |
| parser.add_argument('--json-dir', type=str, default="json", help='JSON 文件所在目录') |
| parser.add_argument('--save-dir', type=str, default="dataset/train/labels", help='转换后 TXT 文件保存目录') |
| parser.add_argument('--classes', type=str, default='wampee', help='类别列表,逗号分隔') |
| |
| |
| 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) |