抖音技术能力大揭密!钜惠大礼、深度体验,尽在火山引擎增长沙龙,就等你来! 立即报名>> 了解详情
写点什么

Python 中的图像增强技术

2020 年 1 月 21 日

Python中的图像增强技术

图像增强是一种非常强大的技术,针对现有图像人为创建各种变化以扩展图像数据集,例如缩放现有图像、将现有图像旋转几度、剪切或裁剪图像等等。在本文中,我们将使用 imgaug 库探索 Python 中的图像增强技术。


我们为什么需要图像增强?

深度学习卷积神经网络(CNN)需要大量图像才能有效训练模型。通过更好的增强有助于提高模型的性能,从而减少过度拟合。可用于分类和对象检测数据集的最流行的数据集具有数千到数百万个图像。


归纳是指在模型训练期间根据以前从未见过的数据进行评估模型的性能测试或验证。由于 CNN 具有不变性,即使在不同大小,方向或不同照明下可见时,它也可以对对象进行分类。因此,我们可以获取图像的小型数据集,并通过放大或缩小,垂直或水平翻转它们或更改亮度来改变对象的大小。这样,我们可以创建丰富、多样化的图像数据集。


图像增强可以从一小组图像中创建丰富多样的图像集,以进行图像分类,目标检测或图像分割。

在仔细了解问题域之后,需要采用增加训练数据集大小的增强策略。


什么时候需要应用图像增强?

在我们训练模型之前,可以将图像增强用作预处理。


  • 离线或预处理增强


增强被用作预处理步骤,以增加数据集的大小。通常,当我们有一个小的训练数据集要扩展时,便可以完成此操作。


在较小的数据集上生成扩充很有帮助,但在应用于较大的数据集时,我们需要考虑磁盘空间。


  • 在线或实时增强


顾名思义,增强是实时应用的。这通常适用于较大的数据集,因为我们不需要将增强的映像保存在磁盘上。


在这种情况下,我们在小批量中应用转换,然后将其输入模型。


在线增强模型将在每个时期看到不同的图像。在“离线增强”中,增强图像是训练集的一部分,它会根据时期数多次查看增强图像。


该模型可通过在线增强更好地推广,因为它在通过在线数据增强进行训练期间会看到更多样本。


我们将使用 imgaug 类来演示图像增强。


基本图像处理技术

  • 翻转:垂直或水平翻转图像

  • 旋转:将图像旋转指定的角度。

  • 剪切:像平行四边形一样移动图像的一部分

  • 裁剪:对象以不同比例出现在图像中的不同位置

  • 放大,缩小

  • 改变亮度或对比度


现在,我们将使用 imgaug 库探索这些数据增强技术


imgaug

imgaug 是一个用于图像增强以及关键点/地标,边界框,热图和分段图的库。


pip install imgaug
复制代码


在某些情况下,我们会遇到 Shapely 错误,在这种情况下,我们可以尝试使用以下命令


pip install imgaug — upgrade — no-deps
复制代码


我们将拍摄一张图像,并使用基本的数据增强技术对其进行转换实践。


导入所需的库

import imageioimport imgaug as iaimport imgaug.augmenters as iaaimport numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport matplotlib.patches as patchesimport matplotlib%matplotlib inline
复制代码


显示原始图像

我们使用 imageio 显示原始图像


image = imageio.imread(“.\\car2.jpeg”)ia.imshow(image)
复制代码



旋转影像

我们可以通过指定旋转角度来旋转图像。 我们将图像旋转-50 度到 30 度


rotate=iaa.Affine(rotate=(-50, 30))rotated_image=rotate.augment_image(image)ia.imshow(rotated_image)
复制代码



给图像添加噪点

我们将从高斯分布采样的不同噪声值添加到图像。


gaussian_noise=iaa.AdditiveGaussianNoise(10,20)noise_image=gaussian_noise.augment_image(image)ia.imshow(noise_image)
复制代码



裁剪图像

修剪会删除图像侧面的像素列/行。 在下面的示例中,我们将图像的一侧裁剪了 30%


crop = iaa.Crop(percent=(0, 0.3)) # crop imagecorp_image=crop.augment_image(image)ia.imshow(corp_image)
复制代码



扭曲图像

设置 0 到 40 度


shear = iaa.Affine(shear=(0,40))shear_image=shear.augment_image(image)ia.imshow(shear_image)
复制代码



翻转图像

我们可以垂直或水平翻转图像。 Fliplr 水平翻转图像


#flipping image horizontallyflip_hr=iaa.Fliplr(p=1.0)flip_hr_image= flip_hr.augment_image(image)ia.imshow(flip_hr_image)
复制代码



垂直翻转图像

flip_vr=iaa.Flipud(p=1.0)flip_vr_image= flip_vr.augment_image(image)ia.imshow(flip_vr_image)
复制代码



改变图像的亮度

我们使用 GammaContrast 通过缩放像素值来调整图像亮度。 在 gamma =(0.5,2.0)范围内的值似乎是明智的。 我们也可以使用 SigmoidContrast 或 LinearContrast 来更改图像的亮度


image = imageio.imread(“.\\img Aug\\car2.jpeg”)contrast=iaa.GammaContrast(gamma=2.0)contrast_image =contrast.augment_image(image)ia.imshow(contrast_image)
复制代码



缩放图像

我们可以使用缩放来放大或缩小图像。 我们已将图像缩放到图像高度/宽度的 150%至 80%。 我们可以独立缩放每个轴



增强物体检测

我们绘制边界框以进行对象检测。 当我们放大图像时,我们希望包围盒也相应地更新。


imgaug 支持边界框。 当我们旋转,剪切或裁剪图像时,对象周围的边界框也会相应更新。


从 imgaug 导入边界框


from imgaug.augmentables.bbs import BoundingBox, BoundingBoxesOnImage
复制代码


初始化原始图像周围的边界框


bbs = BoundingBoxesOnImage([ BoundingBox(x1=10, x2=520, y1=10, y2=300)], shape=image.shape)
复制代码


在原始图像上方显示边框


ia.imshow(bbs.draw_on_image(image, size=2))
复制代码



在下面的代码中,我们使用 translate_percentage 移动图像,扩大边界框并将其应用于图像上


move=iaa.Affine(translate_percent={"x": 0.1}, scale=0.8)image_aug, bbs_aug = move(image=image, bounding_boxes=bbs)ia.imshow(bbs_aug.draw_on_image(image_aug, size=2))
复制代码



应用图像增强后在图像外部处理边界框

边框有时可能会超出图像,因此我们需要其他代码来处理这种情况


我们旋转图像,并尝试在对象周围绘制边框


rotate_bb=iaa.Affine(rotate=(-50, 30))image_aug, bbs_aug = rotate_bb(image=image, bounding_boxes=bbs)ia.imshow(bbs_aug.draw_on_image(image_aug, size=2))
复制代码



边界框的部分在图像外部。 在下面的代码中,我们将


  • 将边框完全或部分移出图像

  • 裁剪部分位于外部的边界框,使其完全位于图像内部


我们创建一个 padding 函数,以 1 像素的白色边框和 1 像素的黑色边框填充图像:


def pad(image, by):    image_border1 = ia.pad(image, top=1, right=1, bottom=1, left=1,                           mode="constant", cval=255)    image_border2 = ia.pad(image_border1, top=by-1, right=by-1,                           bottom=by-1, left=by-1,                           mode="constant", cval=0)    return image_border2
复制代码


然后,我们在图像上绘制边界框。 我们首先将图像平面扩展 BORDER 像素,然后标记图像平面内的边界框


def draw_bbs(image, bbs, border):    GREEN = [0, 255, 0]    ORANGE = [255, 140, 0]    RED = [255, 0, 0]    image_border = pad(image, border)    for bb in bbs.bounding_boxes:        if bb.is_fully_within_image(image.shape):            color = GREEN        elif bb.is_partly_within_image(image.shape):            color = ORANGE        else:            color = RED        image_border = bb.shift(left=border, top=border)\                         .draw_on_image(image_border, size=2, color=color)return image_border
复制代码


现在,我们对图像应用相同的旋转并绘制边界框


rotate=iaa.Affine(rotate=(-50, 30))image_aug, bbs_aug = rotate(image=image, bounding_boxes=bbs)image_after = draw_bbs(image_aug, bbs_aug.remove_out_of_image().clip_out_of_image(), 100)ia.imshow(image_after)
复制代码



延伸阅读:


https://towardsdatascience.com/data-augmentation-techniques-in-python-f216ef5eed69


2020 年 1 月 21 日 12:362484
用户头像
刘燕 InfoQ记者

发布了 675 篇内容, 共 214.2 次阅读, 收获喜欢 1294 次。

关注

评论

发布
暂无评论
发现更多内容

食堂就餐卡系统设计

Aldaron

食堂就餐卡系统设计

Ph0rse

极客大学架构师训练营

第一周学习总结

Gavin

架构师训练营第一周总结

will

架构师第一课学习总结

曾祥斌

食堂就餐卡系统架构设计⽂档

一点点..

架构师第一周学习小结

K先生

学习总结

YY

架构homework1

蜡笔小晗

架构师训练营-作业一

Jemmy

食堂就餐卡系统设计

谭焜鹏

就餐卡系统架构文档

Geek_bobo

架构学习之架构图设计(1)

Paula_l

就餐卡系统设计

dongge

关于架构师的理解(第一周学习总结)

食堂就餐卡系统设计

周冬辉

食堂就餐卡系统设计

食堂就餐卡系统设计

桔子

食堂就餐卡系统设计

大咪发

【极客大学】【架构师训练营】【第一周】学习总结:如何使用UML图达成设计意念

NieXY

极客大学架构师训练营

第一周架构总结

漫步云梯

架构总结

架构师训练营第一周作业

fenix

架构学习

呱呱

极客大学架构师训练营 作业

架构师训练营 第1周作业

Lingjun

极客大学架构师训练营

架构学习第一周总结

lwy

架构师训练营(第1周作业)

李德政

极客大学架构师训练营

架构师课程第一周总结

dongge

第一周架构训练营(就餐卡系统)

Gavin

如何编写一份合格的架构设计文档(一)

izerone

「架构师训练营」学习笔记:第1周

Amy

学习 极客大学架构师训练营

架构师训练营week1-学习记录

lijia_toby

极客大学架构师训练营

Study Go: From Zero to Hero

Study Go: From Zero to Hero

Python中的图像增强技术-InfoQ