Python—JSON格式标签转换为TXT格式标签详细教程2(附完整代码)

这个代码主要是解析一个json文件 转换成多个txt文件使用的,尤其是便于yolo训练

decode_json 函数中的 convert 函数确实是用于将坐标缩放到0-1之间的。但是,您在调用 decode_json
函数时设置了 is_convert=False,这意味着坐标缩放功能被关闭了

代码详解
数字规范化的会将坐标缩放至(0—1)区间
主要是修改这两个地方即可,话不多说 ,咱们直接附代码

#下面是将 `is_convert` 设置为 `True` 并整合到您提供的完整代码中的版本:
import json
import os

name2id = {'Dry_rot': 0, 'Insect_hole': 1, 'Normal': 2, 'Damage': 3, 'car': 4}  # class 标签

def convert(img_size, box):
    dw = 1. / (img_size[0])
    dh = 1. / (img_size[1])
    x = (box[0] + box[2]) / 2.0
    y = (box[1] + box[3]) / 2.0
    w = abs(box[2] - box[0])
    h = abs(box[3] - box[1])
    x = x * dw
    w = w * dw
    y = y * dh
    h = h * dh
    return (x, y, w, h)

def decode_json(json_floder_path, txt_outer_path, json_name, is_convert=True):
    if not json_name.endswith(".json"):
        return
    txt_name = os.path.join(txt_outer_path, json_name[json_name.rfind("/") + 1:-5] + '.txt')

    with open(txt_name, 'w') 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)
        for i in data['shapes']:
            label_name = i['label']
            if (i['shape_type'] == 'polygon'):
                x_max = 0
                y_max = 0
                x_min = float("inf")
                y_min = float("inf")
                for lk in range(len(i['points'])):
                    x1 = float(i['points'][lk][0])
                    y1 = float(i['points'][lk][1])
                    if x_max < x1:
                        x_max = x1
                    if y_max < y1:
                        y_max = y1
                    if y_min > y1:
                        y_min = y1
                    if x_min > x1:
                        x_min = x1
                bb = (x_min, y_max, x_max, y_min)
            if (i['shape_type'] == 'rectangle'):
                x1 = float(i['points'][0][0])
                y1 = float(i['points'][0][1])
                x2 = float(i['points'][1][0])
                y2 = float(i['points'][1][1])
                bb = (x1, y1, x2, y2)
            if is_convert:
                bbox = convert((img_w, img_h), bb)
            else:
                bbox = bb
            try:
                f.write(str(name2id[label_name]) + " " + " ".join([str(a) for a in bbox]) + '\n')
            except:
                pass

if __name__ == "__main__":
    json_floder_path = r'D:/Users/19114/anaconda3/envs/yolo/Lib/site-packages/ultralytics/SK-MPSO-BP/data4/json'  # 请将json文件放在该文件夹下
    txt_outer_path = r'D:/Users/19114/anaconda3/envs/yolo/Lib/site-packages/ultralytics/SK-MPSO-BP/data4/dataset'
    json_names = os.listdir(json_floder_path)
    print("共有:{}个文件待转化".format(len(json_names)))
    flagcount = 0
    for json_name in json_names:
        decode_json(json_floder_path, txt_outer_path, json_name, is_convert=True)  # 启用坐标缩放
        flagcount += 1
        print("还剩下{}个文件未转化".format(len(json_names) - flagcount))
    print('转化全部完毕')

代码解读 这段代码的主要功能是将存储在JSON文件中的图像标注数据转换成YOLO格式的文本文件。以下是代码的详细解读:

  1. 导入模块

  2. import json:导入JSON模块,用于处理JSON文件。
  3. import os:导入操作系统接口模块,用于处理文件和目录。
  4. 定义类别标签映射

  5. name2id:一个字典,将类别名称映射到一个唯一的ID。
  6. 定义坐标转换函数

  7. convert(img_size, box):这个函数接受图像尺寸和边界框坐标,将边界框坐标从像素坐标转换为相对于图像尺寸的比例坐标(0-1之间)。
  8. 定义JSON解码和转换函数

  9. decode_json(json_floder_path, txt_outer_path, json_name, is_convert):这个函数负责读取指定的JSON文件,解析其中的标注数据,并将其转换为YOLO格式的文本文件。
  10. 函数首先检查文件名是否以.json结尾,如果不是,则跳过处理。
  11. 然后,它构造输出文本文件的路径。
  12. 使用json.load读取JSON文件内容,获取图像的宽度和高度。
  13. 遍历JSON文件中的所有标注(shapes),对于每个标注,根据其类型(polygon或rectangle),计算边界框(bounding box)。
  14. 如果is_convertTrue,则调用convert函数将边界框坐标转换为比例坐标。
  15. 最后,将类别ID和边界框坐标写入文本文件。
  16. 主函数

  17. 设置JSON文件和输出文本文件的文件夹路径。
  18. 列出JSON文件夹中的所有文件。
  19. 打印待转换文件的数量。
  20. 初始化一个计数器flagcount来跟踪已转换的文件数量。
  21. 遍历所有JSON文件,对每个文件调用decode_json函数进行转换,并将is_convert设置为True以启用坐标缩放。
  22. 打印剩余未转换文件的数量。
  23. 所有文件转换完成后,打印“转化全部完毕”。

总结来说,这段代码的目的是将图像标注数据从JSON格式转换为YOLO目标检测格式的文本文件,其中包含了每个对象的类别ID和边界框坐标(可以是像素坐标或比例坐标,取决于is_convert参数的设置)。这样的转换通常用于机器学习和计算机视觉任务,特别是在目标检测领域。

作者:资源补给站

物联沃分享整理
物联沃-IOTWORD物联网 » Python—JSON格式标签转换为TXT格式标签详细教程2(附完整代码)

发表回复