基本形式
from torchvision import transforms as transforms
transform = transforms.Compose([
#处理方式
transforms.ToTensor(),
transforms.Normalize((0.4914, 0.4822, 0.4465), (0.229, 0.224, 0.225)), #R,G,B每层的归一化用到的均值和方差
])
操作的解释(非全部,只是常用的)
- 转化为张量
torchvision的输出是PILImage图像,所以必须转化为tensor才能在pytorch中使用 - 标准化
输出图像的范围是[0,1],对于使用sigmoid激活函数的网络来说,默认[0,1]范围是可以的,但对于使用tanh或relu激活函数的网络来说,[-1,1]的范围更合适一点,所以通过下面的操作将数据转化为[-1,1]
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
具体计算方式是0-0.5/0.5=-1,1-0.5/0.5=1。这两组数据第一个代表三个通道的均值,第二个代表标准差。
如果图像是单通道的,则为
transforms.Normalize((0.5, ), (0.5, ))
值得注意的是,使用0.5作为均值和标准差只是一种通用稳妥的做法,并不一定是最合适的,这与所用数据的真实分布也有关系。对于一些标准数据集,有官方建议的标准化参数,比如MNIST数据集的是(0.1307,), (0.3081,)。Imagenet数据集的参数是([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])。
- 通道变换
对图像进行通道处理,参数为3时得到彩色图像,参数为1时得到灰度图像
transforms.Grayscale(num_output_channels=1)
- 水平翻转
依照给定的概率对图像进行水平翻转,默认概率为0.5。
transforms.RandomHorizontalFlip(0.3)
- 垂直翻转
依照给定的概率对图像进行垂直翻转,默认概率为0.5。
transforms.RandomVerticalFlip(0.3)
6.按一定长宽比随机裁剪
随机长宽比裁剪图像,再将图像重整为设定好的尺寸
size:最终结果输出的图像尺寸。
scale:裁剪的图像所占的范围,默认为(0.08, 1.0)。
ratio:随机裁剪的长宽比,默认为(0.75, 1.3333333333333333)。
interpolation:重整为size时选择的插值方法,默认为双线性插值。
transforms.RandomResizedCrop(size=256, scale=(0.08, 1.0), ratio=(3./4,4./3), interpolation=2)
- 中心裁剪
按给定的size在图像中心裁剪
transforms.CenterCrop(128)
- 随机裁剪
size:例如(128,256)则裁剪结果为128256,若为128,则裁剪结果为128128。
padding:图像周围填充多少个像素。padding=2则周围填充2个像素,如果padding=(2,4),则左右填充2个像素,上下填充4个像素,padding=(1,2,3,4),则左上右下分别填充1,2,3,4个像素。
fill:填充的值是多少,fill=0表示每个通道均填充0,fill=(1,2,3)表示RGB通道分别填充的值是1,2,3。
padding_mode:填充模式
padding_mode=’constant’:填充的是常量,具体为fill参数所规定
padding_mode=’edge’:填充的数值与图像边缘完全一样
transforms.RandomCrop(128, padding=1, pad_if_needed=True, fill=0, padding_mode=‘constant’)
- 重新设置尺寸
size为规定的尺寸,interpolation为插值方式,默认为双线性插值。
transforms.Resize(128, interpolation=2)