参考教程:
https://imgaug.readthedocs.io/en/latest/source/jupyter_notebooks.html
imgaug是一个使用的数据增强工具,不仅提供了常见的形状和颜色的增强方法,还提供了一些特殊的增强方法,比如说针对keypoint和bounding boxes的增强。
imgaug中的大部分增强方法,都要求你的输入图像是uint8的numpy arrays,并且最好是RGB图像。更具体的类型要求可以参考dtype_support.html
接下来我们按照imgaug提供的notebook中的处理顺序,来看一下各种类型的增强方法。
首先我们来看一下基础的针对图像的增强方法,我们使用imageio读入一张图片,使用imageio直接读入的图像通道就是按照RGB排列的,如果使用opencv,需要自行转换成RGB。
imgaug中提供了多种增强方法,并且使用起来很简单,只需要实例化某方法并设定好参数后,再将你的图片传入即可。
classimgaug.augmenters.geometric.Affine(scale=None, translate_percent=None, translate_px=None, rotate=None, shear=None, order=1, cval=0, mode='constant', fit_output=False, backend='auto', seed=None, name=None, random_state='deprecated', deterministic='deprecated')
它的输入参数有多个,包括:
在上面的例子中,我们使用的参数是rotate = (-25,25),意思就是旋转的范围在-25度和25度之间。
也可以将一组图像作为输入,要注意这时输入参数是images而不再是image。
并且imgaug中,images是支持不同大小的图像的。
class imgaug.augmenters.meta.Augmenter(seed=None, name=None, random_state='deprecated', deterministic='deprecated')
基本上各种增强方法都是继承了Augmenter这个类,在刚刚的使用例子中提到如果传参使用image就是增强单张图像,使用images就是多张,我们看看源码具体是如何实现的。那么这就首先要来看Augmenter这个class的__call__()方法。
def __call__(self, *args, **kwargs):
"""Alias for :func:`~imgaug.augmenters.meta.Augmenter.augment`."""
return self.augment(*args, **kwargs)
它实际上调用的是本身的augment的方法。
def augment(self, return_batch=False, hooks=None, **kwargs):
augment方法的固定传参只有两个,一个是return_batch,默认是False。另一个是hooks。这两个参数我们都可以暂时不管它。
在具体的实现上,这个方法对你的传入参数其实是有要求的。
expected_keys = ["images", "heatmaps", "segmentation_maps",
"keypoints", "bounding_boxes", "polygons",
"line_strings"]
expected_keys_call = ["image"] + expected_keys
它列举了一些需要被增强的数据的类型,包括图像,关键点等。你传入的kwargs中至少要有一个key包含在expected_keys中。
接下来会构建一个batch,batch中就是你想增强的数据。并按照你设定的方法进行增强处理。
batch = UnnormalizedBatch(
images=images,
heatmaps=kwargs.get("heatmaps", None),
segmentation_maps=kwargs.get("segmentation_maps", None),
keypoints=kwargs.get("keypoints", None),
bounding_boxes=kwargs.get("bounding_boxes", None),
polygons=kwargs.get("polygons", None),
line_strings=kwargs.get("line_strings", None)
)
batch_aug = self.augment_batch_(batch, hooks=hooks)
for key in kwargs:
if key == "image":
attr = getattr(batch_aug, "images_aug")
result.append(attr[0])
else:
result.append(getattr(batch_aug, "%s_aug" % (key,)))
在imgaug中可以将多个增强方法放在一起使用。增强方法的组合方式也有多种。
classimgaug.augmenters.meta.Sequential(children=None, random_order=False, seed=None, name=None, random_state='deprecated', deterministic='deprecated')
Sequential的传入参数是一组augmenter,并且在使用时会顺序的执行。也就是你的第二个增强方法要增强的对象,是经过第一个增强方法增强后的结果。
如下例子:执行的顺序是仿射变化,高斯模糊,然后crop。所以你可以明显看到,旋转后空出来的黑边上也有高斯模糊的效果。
假如调换一下高斯模糊和仿射的顺序。得到的结果中黑色区域就没有模糊效果了。
class imgaug.augmenters.meta.SomeOf(n=None, children=None, random_order=False, seed=None, name=None, random_state='deprecated', deterministic='deprecated')
someof可以随机选择多个augmenter中的几个,并用于增强你给的输入图像。它的第一个传入参数n代表了你需要的subset的大小,也可以把它指定成一个tuple,比如(0,None)。None在这里表示最大值。
class imgaug.augmenters.meta.OneOf(children, seed=None, name=None, random_state='deprecated', deterministic='deprecated')
class imgaug.augmenters.meta.Sometimes(p=0.5, then_list=None, else_list=None, seed=None, name=None, random_state='deprecated', deterministic='deprecated')
sometimes针对的是一组图像,它的作用是只对图像中指定比例进行增强。
如下图,下图中有一半图像被添加了高斯噪声,有一半则经过了仿射变换。
针对图像的增强,按照实现的效果可以分为以下几类:
算术
艺术
blend
blend: 混合两张图片。包括BlendAlpha,以代码为例,输入factor,fg,bg等。返回的结果是factor*fg+(1-factor)*bg。此外还包括BlendAlphaMask:使用一个mask,BlendAlphaElementwise:每个像素选取不同的factor。
classimgaug.augmenters.blend.BlendAlpha(factor=(0.0, 1.0), foreground=None, background=None, per_channel=False, seed=None, name=None, random_state='deprecated', deterministic='deprecated'
blur
blur:对图像添加模糊效果。包括GaussianBlur:高斯模糊,AverageBlur:均值模糊,MedianBlur:中值模糊等。
color
contrast
contrast: 包括各种对比度调整算法,比如GammaContrast,SigmoidContrast等。
Convolve
convolve:包括一些可以用卷积核实现的增强操作,比如说自定义卷积核,再比如说锐化,边缘检测等。
flip
flip:包括水平翻转,垂直翻转,
geometric
geometric:一些几何变化,包括仿射,缩放,平移,旋转等。
关键点是图像中特点的点,一般标记成位置坐标的形式。当你对图像使用几何类的增强方法时,它的像素位置会发生变化,那么关键点的位置也可能发生改变。
imgaug中的增强方法,可以将image的keypoint也作为输入,让keypoint随着图像一起改变。
图中是一个大小为(389,259)的袋鼠图片,它包括五个关键点,分别是左眼、右眼、鼻子、左手、右手。使用imgaug中提供的类将它们封装好。
imgaug.augmentables.kps.Keypoint
imgaug.augmentables.kps.KeypointsOnImage
KeypointsOnImage(keypoints, shape)
,其中keypoints是关键点的列表,shape是对应的图像的大小。接下来在图片和关键点上施加一个仿射变化。这个变化涉及到了平移和旋转。
可以看到关键点也随着图像的变化发生了变化。
和关键点类似,当对图像做几何类的增强变化时,它的包围框也可能受到影响。
imgaug中的增强方法,也可以把包围框作为输入,让它随着图像一起变化。
图中是一个大小为(298,477)的图片,包括两个小动物,每个动物都有它自己的bounding box。imgaug提供了api将包围框封装起来。
imgaug.augmentables.bbs.BoundingBox(x1, y1, x2, y2, label=None)
imgaug.augmentables.bbs.BoundingBoxesOnImage(bounding_boxes, shape)
接下来在图片和包围框上施加一个仿射变化。这个变化涉及到了平移和旋转。
可以看到包围框也随着图像的变化发生了变化。