File size: 3,120 Bytes
aa24fe8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# -*- coding: utf-8 -*-
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 文件的路径
    json_paths = os.listdir(json_dir)
    # 将类别字符串转换为列表
    classes = classes.split(',')
 
    # 遍历所有 JSON 文件
    for json_path in tqdm(json_paths):
        # 构建 JSON 文件的完整路径
        path = os.path.join(json_dir, json_path)
 
        # 打开并读取 JSON 文件
        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 文件的路径
        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)
 
                # 构建 YOLO 格式的标签字符串
                label_str = str(label_index) + ' ' + points_nor_str + '\n'
                # 写入到 TXT 文件
                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)