torchvision.transforms是包含一系列常用图像变换方法的包,可用于图像预处理、数据增强等工作,但是注意它更适合于classification等对数据增强后无需改变图像的label的情况,对于Segmentation等对图像增强时需要同步改变label的情况可能不太实用,需要自己重新封装一下。
官方文档:https://pytorch.org/docs/stable/torchvision/transforms.html
部分函数的使用示例可见我的github:https://github.com/TaiYChen/Notebook_Share_Code/blob/master/transforms_example.ipynb
一、Compose
二、对PIL图像的变换
三、对torch.Tensor的变换
四、PIL与Tensor的相互转换
五、通用变换
六、Functional Transforms(待续)
一、Compose
首先介绍torchvision.transforms.Compose(),它的参数是一个由多个transforms包中的方法组成的list,其作用是将list对应的一系列操作组合起来成为一个整体,方便对所有图像做同样的操作。例如:
import torchvision.transforms as transforms
from PIL import Image
import matplotlib.pyplot as plt
from matplotlib.pyplot import imshow
%matplotlib inline
trans_list = [transforms.CenterCrop(100),
transforms.RandomHorizontalFlip(p=1)]
my_trans = transforms.Compose(trans_list)
img = Image.open(r"lena.jpg")
plt.subplot(121)
imshow(img)
my_img = my_trans(img)
plt.subplot(122)
imshow(my_img)
plt.show()
通过Compose(trans_list)将CenterCrop(100)、RandomHorizontalFlip(p=1)两个操作组合到一起,按先后顺序对输入图像进行操作。其中
CenterCrop(size):
在给定的PIL图像的中心裁剪出给定size大小的图像,若给定size为int型,则返回sizesize大小的图像,若为(h,w)型的序列,则返回hw大小的图像。
RandomHorizontalFlip(p=0.5)
以概率p水平翻转PIL图像,p默认为0.5,本例中指定p=1即一定进行水平翻转操作。
实际应用时可以在trans_list中加入更多的方法,上述代码的实验结果:
左侧为lena原图,右图为经过中心裁剪、水平翻转操作后的图。
二、对PIL图像的变换
用PIL.Image读取到的图像转换为ndarray格式后的size为(H,W[,C])对于彩色图像,C=3,依次对应RGB通道,对于灰度图像则无C分量
参数细节可见官方文档
除已经介绍的CenterCrop、RandomHorizontalFlip之外其他操作:
ColorJitter(brightness=0,contrast=0,saturation=0,hue=0)
随机改变图像的亮度、对比度、饱和度、色调
FiveCrop(size)
返回给定图像裁剪出的size大小的四角和中心
Grayscale(num_output_channels=1)
将图像转换成1channel或3channel完全相等的灰度图
Pad(padding,fill=0,padding_mode='constant')
padding参数给定各边填充的像素数,fill给定默认的填充值仅当padding_mode='constant'时起作用,padding_mode指定是用常数填充’constant'、图像边缘值填充'edge'、反射填充'reflect'还是
对称填充’symmetric'
RandomAffine(degrees,translate=None,scale=None,shear=None,resample=False,fillcolor=0)
保持图像中心不变的中心仿射变换
degrees给定旋转角度的取值范围,translate给定沿各方向随机平移因子的取值范围,scale给定随机缩放范围,shear就是以某一系数对单方向的像素点进行变换通过此参数给定系数变化范围,resample给定重采样方式{PIL.Image.NEAREST, PIL.Image.BILINEAR, PIL.Image.BICUBIC},fillcolor给定在变换后图像外的空区域的填充像素的灰度值或RGB值
RandomApply(transforms,p=0.5)
对给定图像以概率p进行由transforms(list或tuple形式,与Compose类似)指定的操作
RandomChoice(transforms)
在transforms(list形式)中随机选择一个方法进行操作
RandomCrop(size,padding=None,pad_if_needed=False,fill=0,padding_mode='constant')
随机裁剪
RandomGrayScale(p=0.1)
以概率p随机变为灰度图,并保持channel数不变(即输入图像为3channel图,则返回r==g==b的图像)
RandomOrder(transforms)
以随机顺序执行transforms(list形式)中指定的系列操作
RandomPerspective(distortion_scale=0.5,p=0.5,interpolation=3)
随机透视变换,即将图像投影到一个新的视平面
RandomResizedCrop(size,scale=(0.08,1.0),ratio=(0.75,1.333333333),interpolation=2)
随机放缩、裁剪后重新放缩至size
RandomRotation(degrees,resample=False,expend=False,center=None,fill=0)
旋转图像
RandomVerticalFlip(p=0.5)
以概率p竖直翻转图像
Resize(size,interpolation=2)
将图像缩放到给定size
TenCrop(size,vertical_flip=False)
返回四角及中心以及他们的翻转版本(默认水平翻转)
三、对torch.Tensor的变换
为将图像放入GPU进行计算,需将PIL格式或者ndarray格式转换为Tensor
Normalize(mean,std,inplace=False)
标准化处理,处理后Tensor的范围变为[-1.0,1.0],input[channel] =
(input[channel] -mean[channel]) / std[channel]
LinearTransformation(transformation_matrix, mean_vector)
利用平方变换矩阵和离线计算的平均矢量变换张量图像。给定变换矩阵和平均矢量,将使torch.*张量拉平,并从中减去平均矢量,然后用变换矩阵计算点积,然后将张量重塑为其原始形状。
RandomErasing(p=0.5, scale=(0.02, 0.33), ratio=(0.3, 3.3), value=0, inplace=False)
随机选择一块长方形区域,擦除相应位置的像素值
四、PIL与Tensor的相互转换
ToTensor
将形为(H,W,C),取值范围为[0,255]的PIL或ndarray的图像转化为形为(C,H,W)取值为[0.0,1.0]的Tensor
ToPILImage(mode=None)
将Tensor转化为PIL图像
五、通用变换
Lambda(lambda)
lambda是自定义函数
(见github的示例)