transforms图像增强(一)

发布时间:2024年01月06日

一、数据增强

数据增强(Data Augmentation)是一种常用的数据预处理技术,通过对训练集进行各种变换和扩增操作,可以增加训练数据的多样性和丰富性,从而提高模型的泛化能力。

数据增强的目的是通过对训练集中的图像进行随机变换,生成更多样的图像样本,以模拟真实世界中的各种场景和变化。这样可以帮助模型学习到更多不同的特征和模式,提高模型对于不同样本的适应能力,减少过拟合的风险。

常见的数据增强操作包括图像翻转、旋转、缩放、裁剪、平移、变换色彩空间、添加噪声等。这些操作可以通过图像处理库(如PIL、OpenCV)或深度学习框架中的数据增强模块(如torchvision.transforms)来实现。

数据增强是深度学习中的一项重要技术,可以有效提升模型的性能和鲁棒性(模型对于输入数据的扰动、噪声、异常值等干扰的抵抗能力),尤其在数据量有限的情况下,通过增加样本的多样性,可以更好地训练出泛化能力强的模型。

在这里插入图片描述

二、transforms——裁剪

transforms.CenterCrop(size)

transforms.CenterCrop(size)

transforms.CenterCrop是一个数据转换操作,用于从图像中心裁剪图片。
参数:

  • size:所需裁剪图片的尺寸,可以是一个整数或一个元组(width, height)。如果是一个整数,则表示裁剪出的图片将具有相等的宽度和高度。
    使用transforms.CenterCrop可以将输入图像从中心位置裁剪为指定尺寸的图片。裁剪后的图片将保持图像的中心部分,并且其尺寸将与指定的尺寸相匹配。

示例:

import torchvision.transforms as transforms

# 定义数据转换操作
transform = transforms.Compose([
    transforms.CenterCrop(256)  # 中心裁剪为256x256像素
])

# 对图像进行中心裁剪为256x256像素
cropped_image = transform(image)

在上面的示例中,transforms.CenterCrop(256)将输入图像裁剪为256x256像素的图片。裁剪后的图片将保留图像的中心部分,并且尺寸将调整为256x256像素。

在这里插入图片描述
在这里插入图片描述

transforms.RandomCrop

transforms.RandomCrop(size, padding=None, pad_if_needed=False, fill=0, padding_mode='constant')

transforms.RandomCrop是一个数据转换操作,用于从图片中随机裁剪出指定尺寸的图片。
参数:

  • size:所需裁剪图片的尺寸,可以是一个整数或一个元组(width, height)。如果是一个整数,则表示裁剪出的图片将具有相等的宽度和高度。
  • padding:填充大小,可以是一个整数、一个元组或一个列表。当为整数时,表示上下左右均填充相同数量的像素;当为元组或列表时,分别表示左、上、右、下的填充数量。
  • pad_if_needed:若图像小于设定的尺寸,则是否进行填充,默认为False。
  • fill:填充的像素值,默认为0。
  • padding_mode:填充模式,有4种模式
    1、constant:像素值由 fill 设定
    2、edge:像素值由图像边缘像素决定
    3、reflect:镜像填充,最后一个像素不镜像,eg:[1,2,3,4] → [3,2,1,2,3,4,3,2]
    4、symmetric:镜像填充,最后一个像素镜像,eg:[1,2,3,4] → [2,1,1,2,3,4,4,3]

使用transforms.RandomCrop可以在保持图像比例的情况下,随机裁剪出指定尺寸的图片。裁剪时会随机选择裁剪的起始位置,并保证裁剪后的图片尺寸与指定的尺寸相匹配。如果需要进行填充,则会根据填充大小和填充模式进行填充操作。

示例:

import torchvision.transforms as transforms
transform = transforms.Compose([
    transforms.RandomCrop(256, padding=(10, 20, 30, 40), pad_if_needed=True, fill=255, padding_mode='constant')
])
# 对图像进行随机裁剪为256x256像素,若图像小于256x256则进行填充,填充大小为(10, 20, 30, 40),填充像素值为255
cropped_image = transform(image)

在上面的示例中,transforms.RandomCrop(256, padding=(10, 20, 30, 40), pad_if_needed=True, fill=255, padding_mode='constant')将输入图像随机裁剪为256x256像素的图片。如果输入图像的尺寸小于256x256,则会进行填充,填充大小为(10, 20, 30, 40),填充像素值为255,填充模式为常数填充。

注意:在使用transforms.RandomCrop进行随机裁剪时,如果输入图像的尺寸小于指定的裁剪尺寸,且pad_if_needed参数为False,则裁剪操作将不会进行,而是抛出异常。因此,建议在应用随机裁剪之前,先对图像进行适当的缩放或填充操作,以确保图像尺寸满足裁剪要求。

transforms.RandomResizedCrop

transforms.RandomResizedCrop是一个数据转换操作,用于随机裁剪图片,并按照指定的尺寸进行缩放。
参数:

  • size:所需裁剪图片的尺寸,可以是一个整数或一个元组(width, height)。如果是一个整数,则表示裁剪出的图片将具有相等的宽度和高度。
  • scale:随机裁剪面积比例,默认为(0.08, 1.0)。裁剪面积比例是指裁剪区域相对于原始图像的面积比例范围。
  • ratio:随机长宽比,默认为(3/4, 4/3)。长宽比是指裁剪区域的宽度与高度之比的范围。
  • interpolation:插值方法,默认为PIL.Image.BILINEAR。可选的插值方法有PIL.Image.NEAREST(最近邻插值)、PIL.Image.BILINEAR(双线性插值)和PIL.Image.BICUBIC(双三次插值)。

使用transforms.RandomResizedCrop可以在保持图像比例的情况下,随机裁剪出指定尺寸的图片,并按照指定的插值方法进行缩放。

示例:

import torchvision.transforms as transforms
transform = transforms.Compose([
    transforms.RandomResizedCrop(256, scale=(0.5, 1.0), ratio=(3/4, 4/3), interpolation=Image.BICUBIC)
])
# 对图像进行随机裁剪为256x256像素,并按照指定的缩放比例和长宽比进行裁剪,使用双三次插值进行缩放
cropped_image = transform(image)

在上面的示例中,transforms.RandomResizedCrop(256, scale=(0.5, 1.0), ratio=(3/4, 4/3), interpolation=Image.BICUBIC)将输入图像随机裁剪为256x256像素的图片。裁剪时,会随机选择裁剪的面积比例和长宽比,并按照指定的插值方法进行缩放。

注意:在使用transforms.RandomResizedCrop进行随机裁剪时,裁剪区域的面积比例和长宽比是随机选择的,可以通过调整scaleratio参数来控制裁剪的范围。同时,建议在应用随机裁剪之前,先对图像进行适当的缩放或填充操作,以确保图像尺寸满足裁剪要求。

transforms.FiveCrop

transforms.FiveCrop是数据转换操作,用于在图像的不同位置进行裁剪。
transforms.FiveCrop功能是在图像的上下左右以及中心位置裁剪出尺寸为size的5张图片。
参数:

  • size:所需裁剪图片的尺寸,可以是一个整数或一个元组(width, height)。如果是一个整数,则表示裁剪出的图片将具有相等的宽度和高度。
    使用transforms.FiveCrop可以在图像的上下左右以及中心位置裁剪出尺寸为size的5张图片。
    示例:
import torchvision.transforms as transforms
transform = transforms.Compose([
    transforms.FiveCrop(256)
])
# 对图像进行上下左右以及中心位置裁剪为256x256像素的5张图片
cropped_images = transform(image)

在上面的示例中,transforms.FiveCrop(256)将输入图像在上下左右以及中心位置裁剪为尺寸为256x256像素的5张图片。

transforms.TenCrop

transforms.TenCrop是数据转换操作,功能是在图像的上下左右以及中心位置裁剪出尺寸为size的5张图片,并对这5张图片进行水平或者垂直镜像,从而得到10张图片。

参数:

  • size:所需裁剪图片的尺寸,可以是一个整数或一个元组(width, height)。如果是一个整数,则表示裁剪出的图片将具有相等的宽度和高度。
  • vertical_flip:是否进行垂直翻转,默认为False。如果设置为True,则对裁剪出的图片进行垂直翻转。

使用transforms.TenCrop可以在图像的上下左右以及中心位置裁剪出尺寸为size的5张图片,并对这5张图片进行水平或者垂直镜像,从而得到10张图片。
示例:

import torchvision.transforms as transforms
transform = transforms.Compose([
    transforms.TenCrop(256, vertical_flip=True)
])
# 对图像进行上下左右以及中心位置裁剪为256x256像素的5张图片,并进行垂直翻转,得到10张图片
cropped_images = transform(image)

在上面的示例中,transforms.TenCrop(256, vertical_flip=True)将输入图像在上下左右以及中心位置裁剪为尺寸为256x256像素的5张图片,并对这5张图片进行垂直翻转,从而得到10张图片。

注意:在使用transforms.FiveCroptransforms.TenCrop进行裁剪时,返回的是一个包含裁剪出的多张图片的列表。要获取这些裁剪图片,可以通过索引访问列表中的元素。

三、transforms——翻转、旋转

transforms----Flip

transforms.RandomHorizontalFliptransforms.RandomVerticalFlip是数据转换操作,用于以一定的概率对图像进行水平或垂直翻转。

transforms.RandomHorizontalFlip功能是以概率p对图像进行水平翻转(左右翻转)。

参数:

  • p:翻转概率,取值范围为0到1之间,默认为0.5。即有50%的概率对图像进行水平翻转。
    使用transforms.RandomHorizontalFlip可以以一定的概率对图像进行水平翻转。

示例:

import torchvision.transforms as transforms
transform = transforms.Compose([
    transforms.RandomHorizontalFlip(p=0.5)
])
# 以50%的概率对图像进行水平翻转
flipped_image = transform(image)

在上面的示例中,transforms.RandomHorizontalFlip(p=0.5)将以50%的概率对输入图像进行水平翻转。


transforms.RandomVerticalFlip功能是以概率p对图像进行垂直翻转(上下翻转)。
参数:

  • p:翻转概率,取值范围为0到1之间,默认为0.5。即有50%的概率对图像进行垂直翻转。
    使用transforms.RandomVerticalFlip可以以一定的概率对图像进行垂直翻转。

示例:

import torchvision.transforms as transforms
transform = transforms.Compose([
    transforms.RandomVerticalFlip(p=0.5)
])
# 以50%的概率对图像进行垂直翻转
flipped_image = transform(image)

在上面的示例中,transforms.RandomVerticalFlip(p=0.5)将以50%的概率对输入图像进行垂直翻转。

注意:在使用transforms.RandomHorizontalFliptransforms.RandomVerticalFlip进行翻转时,每次应用这些转换操作时,都会根据给定的概率进行翻转。因此,每次应用这些转换操作时,得到的结果可能不同。

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

transforms.RandomRotation

transforms.RandomRotation是一种数据转换操作,用于以随机的角度对图像进行旋转。
transforms.RandomRotation功能是随机选择一个角度对图像进行旋转。

参数:

  • degrees:旋转角度。可以是单个角度 a,表示在 (-a, a) 范围内选择旋转角度;也可以是一个范围 (a, b),表示在 (a, b) 范围内选择旋转角度。
  • resample:重采样方法。默认为 False,表示不进行重采样。
  • expand:是否扩大图片。默认为 False,表示不扩大图片。
    使用transforms.RandomRotation可以对图像进行随机角度的旋转。
    示例:
import torchvision.transforms as transforms
transform = transforms.Compose([
    transforms.RandomRotation(degrees=30)
])
# 随机选择一个角度在 (-30, 30) 范围内对图像进行旋转
rotated_image = transform(image)

在上面的示例中,transforms.RandomRotation(degrees=30)将在 (-30, 30) 范围内随机选择一个角度对输入图像进行旋转。
transforms.RandomRotation还可以设置重采样方法和是否扩大图片,具体使用方法可参考官方文档。

注意:每次应用transforms.RandomRotation时,都会随机选择一个角度对图像进行旋转,因此每次应用这个转换操作时,得到的结果可能不同。


transforms.Lambda

transforms.Lambda是一个数据转换操作,它允许你使用自定义的函数来对数据进行转换。
transforms.Lambda功能是将自定义的函数应用于输入数据。
参数:

  • lambd:自定义函数。这个函数接受一个参数,并返回转换后的结果。
    使用transforms.Lambda可以使用自定义的函数对数据进行转换。
    示例:
import torchvision.transforms as transforms
def custom_transform(x):
    # 自定义转换函数
    # 在这里对输入数据 x 进行处理,并返回转换后的结果
    transformed_data = ...
    return transformed_data
transform = transforms.Compose([
    transforms.Lambda(custom_transform)
])
# 使用自定义的函数对输入数据进行转换
transformed_data = transform(data)

在上面的示例中,transforms.Lambda(custom_transform)将使用自定义的函数 custom_transform 对输入数据进行转换。
你可以根据自己的需求编写自定义的转换函数,并在transforms.Lambda中使用它来对数据进行转换。
注意:自定义函数的输入和输出可以是任意类型,但请确保函数的输入和输出类型与你的数据相匹配。


transforms.Lambda(lambda crops: torch.stack([(transforms.ToTensor()(crop)) for crop in crops])),

冒号之前lambda crops是函数的输入,冒号之后torch.stack([(transforms.ToTensor()(crop)) for crop in crops])是函数的返回值

文章来源:https://blog.csdn.net/weixin_46334272/article/details/135395701
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。