import imgaug.augmenters as iaa from imgaug.augmentables.kps import KeypointsOnImage, Keypoint import json import numpy as np import cv2 import os import random def imread(image_path, flags=cv2.IMREAD_COLOR): # 使用cv2.imdecode读取图像,支持中文路径 return cv2.imdecode(np.fromfile(image_path, dtype=np.uint8), flags) # 输入和输出文件夹路径 input_folder = r'' # 替换为输入文件夹路径 output_folder = r'' # 替换为保存增强结果的输出文件夹路径 # 创建输出目录 os.makedirs(output_folder, exist_ok=True) # 定义数据增强操作 augmenters = iaa.Sequential([ iaa.Fliplr(0.5), # 左右翻转 50% 概率 ]) # 获取所有 JSON 文件 json_files = [f for f in os.listdir(input_folder) if f.endswith('.json')] # 随机选择部分文件进行增强 random_files = random.sample(json_files, k=max(1, len(json_files) // 2)) # 随机选择一半的文件进行增强 for filename in random_files: json_path = os.path.join(input_folder, filename) with open(json_path, 'r', encoding='utf-8') as f: data = json.load(f) # 获取图像路径 image_path = os.path.join(input_folder, os.path.splitext(data["imagePath"])[0] + '.jpg') image = imread(image_path) if image is None: print(f"图像未找到: {image_path}") continue shapes = data["shapes"] keypoints_list = [] # 添加调试输出,查看图像形状 print(f"处理图像: {image_path}, 形状: {image.shape}") try: # 处理每个 shape 并将关键点添加到列表 for shape in shapes: keypoints = [Keypoint(x=point[0], y=point[1]) for point in shape["points"]] keypoints_on_image = KeypointsOnImage(keypoints, shape=image.shape) keypoints_list.append(keypoints_on_image) # 执行数据增强,确保增强应用到所有关键点集合 aug_image, aug_keypoints_list = augmenters(image=image, keypoints=keypoints_list) # 更新增强后的 points 并同步更新所有标签 for i, aug_kp in enumerate(aug_keypoints_list): data["shapes"][i]["points"] = [ [max(0, min(int(kp.x), aug_image.shape[1] - 1)), max(0, min(int(kp.y), aug_image.shape[0] - 1))] for kp in aug_kp.keypoints ] # 保存增强后的图像 augmented_image_name = 'augmented_' + os.path.basename(data["imagePath"]) augmented_image_path = os.path.join(output_folder, augmented_image_name) cv2.imwrite(augmented_image_path, aug_image) # 更新 JSON 文件中的路径和清空 imageData 字段 data["imagePath"] = augmented_image_name data["imageData"] = None # 确保 imageData 为 None,避免编码问题 # 保存增强后的 JSON 文件 augmented_json_path = os.path.join(output_folder, 'augmented_' + filename) with open(augmented_json_path, 'w', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False, indent=4) print(f"增强完成: {filename} -> {augmented_json_path}, {augmented_image_path}") except Exception as e: print(f"处理文件 {filename} 时出错: {e}")
使用imgaug对json进行增强,同时在labelme可以打开
于 2024-08-29 10:39:36 首次发布