语义分割之使用自己的代码进行数据增强(labelme的json文件)

前言
网上的包,写着写着,就不耐烦了,还是自己写吧

注释掉的部分 是对json文件的修改 如果大家想顺便修改json文件就将注释给删去

import cv2
import os
import shutil
import json
import base64
import random
import numpy as np
import random
from tqdm import tqdm
from PIL import Image

def image_to_base64(image_path):
    # 读取二进制图片,获得原始字节码
    with open(image_path, 'rb') as jpg_file:
        byte_content = jpg_file.read()

    # 把原始字节码编码成base64字节码
    base64_bytes = base64.b64encode(byte_content)

    # 把base64字节码解码成utf-8格式的字符串
    base64_string = base64_bytes.decode('utf-8')

    return base64_string

def make_dir(img_save_path,mask_save_path,json_save_path):
    if not os.path.exists(json_save_path):
        os.makedirs(json_save_path)
    if not os.path.exists(mask_save_path):
        os.makedirs(mask_save_path)
    if not os.path.exists(img_save_path):
        os.makedirs(img_save_path)
        img_name_list = os.listdir(img_path)
        base_num = len(img_name_list)
        print(f'base_num = {base_num}')
    else:
        img_save_list = os.listdir(img_save_path)
        img_save_list = [int(i.split('.')[0]) for i in img_save_list]
        base_num = max(img_save_list)
    return base_num


def flip_left_right(img_path,mask_path,json_path,save_path):
    img_save_path = os.path.join(save_path,"output_img")
    json_save_path = os.path.join(save_path,"output_json")
    mask_save_path = os.path.join(save_path, "output_mask")

    base_num = make_dir(img_save_path,mask_save_path,json_save_path)
    # os.makedirs(json_save_path,exist_ok=True)
    # os.makedirs(img_save_path,exist_ok=True)

    img_name_list = os.listdir(img_path)
    img_name_list =sorted(img_name_list,key=lambda x:int(x.split('.')[0]))

    pbar = tqdm(total=len(img_name_list))
    for img_name in img_name_list:
        num = int(img_name.split('.')[0]) +base_num

        # 打开图片
        img = Image.open(os.path.join(img_path,img_name))
        width, height = img.size
        # 左右翻转
        img = img.transpose(Image.FLIP_LEFT_RIGHT)
        img.save(f'{img_save_path}/{num}.jpg')
        #shutil.copy(f'{json_path}/{num - base_num}.json',f'{json_save_path}/{num}.json')

        mask_name = img_name.split('.')[0] + '.png'
        mask = Image.open(os.path.join(mask_path, mask_name))
        mask = mask.transpose(Image.FLIP_LEFT_RIGHT)
        mask.save(f'{mask_save_path}/{num}.png')


        # with open(f'{json_save_path}/{num}.json', 'r') as f:
        #     data = json.load(f)
        # base64_string = image_to_base64(f'{img_save_path}/{num}.jpg')
        # data["imageData"]= base64_string
        # #data_shapes是一个列表 列表里面包含的元素是字典
        # data_shapes = data['shapes']
        # for label_index,label_points in  enumerate(data_shapes):
        #     points = label_points['points']
        #     for poindt_index,point in enumerate(points):
        #         x,y = point
        #         new_x = (width-x)
        #         points[poindt_index] = (new_x, y)
        # # 将修改后的数据重新写入json文件
        # with open(json_save_path + '/' + str(num) + '.json', 'w') as f:
        #     json.dump(data, f)
        pbar.update(1)

def flip_top_bottom(img_path,mask_path,json_path,save_path):
    img_save_path = os.path.join(save_path,"output_img")
    json_save_path = os.path.join(save_path,"output_json")
    mask_save_path = os.path.join(save_path,"output_mask")

    base_num = make_dir(img_save_path,mask_save_path,json_save_path)
    # os.makedirs(json_save_path,exist_ok=True)
    # os.makedirs(img_save_path,exist_ok=True)

    img_name_list = os.listdir(img_path)
    img_name_list =sorted(img_name_list,key=lambda x:int(x.split('.')[0]))

    pbar = tqdm(total=len(img_name_list))
    for img_name in img_name_list:
        num = int(img_name.split('.')[0]) +base_num


        # 打开图片
        img = Image.open(os.path.join(img_path,img_name))
        width, height = img.size
        # 左右翻转
        img = img.transpose(Image.FLIP_TOP_BOTTOM)
        img.save(f'{img_save_path}/{num}.jpg')
        #shutil.copy(f'{json_path}/{num - base_num}.json',f'{json_save_path}/{num}.json')

        mask_name = img_name.split('.')[0] + '.png'
        mask = Image.open(os.path.join(mask_path, mask_name))
        mask = mask.transpose(Image.FLIP_TOP_BOTTOM)
        mask.save(f'{mask_save_path}/{num}.png')

        # with open(f'{json_save_path}/{num}.json', 'r') as f:
        #     data = json.load(f)
        # base64_string = image_to_base64(f'{img_save_path}/{num}.jpg')
        # data["imageData"]= base64_string
        # #data_shapes是一个列表 列表里面包含的元素是字典
        # data_shapes = data['shapes']
        # for label_index,label_points in  enumerate(data_shapes):
        #     points = label_points['points']
        #     for poindt_index,point in enumerate(points):
        #         x,y = point
        #         new_y = (height-y)
        #         points[poindt_index] = (x, new_y)
        # # 将修改后的数据重新写入json文件
        # with open(json_save_path + '/' + str(num) + '.json', 'w') as f:
        #     json.dump(data, f)
        pbar.update(1)

def flip_Horizontal_Vertical(img_path,mask_path,json_path,save_path):
    img_save_path = os.path.join(save_path,"output_img")
    json_save_path = os.path.join(save_path,"output_json")
    mask_save_path = os.path.join(save_path, "output_mask")

    base_num = make_dir(img_save_path,mask_save_path,json_save_path)
    # os.makedirs(json_save_path,exist_ok=True)
    # os.makedirs(img_save_path,exist_ok=True)

    img_name_list = os.listdir(img_path)
    img_name_list =sorted(img_name_list,key=lambda x:int(x.split('.')[0]))

    pbar = tqdm(total=len(img_name_list))
    for img_name in img_name_list:
        num = int(img_name.split('.')[0]) +base_num


        # 打开图片
        img = Image.open(os.path.join(img_path,img_name))
        width, height = img.size
        # 左右翻转
        img = img.transpose(Image.FLIP_TOP_BOTTOM) #Image.Transpose.FLIP_TOP_BOTTOM
        img = img.transpose(Image.FLIP_LEFT_RIGHT)
        img.save(f'{img_save_path}/{num}.jpg')
        #shutil.copy(f'{json_path}/{num - base_num}.json',f'{json_save_path}/{num}.json')

        mask_name = img_name.split('.')[0] + '.png'
        mask = Image.open(os.path.join(mask_path, mask_name))
        mask = mask.transpose(Image.FLIP_TOP_BOTTOM)
        mask = mask.transpose(Image.FLIP_LEFT_RIGHT)
        mask.save(f'{mask_save_path}/{num}.png')

        # with open(f'{json_save_path}/{num}.json', 'r') as f:
        #     data = json.load(f)
        # base64_string = image_to_base64(f'{img_save_path}/{num}.jpg')
        # data["imageData"]= base64_string
        # #data_shapes是一个列表 列表里面包含的元素是字典
        # data_shapes = data['shapes']
        # for label_index,label_points in  enumerate(data_shapes):
        #     points = label_points['points']
        #     for poindt_index,point in enumerate(points):
        #         x,y = point
        #         new_x = (width-x)
        #         new_y = (height-y)
        #         points[poindt_index] = (new_x, new_y)
        # # 将修改后的数据重新写入json文件
        # with open(json_save_path + '/' + str(num) + '.json', 'w') as f:
        #     json.dump(data, f)
        pbar.update(1)

def random_rotate(img_path,mask_path,json_path,save_path):
    img_save_path = os.path.join(save_path,"output_img")
    json_save_path = os.path.join(save_path,"output_json")
    mask_save_path = os.path.join(save_path, "output_mask")

    base_num = make_dir(img_save_path,mask_save_path,json_save_path)
    # os.makedirs(json_save_path,exist_ok=True)
    # os.makedirs(img_save_path,exist_ok=True)

    img_name_list = os.listdir(img_path)
    img_name_list =sorted(img_name_list,key=lambda x:int(x.split('.')[0]))

    pbar = tqdm(total=len(img_name_list))
    for img_name in img_name_list:
        num = int(img_name.split('.')[0]) +base_num

        # 打开图片
        img = Image.open(os.path.join(img_path,img_name))
        width, height = img.size
        # 左右翻转
        angle = 90 if random.random() < 0.5 else 270
        img = img.rotate(angle, expand=True)
        img.save(f'{img_save_path}/{num}.jpg')
        #shutil.copy(f'{json_path}/{num - base_num}.json',f'{json_save_path}/{num}.json')

        mask_name = img_name.split('.')[0] + '.png'
        mask = Image.open(os.path.join(mask_path, mask_name))
        mask = mask.rotate(angle, expand=True)
        mask.save(f'{mask_save_path}/{num}.png')

        # with open(f'{json_save_path}/{num}.json', 'r') as f:
        #     data = json.load(f)
        # base64_string = image_to_base64(f'{img_save_path}/{num}.jpg')
        # data["imageData"]= base64_string
        # #data_shapes是一个列表 列表里面包含的元素是字典
        # data_shapes = data['shapes']
        # for label_index,label_points in  enumerate(data_shapes):
        #     points = label_points['points']
        #     for poindt_index,point in enumerate(points):
        #         x,y = point
        #         new_x = (width-x)
        #         new_y = (height-y)
        #         points[poindt_index] = (new_x, new_y)
        # # 将修改后的数据重新写入json文件
        # with open(json_save_path + '/' + str(num) + '.json', 'w') as f:
        #     json.dump(data, f)
        pbar.update(1)

def randon_contrast_bright(img_path,mask_path,json_path,save_path,min_threshold =0.8,max_threshold=1.12):
    img_save_path = os.path.join(save_path,"output_img")
    json_save_path = os.path.join(save_path,"output_json")
    mask_save_path = os.path.join(save_path, "output_mask")

    base_num = make_dir(img_save_path,mask_save_path,json_save_path)

    img_name_list = os.listdir(img_path)
    img_name_list =sorted(img_name_list,key=lambda x:int(x.split('.')[0]))

    if max_threshold>1.12: max_threshold=1.12
    if min_threshold<0:min_threshold = 0

    pbar = tqdm(total=len(img_name_list))
    for img_name in img_name_list:
        img_weight = random.uniform(min_threshold, max_threshold)

        num = int(img_name.split('.')[0]) +base_num
        img = cv2.imread(os.path.join(img_path,img_name))
        img_geay = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
        mean = np.mean(img_geay)

        if mean > 186:
            img_weight = random.uniform(min_threshold, 1)
        elif mean <42:
            img_weight = random.uniform(1, max_threshold)


        if img_weight>0.93 and img_weight<1.07:
            if img_weight <1:
                img_weight -= random.uniform(0, 0.05)
            else:
                img_weight += random.uniform(0, 0.05)

        hsv_img = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
        bright = hsv_img[:,:,2]

        # 使用矩阵运算加速计算
        bright = bright * img_weight
        bright = np.clip(bright, 0, 255)

        hsv_img[:, :, 2] = bright

        new_img = cv2.cvtColor(hsv_img, cv2.COLOR_HSV2BGR)
        cv2.imwrite(f'{img_save_path}/{num}.jpg',new_img)
        # shutil.copy(f'{json_path}/{num - base_num}.json',f'{json_save_path}/{num}.json')


        mask_name = img_name.split('.')[0] + '.png'
        mask = Image.open(os.path.join(mask_path, mask_name))
        mask.save(f'{mask_save_path}/{num}.png')

        pbar.update(1)

img_path = '/home/netted/img_process_ml/DATA/VOCdevkit/VOC2007/JPEGImages'
mask_path = '/home/netted/img_process_ml/DATA/VOCdevkit/VOC2007/SegmentationClass'
json_path = ''#不生成json文件就省略
save_path = '/home/netted/img_process_ml/DATA/VOCdevkit/VOC2007/save'

random_rotate(img_path,mask_path,json_path,save_path)
flip_top_bottom(img_path,mask_path,json_path,save_path)
flip_left_right(img_path,mask_path,json_path,save_path)
flip_Horizontal_Vertical(img_path,mask_path,json_path,save_path)
randon_contrast_bright(img_path,mask_path,json_path,save_path)

没时间优化 凑合着用 哈哈哈

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Imgaug库对labelme标注后的json格式的数据集进行语义分割的扩充,你需要对标注的掩码进行增强。 首先,你可以按照前面提到的方法加载labelme标注后的json数据集。然后,你需要将标注的掩码转换为可处理的形式,例如使用Numpy数组。 下面是一个示例代码,用于将labelme标注后的json掩码转换为Numpy数组: ```python import numpy as np from labelme import utils def json_to_mask(json_data): height = json_data['imageHeight'] width = json_data['imageWidth'] mask = np.zeros((height, width), dtype=np.uint8) for shape in json_data['shapes']: label = shape['label'] polygon = shape['points'] mask = utils.shape_to_mask((height, width), polygon, shape_type='polygon') mask = np.where(mask, label, mask) return mask mask = json_to_mask(json_data) ``` 接下来,你可以使用Imgaug库来定义并应用各种图像增强技术。例如,你可以使用以下代码来实现随机水平翻转和随机旋转的图像增强: ```python import imgaug.augmenters as iaa # 定义图像增强器 augmenter = iaa.Sequential([ iaa.Fliplr(0.5), # 随机水平翻转概率为50% iaa.Affine(rotate=(-45, 45)) # 随机旋转角度范围为-45到45度 ]) # 对每个标注的掩码进行增强 augmented_masks = [] for mask in masks: augmented_mask = augmenter.augment_image(mask) augmented_masks.append(augmented_mask) ``` 在这个示例中,我们将增强后的掩码存储在一个列表中,你可以根据自己的需求进行后续处理,例如保存增强后的掩码。 需要注意的是,语义分割的标注通常是像素级别的,因此你需要确保图像增强器同时应用于图像和对应的掩码,以保持它们的一致性。 希望这个回答能对你有帮助!如果你还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值