深度学习实践篇 第十一章:imgaug

简介: 简要介绍imgaug和基础用法。

参考教程:
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。
image.png

基础使用样例

imgaug中提供了多种增强方法,并且使用起来很简单,只需要实例化某方法并设定好参数后,再将你的图片传入即可。

以放射变化为例:
image.png

我们可以看一下仿射变化的源码:

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')

它的输入参数有多个,包括:

  1. scale: 缩放
  2. translate_percent:平移比例
  3. translate_px:平移像素值
  4. rotate:旋转角度
  5. shear:错切角度

在上面的例子中,我们使用的参数是rotate = (-25,25),意思就是旋转的范围在-25度和25度之间。

也可以将一组图像作为输入,要注意这时输入参数是images而不再是image
image.png

并且imgaug中,images是支持不同大小的图像的。

base class: augment

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中可以将多个增强方法放在一起使用。增强方法的组合方式也有多种。

sequential

classimgaug.augmenters.meta.Sequential(children=None, random_order=False, seed=None, name=None, random_state='deprecated', deterministic='deprecated')

Sequential的传入参数是一组augmenter,并且在使用时会顺序的执行。也就是你的第二个增强方法要增强的对象,是经过第一个增强方法增强后的结果。
如下例子:执行的顺序是仿射变化,高斯模糊,然后crop。所以你可以明显看到,旋转后空出来的黑边上也有高斯模糊的效果。
image.png

假如调换一下高斯模糊和仿射的顺序。得到的结果中黑色区域就没有模糊效果了。
image.png

someof和oneof

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在这里表示最大值。
image.png

class imgaug.augmenters.meta.OneOf(children, seed=None, name=None, random_state='deprecated', deterministic='deprecated')

oneof就是每次只从你给定的增强方法中选择一个来使用。
image.png

sometimes

class imgaug.augmenters.meta.Sometimes(p=0.5, then_list=None, else_list=None, seed=None, name=None, random_state='deprecated', deterministic='deprecated')

sometimes针对的是一组图像,它的作用是只对图像中指定比例进行增强。
如下图,下图中有一半图像被添加了高斯噪声,有一半则经过了仿射变换。

image.png

增强的种类

针对图像的增强,按照实现的效果可以分为以下几类:

  1. 算术
    1. add:在原像素上加上一个值,包括Add:添加单个值,AddElementwise:给像素点添加不同的值,添加不同类型的noise等。
    2. multiply:在原像素上乘上一个值,包括Multiply:乘单个值,MultiplyElementwise:每个像素乘不同的值。
    3. cut:将图中某个区域填充成特定值。包括Cutout:填充一个矩形区域。Dropout:用0填充指定比例的像素。
    4. replace:ReplaceElementwise:用给定值填充指定比例的像素。Salt:用椒盐噪声填充像素。
    5. Invert:反转图像中所有的像素值。包括Invert:把value改为255-value。Solarize:反转超过给定阈值的像素值。
  2. 艺术
    1. cartoon:支持大小在200-800间的图像。
  3. 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'
    
  4. blur
    blur:对图像添加模糊效果。包括GaussianBlur:高斯模糊,AverageBlur:均值模糊,MedianBlur:中值模糊等。

  5. color

    1. ColorSpace: colorspace相关的增强算法,会进行颜色空间的转换。包括WithColorspace:从a空间转到b,在b上做增强后转回a。WithBrightnessChannels:从某空间转到一个包含亮度通道的空间,修改亮度后转回去原空间。ChangeColorspace:将图片从a空间转到b空间。Grayscale:将图片转成灰度图。
    2. Temperature:包括ChangeColorTemperature,改变图片的色调。
    3. Quantization:包括KMeansColorQuantization:使用聚类方法分配像素,并用聚类中心取代像素值。UniformColorQuantization:使用某种距离算法将像素分为N个bins。
  6. contrast
    contrast: 包括各种对比度调整算法,比如GammaContrast,SigmoidContrast等。

  7. Convolve
    convolve:包括一些可以用卷积核实现的增强操作,比如说自定义卷积核,再比如说锐化,边缘检测等。
  8. flip
    flip:包括水平翻转,垂直翻转,
  9. geometric
    geometric:一些几何变化,包括仿射,缩放,平移,旋转等。

针对关键点的增强

关键点是图像中特点的点,一般标记成位置坐标的形式。当你对图像使用几何类的增强方法时,它的像素位置会发生变化,那么关键点的位置也可能发生改变。

imgaug中的增强方法,可以将image的keypoint也作为输入,让keypoint随着图像一起改变。

image.png

图中是一个大小为(389,259)的袋鼠图片,它包括五个关键点,分别是左眼、右眼、鼻子、左手、右手。使用imgaug中提供的类将它们封装好。

  1. imgaug.augmentables.kps.Keypoint
    是一个简单的类,用于标记单个关键点。
  2. imgaug.augmentables.kps.KeypointsOnImage
    将一组关键点组合在一起,初始化时KeypointsOnImage(keypoints, shape),其中keypoints是关键点的列表,shape是对应的图像的大小。

接下来在图片和关键点上施加一个仿射变化。这个变化涉及到了平移和旋转。
可以看到关键点也随着图像的变化发生了变化。
image.png

针对包围框的增强

和关键点类似,当对图像做几何类的增强变化时,它的包围框也可能受到影响。

imgaug中的增强方法,也可以把包围框作为输入,让它随着图像一起变化。
image.png

图中是一个大小为(298,477)的图片,包括两个小动物,每个动物都有它自己的bounding box。imgaug提供了api将包围框封装起来。

  1. imgaug.augmentables.bbs.BoundingBox(x1, y1, x2, y2, label=None)
    是一个简单的类,用于标记一个包围框。
  2. imgaug.augmentables.bbs.BoundingBoxesOnImage(bounding_boxes, shape)
    包含一个图片中的一组包围框,它的传入参数有两个,第一个是包围框的list,第二个是对应的图像的shape。

接下来在图片和包围框上施加一个仿射变化。这个变化涉及到了平移和旋转。
可以看到包围框也随着图像的变化发生了变化。
image.png

相关文章
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的迁移学习:从理论到实践
科技进步不断推动人工智能的发展,其中深度学习已成为最炙手可热的领域。然而,训练深度学习模型通常需要大量的数据和计算资源,这对于许多实际应用来说是一个显著的障碍。迁移学习作为一种有效的方法,通过利用已有模型在新任务上的再训练,大大减少了数据和计算资源的需求。本文将详细探讨迁移学习的理论基础、各种实现方法以及其在实际应用中的优势和挑战。
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
探索深度学习的奥秘:从理论到实践
【5月更文挑战第31天】本文将深入探讨深度学习的理论基础和实践应用,揭示其在解决复杂问题中的强大能力。我们将从深度学习的基本概念开始,然后讨论其在不同领域的应用,最后分享一些实践经验和技巧。
|
5天前
|
机器学习/深度学习 人工智能 自然语言处理
揭秘深度学习:从理论到实践的技术之旅
【7月更文挑战第10天】本文将深入探索深度学习的奥秘,从其理论基础讲起,穿越关键技术和算法的发展,直至应用案例的实现。我们将一窥深度学习如何变革数据处理、图像识别、自然语言处理等领域,并讨论当前面临的挑战与未来发展趋势。
|
8天前
|
机器学习/深度学习 搜索推荐 算法
深度学习在推荐系统中的应用:技术解析与实践
【7月更文挑战第6天】深度学习在推荐系统中的应用为推荐算法的发展带来了新的机遇和挑战。通过深入理解深度学习的技术原理和应用场景,并结合具体的实践案例,我们可以更好地构建高效、准确的推荐系统,为用户提供更加个性化的推荐服务。
|
1月前
|
机器学习/深度学习 API TensorFlow
Keras深度学习框架入门与实践
**Keras**是Python的高级神经网络API,支持TensorFlow、Theano和CNTK后端。因其用户友好、模块化和可扩展性受到深度学习开发者欢迎。本文概述了Keras的基础,包括**模型构建**(Sequential和Functional API)、**编译与训练**(选择优化器、损失函数和评估指标)以及**评估与预测**。还提供了一个**代码示例**,展示如何使用Keras构建和训练简单的卷积神经网络(CNN)进行MNIST手写数字分类。最后,强调Keras简化了复杂神经网络的构建和训练过程。【6月更文挑战第7天】
25 7
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
探索深度学习:从理论到实践
【6月更文挑战第4天】本文深入探讨了深度学习的理论基础和实践应用,包括其发展历程、主要模型、以及在图像识别、自然语言处理等领域的应用。文章不仅提供了对深度学习的全面理解,还通过实例展示了如何将理论知识转化为实际的技术解决方案。
|
2月前
|
机器学习/深度学习 传感器 自动驾驶
基于深度学习的图像识别技术在自动驾驶系统中的应用构建高效云原生应用:云平台的选择与实践
【5月更文挑战第31天】 随着人工智能技术的飞速发展,深度学习已经成为推动计算机视觉进步的关键力量。特别是在图像识别领域,通过模仿人脑处理信息的方式,深度学习模型能够从大量数据中学习并识别复杂的图像模式。本文将探讨深度学习技术在自动驾驶系统中图像识别方面的应用,重点分析卷积神经网络(CNN)的结构与优化策略,以及如何通过这些技术提高自动驾驶车辆的环境感知能力。此外,文章还将讨论目前所面临的挑战和未来的研究方向。
|
2月前
|
机器学习/深度学习 算法 大数据
基于深度学习的图像识别技术:原理与实践
基于深度学习的图像识别技术:原理与实践
46 4
|
2月前
|
机器学习/深度学习 传感器 自动驾驶
基于深度学习的图像识别技术在自动驾驶系统中的应用深入理解操作系统内存管理:原理与实践
【5月更文挑战第28天】 随着人工智能技术的飞速发展,图像识别作为其重要分支之一,在多个领域展现出了广泛的应用潜力。尤其是在自动驾驶系统中,基于深度学习的图像识别技术已成为实现车辆环境感知和决策的关键。本文将深入探讨深度学习算法在自动驾驶图像识别中的作用,分析其面临的挑战以及未来的发展趋势,并以此为基础,展望该技术对自动驾驶安全性和效率的影响。
|
2月前
|
机器学习/深度学习 数据采集 算法
利用深度学习优化图像识别准确性的策略与实践
【5月更文挑战第26天】 在计算机视觉领域,图像识别的准确性直接影响着算法的实用性和效率。本文针对当前深度学习在图像识别中的应用进行探讨,提出了一系列优化策略,旨在提升模型的识别精度。文中首先概述了深度学习在图像识别中的基础框架,随后深入分析了数据预处理、网络结构设计、损失函数定制以及训练技巧等方面的优化方法。通过实验验证,这些策略能显著提高模型在复杂环境下的表现能力。