新手分享学习过程
一个 JSON 文件包含了多张图片以及对应的标注信息
如下图这种
在yolov5的虚拟环境下直接复制代码可用
需要更改的有四处地方均已在如下代码中标注
import json
import os
import shutil
from PIL import Image
# 读取 JSON 文件11111111111
json_file = r'D:\yolov5-7.0\03_2499_0962-2461\IR_label.json' # 替换为你的 JSON 文件路径
with open(json_file, 'r') as f:
data = json.load(f)
# 获取图片数量
# 假设每个 gt_rect 对应一张图片,根据你的数据结构调整
num_images = len(data['gt_rect'])
# 创建 YOLO 标签文件夹(如果不存在)2222222222222
labels_dir = 'yolo_dataset1/labels'
os.makedirs(labels_dir, exist_ok=True)
# 创建 YOLO 图片文件夹(如果不存在)3333333333333
images_dir = 'yolo_dataset1/images'
os.makedirs(images_dir, exist_ok=True)
# 确定类别 ID
# 这里假设只有一个类别,类别 ID 是 0,如果有多个类别,需要根据类别名称分配对应的 ID
category_id = 0
# 假设 JSON 数据中包含图片的文件路径
#image_paths = data['image_path'] # 请根据你的 JSON 数据结构调整
# 如果 JSON 文件中没有图片路径,手动设置图片路径
image_dir = r'D:\yolov5-7.0\03_2499_0962-2461' # 图片所在的目录444444444444
image_names = [f"{i+1:06d}.jpg" for i in range(num_images)] # 假设图片文件名是 "000001.jpg", "000002.jpg", 等等
image_paths = [os.path.join(image_dir, name) for name in image_names]
# 遍历每张图片的标注信息并生成 YOLO 格式的标签文件
for i in range(num_images):
# 获取边界框信息
gt_rect = data['gt_rect'][i]
x_min = gt_rect[0]
y_min = gt_rect[1]
width = gt_rect[2]
height = gt_rect[3]
# 获取图片路径并加载图片
image_path = image_paths[i]
img = Image.open(image_path)
img_width = img.width
img_height = img.height
# 计算中心坐标、宽度和高度(YOLO 格式要求归一化到 0-1 范围)
x_center = (x_min + width / 2) / img_width
y_center = (y_min + height / 2) / img_height
normalized_width = width / img_width
normalized_height = height / img_height
# 创建 YOLO 格式的标签内容
yolo_label = f"{category_id} {x_center:.6f} {y_center:.6f} {normalized_width:.6f} {normalized_height:.6f}"
# 写入标签文件
label_file = os.path.join(labels_dir, f"{i+1:06d}.txt")
with open(label_file, 'w') as f:
f.write(yolo_label)
# 将图片复制到 YOLO 图片文件夹(如果需要)
shutil.copy(image_path, os.path.join(images_dir, os.path.basename(image_path)))
代码运行后
一张图片对应一个标注