• 【637】一个图片两个标注的图像增强


    【529】图像增强(imgaug 包)

      对于上面关于 imgaug 包的描述,只能针对一套标注图片进行图像增强,不过对于一张图片有两种标注的情况无法实现,需要对两个标注生成一样的变换。  

      对于包含楼顶、楼体,需要同时调整变换的时候,内置的方法无法实现,因此我自己建立随机数据来实现,实现思路如下:

    • 对于每一个方法构建随机数,并进行赋值
    • 建立随机数,判断是和增强
    • 对于每一组随机数只产生唯一的增强方案,并同时应用到两个标注上面
    • 这样便产生了一一对应的标注增强方案

      实现代码:

    from imgaug import augmenters as iaa 
    from imgaug.augmentables.segmaps import SegmentationMapsOnImage
    from PIL import Image 
    import numpy as np 
    import cv2, os, random 
    
    def get_random(min_val, max_val):
        return random.random() * (max_val - min_val) + min_val
    
    img_size = 512
    
    src_img_dir         = "03_model_dataset_split/01_images/"
    src_seg_dir_louding = "03_model_dataset_split/02_labels_louding/"
    src_seg_dir_louti   = "03_model_dataset_split/03_labels_louti/"
    
    dst_img_dir         = "07_dataset_aug_512_both/01_images/"
    dst_seg_dir_louding = "07_dataset_aug_512_both/02_labels_louding/"
    dst_seg_dir_louti   = "07_dataset_aug_512_both/03_labels_louti/"
    
    for file in os.listdir(src_img_dir):
        src_img_path = os.path.join(src_img_dir, file)
        src_seg_path_louding = os.path.join(src_seg_dir_louding, file)
        src_seg_path_louti = os.path.join(src_seg_dir_louti, file)
        
        img = Image.open(src_img_path)
        img_arr = np.array(img)
        
        seg_louding = Image.open(src_seg_path_louding)
        seg_arr_louding = np.array(seg_louding)
        
        seg_louti = Image.open(src_seg_path_louti)
        seg_arr_louti = np.array(seg_louti)
        
        # segmentation_maps 数据格式需要是 (512, 512, 1)
        # seg_arr 为 (512, 512),下面是输入 seq 函数的必须格式
        seg_map_louding = SegmentationMapsOnImage(np.expand_dims(seg_arr_louding, axis=-1), shape=(img_size, img_size, 3))
        seg_map_louti = SegmentationMapsOnImage(np.expand_dims(seg_arr_louti, axis=-1), shape=(img_size, img_size, 3))
        
        for i in range(10):
            # 原始图片 image 与 标注 segmentation_maps 一起变化
            # s_augs 是一个 list,包含两个 labels
    
            scale_x = get_random(0.8, 1.2)
            scale_y = get_random(0.8, 1.2)
    
            translate_percent_x = get_random(-0.2, 0.2)
            translate_percent_y = get_random(-0.2, 0.2)
    
            rotate_ = get_random(-45, 45)
    
            shear_ = get_random(-16, 16)
    
            order_ = round(random.random())
    
            sometimes_ = round(random.random())
    
            if sometimes_:
                seq = iaa.Sequential(
                    [iaa.Affine(
                            scale={"x": (scale_x), "y": (scale_y)},          # 图像缩放因子
                            translate_percent={"x": (translate_percent_x), 
                                               "y": (translate_percent_y)},  # 平移比例
                            rotate=(rotate_),                                # 平移角度
                            shear=(shear_),                                  # 错切的程度
                            order=[order_],                                  # 插值顺序
                            cval=(0),                                        # 没有值的地方填充的像素点值
                            mode="constant")                                 # 填充模式,常量填充
                    ])
            else:
                seq = iaa.Sequential([])
    
            i_aug, s_aug1 = seq(image = img_arr, 
                                       segmentation_maps = seg_map_louding)
            i_aug, s_aug2 = seq(image = img_arr, 
                                       segmentation_maps = seg_map_louti)        
    
            dst_img_path = os.path.join(dst_img_dir, "{}-{}.png".format(file.split(".")[0], i))
            dst_seg_path_louding = os.path.join(dst_seg_dir_louding, "{}-{}.png".format(file.split(".")[0], i))
            dst_seg_path_louti = os.path.join(dst_seg_dir_louti, "{}-{}.png".format(file.split(".")[0], i))
    
            Image.fromarray(i_aug).save(dst_img_path) 
            # 需要将得到的 s_aug.get_arr() 是 (512, 512, 1)
            # 需要转换为 (512, 512) 来显示
            Image.fromarray(s_aug1.get_arr().reshape((img_size, img_size))).save(dst_seg_path_louding) 
            Image.fromarray(s_aug2.get_arr().reshape((img_size, img_size))).save(dst_seg_path_louti) 
    
  • 相关阅读:
    Linux CentOS 安装 宝塔
    Linux CentOS 基本命令
    Linux CentOS 各个版本的区别
    OSI物理层之数据通信基础知识
    如何在集群里服役新节点、退役旧节点(DataNode)
    MapReduce的运行流程概述
    MapReduce计算框架的核心编程思想
    解决HDFS上小文件的存储
    计算机网络体系架构之OSI七层模型、TCP/IP四层模型
    集群里常见进程的端口号
  • 原文地址:https://www.cnblogs.com/alex-bn-lee/p/15119313.html
Copyright © 2020-2023  润新知