imgaug图像扩充实践
加载和扩充图像
预期的输入数据。使用imgaug增强图像仅需要几行代码。但是在此之前,我们首先必须加载图像。 imgaug期望图像是numpy数组,并且最好与dtype uint8配合使用,即,当数组的值在0到255之间时。通道轴始终是最后一个轴,对于灰度图像可能会被跳过。对于非灰度图像,预期的输入色彩空间是RGB。
非uint8数据。如果您使用uint8以外的其他dtype,例如float32,建议您查看dtype文档,以大致了解每个扩充器的dtype支持。该API包含更多详细信息。请记住,uint8始终是经过最充分测试的dtype。
图像加载功能。由于imgaug仅处理增强而不处理图像输入/输出,因此我们将需要另一个库来加载图像。在python中执行此操作的常见选择是imageio,我们将在下面使用它。另一个常见的选择是通过函数cv2.imread()实现的OpenCV。但是请注意,cv2.imread()会以BGR颜色空间而不是RGB返回图像,这意味着您必须重新排列通道轴,例如通过cv2.imread(path)[:,:,::-1]。您也可以选择将每个与颜色空间相关的增强器更改为BGR(例如,灰度或任何更改色调和/或饱和度的增强器)。有关每个扩充器的详细信息,请参见API。后一种方法的缺点是所有可视化功能(例如下面的imgaug.imshow())仍将期望RGB数据,因此BGR图像将看起来很破损。
加载并显示图像
让我们跳到第一个例子。 我们将使用imageio.imread()加载图像并对其进行扩充。 在下面的代码块中,我们调用imageio.imread(uri)直接从Wikipedia加载图像,但是我们也可以从文件路径加载图像,例如 通过imagio.imread(“ / path / to / the / file.jpg”)或Windows imagio.imread(“ C:\\ path \ to \ the \ file.jpg”)。 imageio.imread(uri)返回numtype的dtype uint8,形状(高度,宽度,通道)和RGB颜色空间的数组。 这正是我们所需要的。 加载图像后,我们使用imgaug.imshow(array)可视化加载的图像。
import imageio
import numpy as np
import imgaug as ia
from imgaug import augmenters as iaa#原图
image = imageio.imread("a.jpg")
print("Original:")
ia.imshow(image)
增强图像
现在我们已经加载了图像,让我们对其进行扩充。 imgaug以来自Augmenter父类的类的形式包含许多增强技术。 要使用一种扩充技术,我们必须使用一组超参数实例化它,然后再多次应用它。 我们的第一个增强技术将是仿射,即仿射变换。 我们在这里保持简单,并使用该技术将图像旋转-25°至+ 25°之间的随机值。
ia.seed(4)
rotate = iaa.Affine(rotate=(-25, 25))
image_aug = rotate(image=image)
print("Augmented:")
ia.imshow(image_aug)
扩充一批图像
当然,实际上,我们很少只想增强单个图像。 我们可以使用与上面相同的代码来实现此目的,只需将签名参数图像更改为图像。 扩充一批图像通常比分别扩充每个图像要快得多。为简单起见,我们在这里创建批处理,方法是将原始图像复制几次,然后将其通过旋转增强器进行馈送。 为了可视化我们的结果,我们使用numpy的hstack()函数,该函数通过将水平方向上彼此相邻的扩展批处理中的图像合并为一个大图像。
如您所见,批次中的所有图像都自动旋转了不同的量。那是因为当通过rotate = iaa.Affine(rotate =(-25,25))实例化仿射变换时,我们使用了一个旋转间隔,给定为(-25,25),这表示均匀分布rotate〜uniform( -25,25)。我们还可以选择一个恒定值rotate = -25始终旋转-25°,或选择一个列表rotate = [-25,-15、0]旋转-25°或-15°或0°。我们还可以选择许多其他概率分布,例如高斯或泊松分布。查看其他笔记本或文档以获取有关操作方法的详细信息。
图像列表或单个数组。请注意,在上面的示例中,我们使用了一个列表将图像组合为一批。我们还可以提供一个单一的形状数组(N,H,W,[C]),其中N是图像的数量,H是高度,W是宽度,C是通道轴(可选)。通常首选使用numpy数组,因为它们可以节省内存并且可以更快地进行扩充。但是,如果您的图像具有不同的高度,宽度或通道数,则无法将它们组合到单个阵列中,因此必须使用列表。
同时使用多种增强技术
仅执行仿射旋转是相当有限的。 因此,在下一个示例中,我们将结合几种方法并将它们同时应用于图像。 为此,我们可以自行实例化每种技术,然后通过多次调用增强器(images = ...)来逐个应用它们。 或者,我们可以使用Sequential将不同的增强器组合到一个管道中,然后将它们全部应用到单个增强调用中。 我们将在下面使用“顺序”来应用仿射旋转(Affine),添加一些高斯噪声(AdditiveGaussianNoise)并通过从图像的每一侧移除0%到20%来裁剪图像(裁剪)。
seq = iaa.Sequential([iaa.Affine(rotate=(-25, 25)),iaa.AdditiveGaussianNoise(scale=(10, 60)),iaa.Crop(percent=(0, 0.2))])
images_aug = seq(images=images)
print("Augmented:")
ia.imshow(np.hstack(images_aug))
请注意如何放大某些图像。这来自于Crop。还要注意所有图像仍具有相同的大小。这是因为默认情况下,“裁剪”会保留输入图像的大小,即在删除像素后,它将剩余图像的大小重新调整为输入大小。如果您宁愿不将其大小调整为原始图像大小,则将Crop实例化为Crop(...,keep_size = False),其中keep_size表示“保持输入和输出之间的图像大小不变”。
上面,我们使用了Sequential组合了几种增强技术。实际上,我们还可以将每种技术保存在列表中,然后手动遍历列表以单独应用每种技术。因此,尽管顺序简化了事情,但并没有太大帮助。但是,它确实具有我们尚未使用的便捷功能,那就是随机顺序扩展。如果激活,它将以随机顺序应用增强,从而大大增加了可能的增强空间,并使我们不必自己实施。
在下一个示例中,我们将使用该功能。就像将random_order = True添加到Sequential一样简单。为了使事物更加可见,我们增加了增强的强度并显示了更多图像。还要注意我们如何通过循环而不是对整个批处理使用单个调用增强调用来对输入图像进行八次增强。这是因为随机订单是每批次一次而不是批次中的每个图像采样一次。为了在这里看到许多不同的订单,因此我们进行了多次扩展。
image = imageio.imread("a.jpg")
seq = iaa.Sequential([iaa.Affine(rotate=(-25, 25)),iaa.AdditiveGaussianNoise(scale=(30, 90)),iaa.Crop(percent=(0, 0.4))
], random_order=True)
images_aug = [seq(image=image) for _ in range(8)]
ia.imshow(ia.draw_grid(images_aug, cols=4, rows=2))
仔细看看上面的图片。 其中一些在旋转之前已裁剪,有些先旋转然后裁剪。 对于其中一些像素,高斯噪声被添加到黑色像素中,而对于某些像素则没有。 这些黑色像素是通过仿射旋转添加的,以填充新创建的像素。 因此,黑色像素不嘈杂的图像是旋转之前应用高斯噪声的增强。
放大不同大小的图像
上面已经提到过,imgaug支持包含不同大小图像的批处理,但是到目前为止,我们一直使用相同的图像。 以下示例显示了具有不同图像大小的情况。 我们加载三张图像,将它们作为一个批次进行扩充,然后一张一张地显示每个图像(具有输入和输出形状)。 这次我们还使用了一些不同的增强技术。
seq = iaa.Sequential([iaa.CropAndPad(percent=(-0.2, 0.2), pad_mode="edge"), # crop and pad imagesiaa.AddToHueAndSaturation((-60, 60)), # change their coloriaa.ElasticTransformation(alpha=90, sigma=9), # water-like effectiaa.Cutout() # replace one squared area within the image by a constant intensity value
], random_order=True)
# load images with different sizes
images_different_sizes = [imageio.imread("a.jpg"),imageio.imread("b.jpg"),imageio.imread("c.jpg")]
# augment them as one batch
images_aug = seq(images=images_different_sizes)
# visualize the results
print("Image 0 (input shape: %s, output shape: %s)" % (images_different_sizes[0].shape, images_aug[0].shape))
ia.imshow(np.hstack([images_different_sizes[0], images_aug[0]]))
print("Image 1 (input shape: %s, output shape: %s)" % (images_different_sizes[1].shape, images_aug[1].shape))
ia.imshow(np.hstack([images_different_sizes[1], images_aug[1]]))
print("Image 2 (input shape: %s, output shape: %s)" % (images_different_sizes[2].shape, images_aug[2].shape))
ia.imshow(np.hstack([images_different_sizes[2], images_aug[2]]))
imgaug图像扩充实践相关推荐
- 【视频课】业界最强数据增强库使用与人脸图像超分辨实践!
前言 数据是深度学习系统的输入,对深度学习的发展起着至关重要的作用,但是又容易被很多人忽视,尤其是缺少实战的学习人员.数据增强又是其中至关重要的内容,为了让大家能够掌握好深度学习中数据的使用,我们开设 ...
- 图像增广与扩充---带有噪声的黑白裂缝图像扩充,用于裂缝检测训练
图像增广与扩充-带有噪声的黑白裂缝图像扩充,用于裂缝检测训练 文章目录 图像增广与扩充---带有噪声的黑白裂缝图像扩充,用于裂缝检测训练 1. 初始数据获得 2. 传统图像扩充.基于深度学习的图像扩充 ...
- 图形图像编程实践 课程报告
文章目录 图形图像编程实践 课程报告 实验环境 EX01 图像的二值化 问题描述 算法设计 结果分析 原图 灰度图 二值化结果图 EX02 图像的加减 问题描述 算法设计 结果分析 原图 灰度图 图片 ...
- Fancy PCA图像扩充总结(附代码)
Fancy PCA图像扩充总结(附代码) 论文链接:ImageNet Classification with Deep Convolutional Neural Networks PCA原理参考:PC ...
- 图像扩充边界_使用机器学习来索引数十亿图像中的文本
自动识别图像中的文本(包括包含图像的PDF)的潜在好处是巨大的.人们在Dropbox中存储了超过200亿个图像和PDF文件.在这些文件中,10-20%是文档类收据和白板图像的照片 - 而不是文档本身. ...
- 基于神经网络的图像去水印/图像修复实践
采用的一个开源的用于生成图像修复的框架,主要基于 Contextual Attention (CVPR 2018)和 Gated Convolution (ICCV 2019 Oral) 作者源码地址 ...
- 简单的图像几何校正实践
简单的图像几何校正 几何校正是指遥感成像过程中,受多种因素的综合影响,原始图像上地物的几何位置.形状.大小.尺寸.方位等特征与其对应的地面地物的特征往往是不一致的,这种不一致就是几何变形,也称几何畸变 ...
- iOS图像最佳实践总结
1. 前言 2018 WWDC 苹果官方给出了关于iOS图像处理的最佳实践,本文主要是就官方文档进行分析总结以及较为全面的拓展延伸. 官方文档:Image and Graphics Best Prac ...
- 基于 Python 的图像分类项目实践入门
课程目标 CO1: 学习并掌握图像分类项目的语法基础.深度学习基础 CO2: 通过学习和完成图像分类项目 ,初步掌握应用 python 语言调用模型并完成特定图像分类的能力. CO3 :培养学生在 ...
- 3.Containerd容器运行时的配置浅析与知识扩充实践
公众号关注「WeiyiGeek」 设为「特别关注」,每天带你玩转网络安全运维.应用开发.物联网IOT学习! 本章目录: 0x00 Containerd 容器运行时配置指南 如何配置 Container ...
最新文章
- 北斗核心器件100%国产化,已接入大部分智能手机
- 2014北京三险一金缴存比例
- C#-获取页面源代码
- LVS(15)——tun技术
- 说说我的ID:fxh7622
- C/C++开发者必不可少的15款编译器+IDE
- Vue-router 的使用 (vue3.x版本)
- 用JavaScript中的示例进行fill()函数
- 怎么修改php.in的时间,PHP时间和日期函数怎么操作
- Spotlight on unix 安装
- “干掉”程序员饭碗后,OpenAI 又对艺术家下手了!
- 心语收集13:有时候我真想忘了你,只记得这个世界,然而,我常常忘了整个世界,只记得你。...
- spring ioc控制反转
- Mimics:修改像素单位
- 基于JAVA图书借阅系统的设计与实现计算机毕业设计源码+系统+lw文档+部署
- 快速搭建仓储管理系统
- MCC(移动国家码)和 MNC(移动网络码)
- 《小学四则运算练习软件软件需求说明》结对项目报告
- pgsql——查询常用
- Windows服务器安全策略配置——简单实用!