介绍transforms之前先简单介绍一下torchvision。
torchvision是PyTorch的计算机视觉工具包,包含了一些与CV相关的处理。有三个需要重要介绍:
在transforms中除了具体的预处理方法之外,有一个Compose操作,这里提前介绍,它可以将一系列transforms操作有序地组合包装,以此按顺序执行每一项操作。
torchvision.transforms.Compose(transforms)
参数:
如:
>>> transforms.Compose([
>>> transforms.CenterCrop(10),
>>> transforms.ToTensor(),
>>> ])
transforms的操作一般的目的是为了图像预处理和数据增强,所谓数据增强,又称数据增广、数据扩增,它是对训练集进行变换,使训练集更丰富,从而让模型更具泛化能力。下面将介绍二十多种具体的transforms的方法。
功能:从图片中随机裁剪出尺寸为size的部分,图像可以是PIL格式或者是张量。
torchvision.transforms.RandomCrop(size, padding=None, pad_if_needed=False, fill=0, padding_mode='constant')
下面看一下随机裁剪的几个例子及其效果,变换前图片的原始尺寸为224×224,如下图所示:
(1)随机裁剪尺寸为224,padding=16,即四边都填充16个像素,就是在256×256的范围随机裁剪224×224的大小,效果如下图所示:
transforms.RandomCrop(224, padding=16)
(2)随机裁剪尺寸为224,padding=(16, 64),即左右填充16个像素,上下填充64个像素,就是在256×352 的范围随机裁剪224×224的大小,效果如下图所示:
transforms.RandomCrop(224, padding=(16, 64))
(3)与(1)不同之处就在于像素的填充,这里设定了填充的像素值为(255, 0, 0),效果如下图所示:
transforms.RandomCrop(224, padding=16, fill=(255, 0, 0))
(4)随机裁剪的尺寸为512,大于原始图像的尺寸224,所以pad_if_needed必须设置为True来进行自动填充,扩大尺寸(填充是随机的),效果如下图所示:
transforms.RandomCrop(512, pad_if_needed=True)
(5)与(1)或(3)不同的是,填充模式设定为‘edge’,效果如下图所示:
transforms.RandomCrop(224, padding=64, padding_mode='edge')
(6)与(1)或(3)或(5)不同的是,填充模式设定为 ‘reflect’ ,效果如下图所示:
transforms.RandomCrop(224, padding=64, padding_mode='reflect')
transforms.RandomCrop(1024, padding=1024, padding_mode='symmetric')
功能:从图像中心裁剪图片,图片可以是PIL格式或是张量。
torchvision.transforms.CenterCrop(size)
transforms.CenterCrop(128)
transforms.CenterCrop(512)
功能:随机大小、长宽比裁剪图片,图片可以是PIL格式或是张量。
torchvision.transforms.RandomResizedCrop(size, scale=(0.08, 1.0), ratio=(0.75, 1.3333333333333333), interpolation=2)
例子如下:裁剪出来的部分是原来部分面积的0.5倍,但是大小又必须为224不变,所以用了默认了插值方法PIL.Image.BILINEAR。
transforms.RandomResizedCrop(size=224, scale=(0.5, 0.5))
功能:对给定图像的四个角以及中心进行裁剪,图片可以是PIL格式或是张量,返回一个包含五个元素的元组(tuple),一般都要紧跟一个将元组转变为张量的操作,而且还要注意前后代码尺寸上的匹配。
torchvision.transforms.FiveCrop(size)
参数size同上。
例子如下,紧跟了一个将元组变换为张量的操作:
transforms.FiveCrop(112)
transforms.Lambda(lambda crops: torch.stack([(transforms.ToTensor()(crop)) for crop in crops])),
功能:在图像(PIL格式或者是张量)的上下左右四个角以及中心裁剪出尺寸为size的5张图片,TenCrop对这5张图片进行水平或垂直镜像从而获得10张图片。
torchvision.transforms.TenCrop(size, vertical_flip=False)
transforms.TenCrop(112, vertical_flip=False)
transforms.Lambda(lambda crops: torch.stack([(transforms.ToTensor()(crop)) for crop in crops])),
功能:依概率水平翻转,输入图像为PIL格式或是张量。
torchvision.transforms.RandomHorizontalFlip(p=0.5)
transforms.RandomHorizontalFlip(p=1)
功能:依概率垂直翻转,输入图像为PIL格式或是张量。
torchvision.transforms.RandomVerticalFlip(p=0.5)
transforms.RandomVerticalFlip(p=1)
功能:随机旋转图片。
torchvision.transforms.RandomRotation(degrees, resample=False, expand=False, center=None, fill=None)
注意:expand的计算公式是针对中心点旋转的,若设置为左上角旋转或者其他点为旋转中心,则不能保证保持原图信息。
下面看几个例子:
(1)中心点旋转,范围(-90度,90度):
transforms.RandomRotation(90)
transforms.RandomRotation((90), expand=True)
transforms.RandomRotation(30, center=(0, 0))
(4)旋转中心为左上角并进行expand:
transforms.RandomRotation(30, center=(0, 0), expand=True)