alex_bn_lee

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

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

【529】图像增强(imgaug 包)

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

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

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

  实现代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
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)

 

posted on   McDelfino  阅读(177)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示