一、数据增强
数据增强(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
进行随机裁剪时,裁剪区域的面积比例和长宽比是随机选择的,可以通过调整scale
和ratio
参数来控制裁剪的范围。同时,建议在应用随机裁剪之前,先对图像进行适当的缩放或填充操作,以确保图像尺寸满足裁剪要求。
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.FiveCrop
和transforms.TenCrop
进行裁剪时,返回的是一个包含裁剪出的多张图片的列表。要获取这些裁剪图片,可以通过索引访问列表中的元素。
三、transforms——翻转、旋转
transforms----Flip
transforms.RandomHorizontalFlip
和transforms.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.RandomHorizontalFlip
和transforms.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])是函数的返回值