zoukankan      html  css  js  c++  java
  • Image Processing 必备(二): Imgaug 之随机模式与确定模式

    Date: 2020-09-01

    官方教程:https://nbviewer.jupyter.org/github/aleju/imgaug-doc/blob/master/notebooks/C03%20-%20Stochastic%20and%20Deterministic%20Augmentation.ipynb

    随机模式与确定模式

    在图像领域,随机模式和确定模式与随机数的生成相同,即在采用图像增强时,每次增强产生的图像是固定的还是变化随机的。对比与随机数的生成,就是每次产生的随机数是固定的还是随机的。

    随机模式

    随机模式,顾名思义每次利用图像增强方法中使用的参数都是随机的,产生的图像也是不一致的。

     1 import numpy as np
     2 import imgaug as ia
     3 from imgaug import augmenters as iaa
     4 import imageio
     5 % matplotlib inline
     6 ia.seed(8)
     7 # 读取数据
     8 image = imageio.imread("./pick1.jpg")
     9 images = [[image]*3, [image]*3]   # 形成batch 
    10 11 # 定义变换
    12 aug = iaa.Affine(translate_px=(-30, 30), rotate=(-20, 20), cval=255)
    13 14 # 随机模式
    15 images_aug = [aug.augment_images(batch) for batch in images]
    16 17 # visualize
    18 ia.imshow(ia.draw_grid(images_aug[0]+images_aug[1], rows=2, cols=3))

    png

    从上述代码中可以看出,默认使用imageaug中的增强技术并将数据分batch灌入获得的图像就是在随机模式状态下,从生成的图像中可以看出,生成的增强图像是随机的。

    确定模式

    确定模式,顾名思义每次图像利用图像增强方法得到的图像都是在同一套参数下进行的,也就是说获得的增强图像都是一样的。

     1 ia.seed(8)
     2  3 # 读取图像
     4 image = imageio.imread("./pick1.jpg")
     5 images = [[image]*3, [image]*3]
     6  7 # 定义运算
     8 aug = iaa.Affine(translate_px=(-30, 30), rotate=(-20, 20), cval=255)
     9 10 # 将运算更改为确定模式状态
    11 aug_determinisitic = aug.to_deterministic()
    12 13 # 将数据分批次输入
    14 image_aug_deterministic = [aug_determinisitic.augment_images(batch) for batch in images]
    15 16 # visulization
    17 ia.imshow(ia.draw_grid(image_aug_deterministic[0] + 
    18                        image_aug_deterministic[1], rows=2, cols=3))

    png

    从代码中可以看出,确定模式就是将增强变换进行.to_deterministic()转换为确定模式即可。从输出的结果中可以看出,输出的图像并不是每一张图像都相同,而是每批次batch中对应序号的图像是相同的,同一batch的图像是不同的。

    增加关键点

    增减关键点需要用到两个方法,KeyPointOnImage()KeyPoint(),前者是生成点图,具有绘制到图像上draw_on_image()的方法;后者是点,用于生成关键点。

     1 image = imageio.imread("./pick1.jpg")
     2  3 image_keypoints = ia.KeypointsOnImage([
     4                     ia.Keypoint(x=151, y=106),
     5                     ia.Keypoint(x=247, y=78),
     6                     ia.Keypoint(x=179, y=140),
     7                     ia.Keypoint(x=206, y=134)
     8                 ], shape=image.shape)
     9 10 ia.imshow(np.hstack([image, image_keypoints.draw_on_image(image)]))

    png

    上述代码中使用了四个关键点,分别处于眼睛和鼻孔处。

    关键点与随机模式

    将图像分为几个batch,将关键点和图像作用于仿射变换,观察变换前后的区别。

     1 import matplotlib.pyplot as plt
     2  3 BATCH_SIZE=4
     4  5 images = [image] * BATCH_SIZE
     6 keypoints = [image_keypoints] * BATCH_SIZE
     7  8 # 仿射变换
     9 aug = iaa.Affine(rotate=(-40, 40))
    10 11 # 经过3次仿射变换
    12 image_aug1 = aug.augment_images(images)
    13 keypoints_aug1 = aug.augment_keypoints(keypoints)
    14 15 image_aug2 = aug.augment_images(images)
    16 keypoints_aug2 = aug.augment_keypoints(keypoints)
    17 18 image_aug3 = aug.augment_images(images)
    19 keypoints_aug3 = aug.augment_keypoints(keypoints)
    20 21 # 将关键点与图像融合函数
    22 def draw_and_merge(img, kps):
    23     return np.hstack([kp_i.draw_on_image(im_i) for kp_i, im_i in zip(kps, img)])
    24 25 # visualize
    26 fig, axes = plt.subplots(nrows=3, ncols=1, figsize=(80, 10))
    27 axes[0].imshow(draw_and_merge(image_aug1, keypoints_aug1))
    28 axes[1].imshow(draw_and_merge(image_aug2, keypoints_aug2))
    29 axes[2].imshow(draw_and_merge(image_aug3, keypoints_aug3))
    30 for i in range(3):
    31     axes[i].set_title("Batch %d" % (i+1,))
    32     axes[i].axis("off")

    png

    通过生成的图像可以看出,虽然关键点和图像都经过仿射变换,但图像和关键点很少能与标记的位置重合,能重合在一起的都是碰巧。这样对于关键点检测、目标检测与分割中,会存在图像经过增强后难以与真值对应的问题

    确定模式可以解决这一问题!!!

    关键点与确定模式

    随机模式下可以看出关键点与原图有可能出现不匹配的问题,这也是为什么会有确定模式的原因。

    同样,在进行仿射变换前,我们先将变换转化成固定模式。然后在固定模式下进行图像和关键点的仿射变换,并显示。

     1 # 仿射变换
     2 aug = iaa.Affine(rotate=(-40, 40))
     3 # 转化为固定模式
     4 aug_det = aug.to_deterministic()
     5  6 # 经过3次仿射变换
     7 image_aug1 = aug_det.augment_images(images)
     8 keypoints_aug1 = aug_det.augment_keypoints(keypoints)
     9 10 image_aug2 = aug_det.augment_images(images)
    11 keypoints_aug2 = aug_det.augment_keypoints(keypoints)
    12 13 image_aug3 = aug_det.augment_images(images)
    14 keypoints_aug3 = aug_det.augment_keypoints(keypoints)
    15 16 # 将关键点与图像融合函数
    17 def draw_and_merge(img, kps):
    18     return np.hstack([kp_i.draw_on_image(im_i) for kp_i, im_i in zip(kps, img)])
    19 20 # visualize
    21 fig, axes = plt.subplots(nrows=3, ncols=1, figsize=(80, 10))
    22 axes[0].imshow(draw_and_merge(image_aug1, keypoints_aug1))
    23 axes[1].imshow(draw_and_merge(image_aug2, keypoints_aug2))
    24 axes[2].imshow(draw_and_merge(image_aug3, keypoints_aug3))
    25 for i in range(3):
    26     axes[i].set_title("Batch %d" % (i+1,))
    27     axes[i].axis("off")

    png

    通过结果可以看出,在确定模式下,不再存在关键点与图像仿射变换后不匹配的问题。

    基于此,在关键点检测、目标检测与分割中,图像与真值(points,bbox,featmap)经过仿射变换后,可以一一对应。

    整理总结

    本节教程主要介绍了imgaug中的两种模式:随机模式和确定模式。并通过关键点匹配的案例,介绍随机模式和确定模式的应用。

    将随机模式转化为确定模式只需要将相关增强方法.to_deterministic()即可。

    另外,在使用关键点时会用到两个函数,ia.KeypointsOnImage和ia.Keypoint()。

  • 相关阅读:
    elasticSearch 查询 bool
    elasticSearch 查询 term
    elasticSearch 查询 match
    python re
    vue day1
    mysql 报错记录
    node.js vue.js 安装
    mysql 插入数据 ,存在跳过
    打印乘法口诀表
    初步使用分支、循环判断数字大小
  • 原文地址:https://www.cnblogs.com/monologuesmw/p/13686622.html
Copyright © 2011-2022 走看看