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格式的文本文件。以下是代码的详细解读:
-
导入模块:
import json
:导入JSON模块,用于处理JSON文件。import os
:导入操作系统接口模块,用于处理文件和目录。-
定义类别标签映射:
name2id
:一个字典,将类别名称映射到一个唯一的ID。-
定义坐标转换函数:
convert(img_size, box)
:这个函数接受图像尺寸和边界框坐标,将边界框坐标从像素坐标转换为相对于图像尺寸的比例坐标(0-1之间)。-
定义JSON解码和转换函数:
decode_json(json_floder_path, txt_outer_path, json_name, is_convert)
:这个函数负责读取指定的JSON文件,解析其中的标注数据,并将其转换为YOLO格式的文本文件。- 函数首先检查文件名是否以
.json
结尾,如果不是,则跳过处理。 - 然后,它构造输出文本文件的路径。
- 使用
json.load
读取JSON文件内容,获取图像的宽度和高度。 - 遍历JSON文件中的所有标注(shapes),对于每个标注,根据其类型(polygon或rectangle),计算边界框(bounding box)。
- 如果
is_convert
为True
,则调用convert
函数将边界框坐标转换为比例坐标。 - 最后,将类别ID和边界框坐标写入文本文件。
-
主函数:
- 设置JSON文件和输出文本文件的文件夹路径。
- 列出JSON文件夹中的所有文件。
- 打印待转换文件的数量。
- 初始化一个计数器
flagcount
来跟踪已转换的文件数量。 - 遍历所有JSON文件,对每个文件调用
decode_json
函数进行转换,并将is_convert
设置为True
以启用坐标缩放。 - 打印剩余未转换文件的数量。
- 所有文件转换完成后,打印“转化全部完毕”。
总结来说,这段代码的目的是将图像标注数据从JSON格式转换为YOLO目标检测格式的文本文件,其中包含了每个对象的类别ID和边界框坐标(可以是像素坐标或比例坐标,取决于is_convert
参数的设置)。这样的转换通常用于机器学习和计算机视觉任务,特别是在目标检测领域。
作者:资源补给站