语义分割之使用自己的代码进行数据增强(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
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值