东方耀AI技术分享

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 4180|回复: 1
打印 上一主题 下一主题

[学习笔记] 034、imgaug图像数据增强之Augmenters常用函数

[复制链接]

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14432
QQ
跳转到指定楼层
楼主
发表于 2020-1-13 16:30:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


034、imgaug图像数据增强之Augmenters常用函数


  1. import imgaug as ia
  2. import imgaug.augmenters as iaa
  3. import numpy as np
  4. import imageio

  5. print(ia.__version__)

  6. img_path = 'dfy_imgs/ai111.jpg'
  7. img = imageio.imread(img_path)
  8. print(type(img), img.shape)
  9. ia.seed(666)

  10. seq = iaa.Noop()

  11. batch_images = np.array([img, img, img])
  12. print(batch_images.shape)
  13. batch_images_auged = seq.augment_images(batch_images)
  14. print('增强后的:', type(batch_images_auged), batch_images_auged.shape)

  15. ia.imshow(np.hstack([np.vstack(batch_images), np.vstack(batch_images_auged)]))
  16. # ia.imshow(np.vstack(batch_images_auged))
复制代码


  1. # -*- coding: utf-8 -*-
  2. __author__ = u'东方耀 微信:dfy_88888'
  3. __date__ = '2020/1/13 9:32'
  4. __product__ = 'PyCharm'
  5. __filename__ = '01_Augmenters常用函数'

  6. import imgaug as ia
  7. import imgaug.augmenters as iaa
  8. import imageio
  9. import numpy as np

  10. print(ia.__version__)


  11. img_path = 'dfy_imgs/ai111.jpg'
  12. img = imageio.imread(img_path)
  13. print(type(img), img.shape)
  14. ia.seed(666)
  15. # iaa.Sequential()   产生一个处理图片的Sequential
  16. seq1 = iaa.Sequential(children=[
  17.     # iaa.Crop(px=(100, 102)),
  18.     # iaa.CropAndPad(px=(100, 102)),
  19.     iaa.Fliplr(p=0.5),   # left right
  20.     iaa.Flipud(p=0.5),   # up down
  21.     # iaa.GaussianBlur(sigma=(0, 3.0)),
  22.     iaa.AdditiveGaussianNoise(scale=(30, 90)),
  23. ], random_order=False)
  24. # iaa.someOf()  将Augmenter中的部分变换应用在图片处理上,而不是应用所有的Augmenter。
  25. #  例如:可以定义20种变换,但每次只选择其中的5个。但是不支持固定选择某一个Augmenter
  26. # n=(1, None) 每次使用1到多个Augmenter来处理图片,每个batch中的Augmenters顺序不一样。
  27. # n=(1, 3)  使用1~3个Augmenter来处理图片,每个batch中的Augmenters顺序一样。
  28. # n=2 每次选择2个变换
  29. seq2 = iaa.SomeOf(n=(1, None), children=[
  30.     iaa.Flipud(p=0.5),
  31.     iaa.Fliplr(p=0.5),
  32.     iaa.GaussianBlur(sigma=1.0),
  33. ])
  34. # iaa.OneOf()  每次从一系列Augmenters中选择一个来变换
  35. # iaa.Sometimes(p=0.5, then_list=, else_list=)  对batch中的一部分图片应用一部分Augmenters,剩下的图片应用另外的Augmenters
  36. # 注意变换的图片应用的Augmenter只能是then_list或者else_list中的一个
  37. # iaa.WithColorspace(to_colorspace=)  在某个特定的颜色空间对图像进行变换。
  38. # 即:先将图片从一个颜色空间变换到另一个颜色空间,然后在另一个颜色空间中对图像进行变换,最后再变换回原来的颜色空间
  39. # 先将图片从RGB变换到HSV(色调(H),饱和度(S),明度(V)),然后将H值增加10,然后再变换回RGB
  40. # iaa.WithChannels:从图片中挑选出一个Channel来进行变换,变换完了之后再将该channel merge回去。
  41. seq3 = iaa.WithColorspace(to_colorspace='HSV', children=[
  42.     iaa.WithChannels(channels=0, children=[
  43.         iaa.Add(10)
  44.     ])
  45. ])
  46. # iaa.Noop() 不进行任何变换。某些情况下只想使用一个Augmenter作为占位符,
  47. # 这样可以继续调用augment_image()函数,但实际不作变换。例如进行测试的时候可以使用这个。
  48. # iaa.Lambda(func_images=,func_heatmaps=,func_segmentation_maps=,func_keypoints=) 自定义一些变换函数
  49. def func_images(images, random_state, parents, hooks):
  50.     images[:, ::2, :, :] = 0
  51.     return images


  52. def func_keypoints(keypoints_on_images, random_state, parents, hooks):
  53.     return keypoints_on_images


  54. # 将每张图片每隔两行的像素点变成黑色的条带,关键点保留
  55. seq4 = iaa.Lambda(
  56.     func_images=func_images,
  57.     func_keypoints=func_keypoints
  58. )

  59. # iaa.AssertShape(shape=[NHWC]) assert要变换的图片和keypoint的shape。如果不满足就抛出异常
  60. #  先检查图片的高度是否是200<=H<300, 宽度是否是617, channel是否是1或者3。如果都满足则执行水平翻转,否则报错。
  61. seq5 = iaa.Sequential([
  62.     # iaa.AssertShape(shape=(None, 296, 617, 3)),
  63.     iaa.AssertShape((None, (200, 300), 617, [1, 3])),
  64.     iaa.Fliplr(0.5)
  65. ])

  66. # iaa.Scale() 将图像缩放到固定大小 Resize has the exactly same interface as Scale.
  67. # iaa.Resize(size=,interpolation='cubic')
  68. # size: 字符串”keep”,此时保持图像原大小不坐缩放。
  69. # 如果是一个整数n,则缩放成(n, n)。如果是一个float v,则每张图片会被缩放成(H*v, W*v),此时每张图像大小仍然不一样
  70. # •interpolation: 缩放方法。如果是All, 则会随机从下面挑选一个: nearest、linear、area、cubic,注意每张图片可能不一样
  71. # 如果是string,则该种方法会被一直使用,必须是下面的一种: nearest, linear, area, cubic
  72. seq6 = iaa.Sequential(children=[
  73.     # iaa.Resize(size='keep', interpolation='cubic'),
  74.     iaa.KeepSizeByResize(children=[
  75.         iaa.Resize(size=0.6, interpolation='cubic'),
  76.     ], interpolation='cubic'),
  77. ])

  78. # iaa.CropAndPad(px=,percent=,pad_mode=,pad_cval=,keep_size=True)
  79. # •px: 想要crop(negative values)的或者pad(positive values)的像素点。注意与percent不能同时存在。
  80. # •pad_mode: 填充方式。可以是All, string, string list。
  81. # 可选的填充方式有: constant, edge, linear_ramp, maximum, median, minimum, reflect, symmetric, wrap 具体含义可查numpy文档
  82. # pad_cval(constant value):当pad_mode=constant的时候选择填充的值
  83. seq7 = iaa.Sequential(children=[
  84.     # iaa.CropAndPad(percent=0.2, pad_mode='constant', pad_cval=255, keep_size=True),
  85.     iaa.CropAndPad(px=(10, 102), pad_mode='linear_ramp', keep_size=True),
  86.     iaa.GaussianBlur(sigma=1.2)
  87. ])
  88. # iaa.ChangeColorspace(to_colorspace=)  linear_ramp
  89. # iaa.Grayscale(alpha=)  变成灰度图
  90. # iaa.GaussianBlur(sigma=)  高斯扰动  •sigma: 高斯变换的标准差 常见的有0,不扰动。3,强扰动
  91. # iaa.AverageBlur(k=3)  从最邻近像素中取均值来扰动  •k:窗口大小
  92. # iaa.MedianBlur(k=) 通过最近邻中位数来扰动
  93. # iaa.BilateralBlur(d=)   Bilateral Blur(双边滤波)
  94. # iaa.MotionBlur(k=)  移动模糊也就是物体移动时会产生模糊的现象,可以说是相对观察相机快速变动的物体
  95. # (与其说是物体,还不如说是相应的片元fragment)产生的残影与物体本体叠加在一个范围,产生的模糊现象

  96. seq8 = iaa.Sequential(children=[
  97.     # iaa.GaussianBlur(sigma=2),
  98.     # iaa.AverageBlur(k=3),
  99.     # iaa.MedianBlur(k=3),
  100.     # iaa.BilateralBlur(d=3),
  101.     iaa.MotionBlur(k=5),
  102. ])


  103. # iaa.Convolve(matrix=) 对图像使用卷积操作
  104. # iaa.Sharpen(alpha=0, lightness=1),  锐化
  105. # iaa.Emboss  浮雕效果
  106. # iaa.EdgeDetect 边缘检测
  107. # iaa.DirectedEdgeDetect  特定方向的边缘检测
  108. seq9 = iaa.Sequential(children=[
  109.     # iaa.Convolve(matrix=np.array([[0, -1, 0], [-1, 4, -1], [0, -1, 0]])),
  110.     # iaa.Sharpen(alpha=1, lightness=1),
  111.     # iaa.Emboss(alpha=1, strength=1),
  112.     # iaa.EdgeDetect(alpha=0.3),
  113.     iaa.DirectedEdgeDetect(alpha=0.3, direction=(0.0, 1.0)),
  114. ])


  115. seq10 = iaa.Sequential(children=[
  116.     # iaa.Add(value=100, per_channel=True),
  117.     # iaa.AddElementwise(value=10, per_channel=False),  # 按像素加
  118.     # iaa.AdditiveGaussianNoise(loc=0, scale=30)     # 添加高斯噪声
  119.     # iaa.Multiply(mul=2.0)   # 给图像中的每个像素点乘一个值使得图片更亮或者更暗
  120.     # iaa.MultiplyElementwise()  # 按像素值乘
  121.     # iaa.Dropout(p=0.1),  # 随机去掉一些像素点, 即把这些像素点变成0
  122.     # iaa.CoarseDropout(),  # 将矩形框的值设置为0
  123.     iaa.Invert(p=0.5),   # 将每个像素值p变成255-p
  124. ])


  125. seq11 = iaa.Sequential(children=[
  126.     # 改变图像的对比度
  127.     # iaa.contrast.LinearContrast(alpha=1.6, per_channel=True),
  128.     # iaa.contrast.GammaContrast(gamma=1.6),
  129.     # iaa.contrast.LogContrast(gain=1.6),
  130.     iaa.contrast.SigmoidContrast(gain=10),
  131. ])

  132. # 仿射变换。包含:平移(Translation)、旋转(Rotation)、放缩(zoom)、错切(shear)。
  133. # 仿设变换通常会产生一些新的像素点,我们需要指定这些新的像素点的生成方法,这种指定通过设置cval和mode两个参数来实现。
  134. # 参数order用来设置插值方法
  135. # •scale: 图像缩放因子。1表示不缩放,0.5表示缩小到原来的50%
  136. # •translate_percent: 平移比例,0表示不平移,0.5表示平移50%。 用正负来表示平移方向
  137. # •translate_px: 按照像素来进行平移
  138. # •rotate: 旋转角度,0~360度之间,正负也可以表示方向
  139. # •shear: 错切的程度,0~360度之间,正负表示方向
  140. # •order: 插值顺序,与skimage中定义相同。下面0和1方法快,3比较慢,4、5特别慢
  141. # •0:最邻近插值。
  142. # •1: 双线性插值(默认)。
  143. # •2: 双二次插值(不推荐)。
  144. # •3:双三次插值。
  145. # •4: Bi-quartic。
  146. # •5:Bi-quintic。
  147. # •cval: 当平移后使用常量填充的时候指定填充的常量值,只有在mode=constant的时候才会生效
  148. # •mode: 采用何种方式填充经过变换后空白的像素点
  149. # •constant: 采用一个常量填充。
  150. # •edge: 边缘填充。
  151. # •symmetric: 镜面对称填充。
  152. # •reflect: Pads with the reflection of the vector mirrored on the first and last values of the vector along each axis.
  153. # •wrap: Pads with the wrap of the vector along the axis. The first values are used to pad the end and the end values are used to pad the beginning.

  154. seq12 = iaa.Sequential(children=[
  155.     iaa.Affine(translate_px={'x': 100, 'y': 50}, shear=20),
  156. ])


  157. # iaa.PiecewiseAffine 随机放置一些规则的网格点然后移动这些点的周围的像素。这回导致局部的扭曲
  158. # iaa.ElasticTransformation  通过移动局部像素来变换
  159. seq13 = iaa.Sequential(children=[
  160.     # iaa.PiecewiseAffine(scale=0.2),
  161.     iaa.ElasticTransformation(alpha=10, sigma=10, order=3),
  162. ])

  163. batch_images = np.array([img, img, img])
  164. print(batch_images.shape)
  165. batch_images_auged = seq13.augment_images(batch_images)
  166. print('增强后的:', type(batch_images_auged), batch_images_auged.shape)

  167. ia.imshow(np.hstack([np.vstack(batch_images), np.vstack(batch_images_auged)]))
  168. # ia.imshow(np.vstack(batch_images_auged))


复制代码


让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

0

主题

117

帖子

258

积分

中级会员

Rank: 3Rank: 3

积分
258
QQ
沙发
发表于 2020-2-3 15:21:49 | 只看该作者
谢谢老师答疑解惑
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|人工智能工程师的摇篮 ( 湘ICP备2020019608号-1 )

GMT+8, 2024-4-26 10:19 , Processed in 0.160758 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表