使用imgaug对json进行增强,同时在labelme可以打开

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}")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值