大家好,欢迎来到IT知识分享网。
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))
从上述代码中可以看出,默认使用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))
从代码中可以看出,确定模式就是将增强变换进行.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)]))
上述代码中使用了四个关键点,分别处于眼睛和鼻孔处。
关键点与随机模式
将图像分为几个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")
通过生成的图像可以看出,虽然关键点和图像都经过仿射变换,但图像和关键点很少能与标记的位置重合,能重合在一起的都是碰巧。这样对于关键点检测、目标检测与分割中,会存在图像经过增强后难以与真值对应的问题。
确定模式可以解决这一问题!!!
关键点与确定模式
随机模式下可以看出关键点与原图有可能出现不匹配的问题,这也是为什么会有确定模式的原因。
同样,在进行仿射变换前,我们先将变换转化成固定模式。然后在固定模式下进行图像和关键点的仿射变换,并显示。
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")
通过结果可以看出,在确定模式下,不再存在关键点与图像仿射变换后不匹配的问题。
基于此,在关键点检测、目标检测与分割中,图像与真值(points,bbox,featmap)经过仿射变换后,可以一一对应。
整理总结
本节教程主要介绍了imgaug中的两种模式:随机模式和确定模式。并通过关键点匹配的案例,介绍随机模式和确定模式的应用。
确定模式的效果是每批次batch中对应序号的图像是相同的,其作用在于对存在标注文件的视觉任务中,对图像进行数据增强时,能够对标注文件进行同样的增强效果,使图像和标注文件保持一致;不像torchvision中的transformer,不具备对图像和标注同一增强的功能,只能够处理图像分类等没有标注文件的视觉任务。
将随机模式转化为确定模式只需要将相关增强方法.to_deterministic()即可。
另外,在使用关键点时会用到两个函数,ia.KeypointsOnImage和ia.Keypoint()。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/29217.html