来源 | https://www.analyticsvidhya.com/blog/2022/04/image-augmentation-using-3-python-libraries/

作者 | Devashree Madhugiri

翻译 | OpenCV与AI深度学习

导读

本文将介绍3个非常实用的Python图像增强库及其使用步骤与效果演示。(公众号:OpenCV与AI深度学习)

背景介绍

    在使用大量具有显著特征的样本图片训练时,图像分类器通常表现更好。图像分类模型中的一个常见问题发生在模型仅因为它没有在同一图像的不同方向上训练而无法正确分类图像,这可以通过向模型提供多种可能的图像方向和转换来进行训练来克服。然而,在现实中,收集如此多样化的数据可能需要更多的时间、资源和专业知识,并且对公司来说可能成本高昂。在这种情况下,图像数据增强是一种流行的选择,它通过使用一种或多种增强技术来生成用于训练的各种图像,从而为现有数据集增加多样性。尽管一些 Python 库支持多种增强技术,但并非所有技术都与训练模型相关且适合。

    我们可以使用各种技术来增强图像数据。它可以包括:

下面介绍3个非常实用的Python图像增强库及其使用步骤

      • 使用几何变换(例如翻转、裁剪、旋转、缩放等)增强图像数据。

      • 通过使用颜色转换来增强图像数据,例如通过调整亮度、暗度、锐度、饱和度等。

      • 通过随机擦除、混合图像等来增强图像数据。


Imgaug

    Imgaug 是一个开源 python 包,可让您在机器学习实验中增强图像。它适用于各种增强技术。它有一个简单而强大的界面,可以增强图像、地标、边界框、热图和分割图。

让我们首先使用来自PyPI的 pip 安装这个库:

pip install imgaug

    接下来,我们将使用 pip 命令在命令提示符下安装名为“IPyPlot”的 python 包:

pip install ipyplot

    IPyPlot 是一个 Python 工具,允许在 Python Notebook 单元格中快速高效地显示图像。这个包将 IPython 与 HTML 相结合,以提供一种更快、更丰富、更具交互性的方式来显示图像。这个包的 'plot_images' 命令将用于以网格状结构绘制所有图像。

    此外,我们将导入扩充数据所需的所有必要包:

import imageioimport imgaug as iaimport imgaug.augmenters as iaa

增强的图像路径在此处定义。我们将使用鸟类图像作为示例。

input_img = imageio.imread('../input/image-bird/bird.jpg')

图像翻转

    我们可以使用下面显示的命令水平和垂直翻转图像。以下代码中的“Fliplr”关键字水平翻转图像。同样,关键字“Flipud”垂直翻转图像。

#水平翻转hflip= iaa.Fliplr(p=1.0) input_hf= hflip.augment_image(input_img)​​​​​​
#垂直翻转vflip= iaa.Flipud(p=1.0) input_vf= vflip.augment_image(input_img) images_list=[input_img, input_hf, input_vf] labels = ['Original', 'Horizontally flipped', 'Vertically flipped']ipyplot.plot_images (images_list,labels=labels,img_width=180)

    每个图像被翻转的概率由 p 表示。默认情况下,概率设置为 0.0。要水平翻转输入图像,请使用 Fliplr(1.0) 而不仅仅是 Fliplr()。同样,当垂直翻转图像时,使用 Flipud(1.0) 而不仅仅是 Flipud()。

图像旋转

    通过以度为单位定义旋转,我们可以旋转图像。​​​​​​​

rot1 = iaa.Affine(rotate=(-50,20)) input_rot1 = rot1.augment_image(input_img) images_list=[input_img, input_rot1] labels = ['Original', 'Rotated Image'] ipyplot.plot_images(images_list,labels=标签,img_width=180)

图像裁剪

    裁剪图像包括从图像的侧面移除像素的列或行。该增强器可以从全尺寸输入图像中提取较小尺寸的子图像。要删除的像素数可以以绝对数或图像大小的一部分指定。

    在这种情况下,我们使用从连续间隔 [0.0, 0.3] 中均匀获取的随机分数裁剪图像的每一侧,并在每个图像和每侧采样一次。在这里,我们为顶部取 0.3 的采样分数,这会将图像裁剪 0.3*H,其中 H 是输入图像的高度。​​​​​​​

crop1 = iaa.Crop(percent=(0, 0.3)) input_crop1 = crop1.augment_image(input_img) images_list=[input_img, input_crop1] labels = ['Original', '裁剪图像'] ipyplot.plot_images(images_list,labels=labels ,img_width=180)

为图像添加噪点

    该增强器将高斯噪声添加到输入图像。尺度值是产生噪声的正态分布的标准偏差。​​​​​​​

noise=iaa.AdditiveGaussianNoise(10,40)input_noise=noise.augment_image(input_img)images_list=[input_img, input_noise]labels = ['Original', 'Gaussian Noise Image']ipyplot.plot_images(images_list,labels=labels,img_width=180)

图像剪切

    该增强器以 -40 到 40 度范围内的随机量剪切图像。​​​​​​​

shear = iaa.Affine(shear=(-40,40))input_shear=shear.augment_image(input_img)images_list=[input_img, input_shear]labels = ['Original', 'Image Shearing']ipyplot.plot_images(images_list,labels=labels,img_width=180)

图像对比度

    该增强器通过缩放像素值来调整图像对比度。​​​​​​​

contrast=iaa.GammaContrast((0.5, 2.0))contrast_sig = iaa.SigmoidContrast(gain=(5, 10), cutoff=(0.4, 0.6))contrast_lin = iaa.LinearContrast((0.6, 0.4))input_contrast = contrast.augment_image(input_img)sigmoid_contrast = contrast_sig.augment_image(input_img)linear_contrast = contrast_lin.augment_image(input_img)images_list=[input_img, input_contrast,sigmoid_contrast,linear_contrast]labels = ['Original', 'Gamma Contrast','SigmoidContrast','LinearContrast']ipyplot.plot_images(images_list,labels=labels,img_width=180)

    这里的 GammaContrast 函数使用公式 255*((v/255)**gamma 调整图像对比度,其中 v 是像素值,gamma 从范围 [0.5, 2.0] 中均匀采样。SigmoidContrast 使用公式 255 调整图像对比度*1/(1+exp(gain*(cutoff-v/255)) (其中v为像素值,增益从区间[3, 10]开始均匀采样(每张图像一次),截断采样与区间 [0.4, 0.6] 一致。另一方面,LinearContrast 使用公式 127 + alpha*(v-127)' 改变图像对比度,其中 v 是像素值,alpha 从 [0.4] 范围内均匀采样, 0.6]。

图像转换

    “弹性变换”增强器通过使用位移场在局部移动像素来变换图像。增强器的参数是 alpha 和 sigma。位移的强度由 alpha 控制,其中较大的值表示像素移动得更远。位移的平滑度由 sigma 控制,其中较大的值会导致更平滑的图案。​​​​​​​

elastic = iaa.ElasticTransformation(alpha=60.0, sigma=4.0)polar = iaa.WithPolarWarping(iaa.CropAndPad(percent=(-0.2, 0.7)))jigsaw = iaa.Jigsaw(nb_rows=20, nb_cols=15, max_steps=(3, 7))input_elastic = elastic.augment_image(input_img)input_polar = polar.augment_image(input_img)input_jigsaw = jigsaw.augment_image(input_img)images_list=[input_img, input_elastic,input_polar,input_jigsaw]labels = ['Original', 'elastic','polar','jigsaw']ipyplot.plot_images(images_list,labels=labels,img_width=180)

    在使用“Polar Warping”增强器时,首先在极坐标表示中应用裁剪和填充,然后再将其扭曲回笛卡尔表示。这个增强器可以为图像添加额外的像素。这些将被黑色像素填充。此外,“拼图”增强以类似于拼图模式的方式移动图片内的单元格。

图像上的边界框

    imgaug 还为图像提供边界框支持。如果在增强期间旋转,该库可以旋转图像上的所有边界框。​​​​​​​

from imgaug.augmentables.bbs import BoundingBox, BoundingBoxesOnImage bbs = BoundingBoxesOnImage([  BoundingBox(x1=40, x2=550, y1=40, y2=780) ], shape=input_img.shape) ia.imshow(bbs.draw_on_image(input_img ))

‍Albumentations

    Albumentations 是一个快速且知名的库,它与流行的深度学习框架(如 PyTorch 和 TensorFlow)集成。它也是 PyTorch 生态系统的一部分。

    Albumentations 可以执行所有典型的计算机视觉任务,包括分类、语义分割、实例分割、对象识别和姿势估计。该库包含 70 多种不同的增强功能,用于从现有数据创建新的训练样本。它通常用于工业、深度学习研究、机器学习竞赛和开源项目。

让我们首先使用 pip 命令安装库:

pip install Albumentations

    我们将导入使用 Albumentations 扩充数据所需的所有必要包:​​​​​​​

import albumentations as Aimport cv2

    除了 Albumentations 包之外,我们还使用 OpenCV 包,这是一个支持多种图像格式的开源计算机视觉库。专辑依赖于 OpenCV;因此,您已经安装了它。

图像翻转

    'A.HorizontalFlip' 和 'A.VerticalFlip' 函数用于水平和垂直翻转图像。p 是一个独特的参数,几乎所有的扩充都支持。它控制使用增强的概率。​​​​​​​

#HorizontalFliptransform = A.HorizontalFlip(p=0.5)augmented_image = transform(image=input_img)['image']plt.figure(figsize=(4, 4))plt.axis('off')plt.imshow(augmented_image)
#VerticalFliptransform = A.VerticalFlip(p=1)augmented_image = transform(image=input_img)['image']plt.figure(figsize=(4, 4))plt.axis('off')plt.imshow(augmented_image)

图像缩放和旋转

    该增强器随机使用仿射变换来平移、缩放和旋转输入图像。​​​​​​​

transform = A.ShiftScaleRotate(p=0.5)random.seed(7) augmented_image = transform(image=input_img)['image']plt.figure(figsize=(4, 4))plt.axis('off')plt.imshow(augmented_image)

图像通道随机重组

    该增强器随机重新排列输入图像的 RGB 通道​​​​​​​

from albumentations.augmentations.transforms import ChannelShuffle transform = ChannelShuffle(p=1.0) random.seed(7) augmented_image = transform(image=input_img)['image'] plt.figure(figsize=(4, 4)) plt.axis ('off') plt.imshow(augmented_image)

图像曝光

    该增强器反转输入图像中大于某个阈值的所有像素值。​​​​​​​

from albumentations.augmentations.transforms import Solarizetransform = Solarize(threshold=200,  p=1.0)augmented_image = transform(image=input_img)['image']plt.figure(figsize=(4, 4))plt.axis('off')plt.imshow(augmented_image)

反转图像

    通过从 255 中减去像素值,此增强器反转输入图像。​​​​​​​

from albumentations.augmentations.transforms import InvertImgtransform = InvertImg(p=1.0)augmented_image = transform(image=input_img)['image']plt.figure(figsize=(4, 4))plt.axis('off')plt.imshow(augmented_image)

使用 Compose 增强管道

    要定义扩充管道,首先,创建一个 Compose 实例。您必须提供扩充列表作为 Compose 类的参数。在此示例中,我们将使用各种增强功能,例如转置、模糊、失真等。

    Compose 调用将导致返回将执行图像增强的变换函数。​​​​​​​

transform = A.Compose([    A.RandomRotate90(),    A.Transpose(),    A.ShiftScaleRotate(shift_limit=0.08, scale_limit=0.5, rotate_limit=5, p=.8),    A.Blur(blur_limit=7),    A.GridDistortion(),])random.seed(2) augmented_image = transform(image=input_img)['image']plt.figure(figsize=(4, 4))plt.axis('off')plt.imshow(augmented_image)

SOLT

    SOLT 是一个深度学习数据增强库,支持图像、分割掩码、标签和关键点。SOLT 也很快,并且在其后端有 OpenCV。完整的自动生成的文档和示例可以在这里找到:https ://mipt-oulu.github.io/solt/.

    我们将从使用 pip 命令安装 SOLT 开始:

pip install solt

    然后我们将导入增强图像数据所需的所有必要的 SOLT 包:​​​​​​​

import soltimport solt.transforms as slth, w, c = input_img.shapeimg = input_img[:w]

    在这里,我们将为扩充管道创建一个 Stream 实例。您必须提供扩充列表作为流类的参数:​​​​​​​

stream = solt.Stream([    slt.Rotate(angle_range=(-90, 90), p=1, padding='r'),    slt.Flip(axis=1, p=0.5),    slt.Flip(axis=0, p=0.5),    slt.Shear(range_x=0.3, range_y=0.8, p=0.5, padding='r'),    slt.Scale(range_x=(0.8, 1.3), padding='r', range_y=(0.8, 1.3), same=False, p=0.5),    slt.Pad((w, h), 'r'),    slt.Crop((w, w), 'r'),    slt.Blur(k_size=7, blur_type='m'),    solt.SelectiveStream([        slt.CutOut(40, p=1),        slt.CutOut(50, p=1),        slt.CutOut(10, p=1),        solt.Stream(),        solt.Stream(),    ], n=3),], ignore_fast_mode=True)fig = plt.figure(figsize=(17,17))n_augs = 10random.seed(2)for i in range(n_augs):    img_aug = stream({'image': img}, return_torch=False, ).data[0].squeeze()    ax = fig.add_subplot(1,n_augs,i+1)    if i == 0:        ax.imshow(img)    else:        ax.imshow(img_aug)    ax.set_xticks([])    ax.set_yticks([])plt.show()

总结

    图像增强可以帮助增加现有数据集。目前有几个 Python 库可用于图像增强。在本文中,我们使用三个 Python 库——Imgaug、Albalentations和Solt探索了不同的图像增强技术。

    希望你喜欢阅读这篇文章!下次训练机器学习或深度学习模型时,请尝试使用这三个库中的一个以及本文中分享的技术,以快速生成额外的图像数据。

下载1:Pytoch常用函数手册

在「OpenCV与AI深度」号后台回复:Pytorch函数手册能够学习下载全网第一份Pytorch函数常用手册,包括Tensors介绍、基础函数介绍、数据处理函数、优化函数、CUDA编程、多处理等十四章内容。

下载2:145个OpenCV实例应用代码

在「OpenCV与AI深入」公众号后台回复:OpenCV145能够学习下载145个OpenCV实例应用代码(Python和C++双语言实现)。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐