帝国cms调用网站地址,网站没有织梦后台,中国哪家网站做仿古做的好,求一个做门窗技术的网站使用imgaug快速观察Python中的数据增强技术
在本文中#xff0c;我们将使用imgaug库来探索Python中不同的数据增强技术
什么是图像增强
图像增强是一种强大的技术#xff0c;用于在现有图像中人为地创建变化以扩展图像数据集。这是通过应用不同的变换技术来实现的#xf…使用imgaug快速观察Python中的数据增强技术
在本文中我们将使用imgaug库来探索Python中不同的数据增强技术
什么是图像增强
图像增强是一种强大的技术用于在现有图像中人为地创建变化以扩展图像数据集。这是通过应用不同的变换技术来实现的例如缩放、旋转、剪切或裁剪现有图像。目标是创建一组全面的可能图像代表各种变化。
为什么需要图像增强
图像增强在深度学习卷积神经网络 (CNN) 背景下至关重要因为它有助于满足有效模型训练对大型且多样化数据集的需求。 CNN 需要大量图像才能有效训练而图像增强提供了一种人为扩展现有数据集的方法。通过缩放、旋转、剪切或裁剪等技术创建图像变化图像增强有助于生成更全面的可能图像集。这种多样化的数据集使模型能够更好地泛化减少过度拟合并在测试或验证过程中对以前未见过的数据进行评估时提高其性能。因此图像增强对于提高训练数据的质量和数量至关重要最终导致更强大和更准确的 CNN 模型。
什么时候使用图像增强
图像增强可以作为训练模型之前的预处理步骤也可以在训练过程中实时应用。当用作预处理步骤时应用增强来增加数据集的大小特别是在处理需要扩展的小型训练数据集时。这种方法称为离线或预处理增强涉及生成现有图像的变体以创建更多样化的数据集。应用图像增强时仔细考虑问题领域非常重要因为某些增强策略可能与特定任务无关或无用。例如在对不同类型的汽车进行分类时垂直翻转汽车可能不会为数据集增加价值。因此图像增强的应用应根据问题领域的具体要求进行定制。
离线或预处理增强
离线或预处理增强是指应用图像增强作为预处理步骤来增加数据集的大小。这种方法通常在处理需要扩展的小型训练数据集时使用。通过生成现有图像的变化例如翻转、旋转或缩放离线增强可以为训练机器学习模型创建更加多样化的数据集。应用离线增强时特别是在处理较大的数据集时考虑磁盘空间非常重要。这种方法允许在训练过程开始之前创建一组全面的可能图像最终提高训练数据的质量和数量。
在线或实时增强
在线或实时增强涉及在训练过程中实时应用增强技术。这种方法通常用于较大的数据集因为它不需要将增强图像保存在磁盘上。通过实时应用增强模型在每个时期看到不同的图像从而有助于训练数据的多样性。实时增强在处理较大的数据集时特别有用因为它减少了与保存增强图像相关的存储要求。这种方法允许在训练过程中动态应用增强技术有助于模型从各种图像变化中学习的能力。
我们将使用imgaug类来演示图像增强。imgaug支持广泛的数据增强技术
基本数据增强技术 翻转Flipping垂直或水平翻转图像 旋转Rotation按指定的程度旋转图像 剪切Shearing像平行四边形一样移动图像的一部分 裁剪Cropping对象在图像中以不同的比例出现在不同的位置上 放大缩小Zoom in, Zoom out 改变亮度或对比度
现在将使用imgaug库探索这些数据增强技术
实践Imgaug
imgaug是一个用于图像增强的库包括关键点/地标、边界框、热图和分割图。
git项目地址https://github.com/aleju/imgaug项目文档地址https://imgaug.readthedocs.io/en/latest 安装
pip install imageio imgaug
pip install imgaug — upgrade — no-deps # 出现错误时候采用这种导入相关的依赖包
import imageio
import imgaug as ia
import imgaug.augmenters as iaa
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import matplotlib
%matplotlib inline展示原有图像
image imageio.v2.imread(./Lenna.jpg)
ia.imshow(image)旋转图像Rotating
可以通过指定旋转度来旋转图像随机将图像旋转-50度到30度之间旋转角度可以是负值表示逆时针旋转也可以是正值表示顺时针旋转
rotate iaa.Affine(rotate(-50, 30))
rotated_image rotate.augment_image(image)
ia.imshow(rotated_image)图像添加噪声Noise
将不同的从高斯分布元素采样的噪声值添加到图像中参数10和20分别表示噪声的均值和标准差。高斯噪声是一种常见的随机噪声它的数值符合高斯分布也称为正态分布。均值参数决定了噪声的中心位置标准差参数决定了噪声的强度。
gaussian_noise iaa.AdditiveGaussianNoise(10, 20)
noise_image gaussian_noise.augment_image(image)
ia.imshow(noise_image)图像裁剪Cropping
裁剪将删除图像两侧的列/行像素。在下面的例子中将图像的一侧随机裁剪0~30% 随机的裁剪使图像具有更多的多样性和变化。裁剪操作可以用于去除图像边缘的无用信息、调整图像的组成或者创建更密集的图像副本等。
crop iaa.Crop(percent(0, 0.3)) # crop image
corp_image crop.augment_image(image)
ia.imshow(corp_image)图像剪切Shearing
剪切图像随机0到40度错切变换会将图像的一部分按照一定角度进行平移从而改变图像的形状和内容。可以用于创建透视效果、扭曲图像的形状或者模拟某些特定场景下的形变。
shear iaa.Affine(shear(0, 40))
shear_imageshear.augment_image(image)
ia.imshow(shear_image)图像翻转Flipping
可以垂直地或水平地翻转图像 这里展示Fliplr水平翻转图像。水平翻转可以用于纠正图像的方向、增加训练数据的多样性或者模拟镜像对称的场景。
#flipping image horizontally
flip_hr iaa.Fliplr(p1.0) # 翻转概率100% 小于1.0时候是随机翻转可能不翻转
flip_hr_image flip_hr.augment_image(image)
ia.imshow(flip_hr_image)Filpud垂直翻转图像
flip_vr iaa.Flipud(p1.0) # 翻转概率为100%
flip_vr_image flip_vr.augment_image(image)
ia.imshow(flip_vr_image)图像改变亮度brightness
通过缩放像素值来调整图像的亮度。在Gamma(0.5, 2.0)范围内的值是合理的。也可以使用符号对比度或线性对比度来改变图像的亮度。伽马对比度增强器会应用一个伽马变换到图像上通过调整图像的亮度和对比度来改变图像的外观。伽马值决定了变换的强度较高的伽马值会增加图像的对比度使得图像的暗部更暗亮部更亮。
contrast iaa.GammaContrast(gamma2.0)
contrast_image contrast.augment_image(image)
ia.imshow(contrast_image)图像缩放Scale
可以使用比例尺放大或缩小图像。下面的图像缩放到图像高度/宽度的150%到80%。此外也可以独立地缩放每个轴。函数会随机选择一个缩放比例范围在1.0到1.5之间并分别应用于图像的x和y方向。较小的缩放比例会使图像变小而较大的缩放比例会使图像变大。缩放变换可以用于调整图像的尺寸、改变物体的比例或者模拟不同距离下的图像。
scale_im iaa.Affine(scale{x: (1.5, 1.0), y: (1.5, 1.0)})
scale_image scale_im.augment_image(image)
ia.imshow(scale_image)对目标检测的增强
为目标检测绘制边界框。当增强图像时希望边界框也被相应地更新。imgaug为边界框提供了支持。当旋转、剪切或裁剪图像时对象周围的边界框也会相应地更新。
导入边界框
from imgaug.augmentables.bbs import BoundingBox, BoundingBoxesOnImage原图画出框
bbs BoundingBoxesOnImage([BoundingBox(x180, x2140, y170, y2150)], shapeimage.shape)
ia.imshow(bbs.draw_on_image(image, size2))在下面的代码中使用平移百分比来移动图像扩大边界框并将其应用到图像上
move iaa.Affine(translate_percent{x: 0.1}, scale0.8)
image_aug, bbs_aug move(imageimage, bounding_boxesbbs)
ia.imshow(bbs_aug.draw_on_image(image_aug, size2))在应用图像增强功能后处理图像外部的边界框
边界框有时可能会在图像之外需要额外的代码来处理这样的情况旋转图像并尝试在对象周围绘制边界框。
rotate_bb iaa.Affine(rotate(-50, 30))
image_aug, bbs_aug rotate_bb(imageimage, bounding_boxesbbs)
ia.imshow(bbs_aug.draw_on_image(image_aug, size2))边界框的某些部分都在图像的外部。在下面的代码中会看到这些问题:
完全或部分删除图像外部的边界框剪切部分在外部的边界框使它们完全在图像内部
创建一个填充功能用1像素白色和1像素黑色边框填充图像
# 填充
def pad(image, by):image_border1 iaa.size.pad(image, top1, right1, bottom1, left1, modeconstant, cval255)image_border2 iaa.size.pad(image_border1, topby-1, rightby-1, bottomby-1, leftby-1, modeconstant, cval0)return image_border2然后在图像上绘制边界框。首先通过边界像素扩展图像平面然后在图像平面内标记边界框
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 GREENelif bb.is_partly_within_image(image.shape):color ORANGEelse:color REDimage_border bb.shift(leftborder, topborder).draw_on_image(image_border, size2, colorcolor)return image_border现在对图像应用相同的旋转并绘制边界框
rotate iaa.Affine(rotate(-50, 30))
image_aug, bbs_aug rotate(imageimage, bounding_boxesbbs)
image_after draw_bbs(image_aug,
bbs_aug.remove_out_of_image().clip_out_of_image(), 100)
ia.imshow(image_after)参考
https://imgaug.readthedocs.io/en/latest/index.htmlhttps://towardsdatascience.com/data-augmentation-techniques-in-python-f216ef5eed69https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.htmlhttps://nanonets.com/blog/data-augmentation-how-to-use-deep-learning-when-you-have-limited-data-part-2/https://github.com/Lexie88rus/augmentation-packages-overview/blob/master/data-augmentation-packages-overview.ipynbA survey on Image Data Augmentation for deep learning.pdf