torchvision.transforms
- 1. 前言
- 2. 功能介绍
- 2.1 Transforms on PIL Image only
- 2.2 Conversion Transforms
- 2.3 Transforms on torch.*Tensor only
- 3 代码示例
1. 前言
很多基于Pytorch的工具集都非常好用,比如处理图像视频的torchvision、处理音频的torchaudio、以及处理自然语言的torchtext,详见pytorch官网教程
这里介绍的处理图像视频的torchvision参考官网包含6个模块:
- torchvision.datasets
- torchvision.io
- torchvision.models
- torchvision.ops
- torchvision.transforms
- torchvision.utils
其中torchvision.transforms提供了常用的图像操作,例如随机切割、旋转、数据类型转换、tensor与numpy 和PIL Image的互换等
2. 功能介绍
torchvision.transforms模块按照功能,可分为以下几个部分,所有转换均可用torchvision.transforms.Compose() 来组合。
2.1 Transforms on PIL Image only
- Resize:把给定的图片resize到给定的尺寸。
- ToPILImage: 将torch.tensor 转换为PIL图像。
- CenterCrop:以输入图的中心点为中心做指定size的裁剪操作。
- RandomCrop:以输入图的随机位置为中心做指定size的裁剪操作。
- RandomHorizontalFlip:随机水平翻转给定的PIL.Image,概率为0.5。即:一半的概率翻转,一半的概率不翻转。
- RandomVerticalFlip:随机垂直翻转给定的PIL.Image,概率为0.5。
- RandomResizedCrop:将给定图像随机裁剪为不同的大小和宽高比,然后再resize成给定的size大小。
- Grayscale:将给定图像转换为灰度图像。
- RandomGrayscale:将图像以指定的概率转换为灰度图像。
- FiveCrop: 从一张输入图像中裁剪出5张指定size的图像,包括4个角的图像和一个中心。
- TenCrop:剪出10张指定size的图像。做法是在FiveCrop的基础上,再将输入图像进行水平或竖直翻转,然后进行FiveCrop操作,这样一张图像可得到10张crop图像。
- Pad:将给定的PIL.Image的所有边用给定的pad value填充。
- ColorJitter:修改图像的亮度,对比度,饱和度和色度。
- Lambda:做其参数指定的变换。
2.2 Conversion Transforms
PIL.Image/numpy.ndarray与Tensor的相互转换。
from torchvision import transforms
transform1 = transforms.Compose([
transforms.ToTensor() #PIL Image/ndarray (H,W,C) [0,255] to tensor (C,H,W) [0.0,1.0]
])
一般我们加载的数据,RGB的值范围是[0,255],经过ToTensor除以255归一化到[0,1]
2.3 Transforms on torch.*Tensor only
- transforms.Normalize(mean, std, inplace=False)。
在tensor上进行的转换(即需要转化为tensor后再操作),逐channel的对图像进行标准化(均值变为0,标准差变为1),可以加快模型的收敛。
- 公式:output = (input - mean) / std
- mean:各通道(RGB)的均值
- std:各通道的标准差
- inplace:是否原地操作
from torchvision import transforms
transform1 = transforms.Compose([
transforms.ToTensor()
transforms.Normalize([0.5, 0.5, 0.5],[0.5, 0.5, 0.5])
根据公式,计算过程为:
input = [0,1]
output[0] = (0-0.5)/0.5=-1
output[1] = (1-0.5)/0.5=1
将input = [0,1]归一化到output = [-1,1]
Pytorch图像预处理时,通常使用transforms.Normalize(mean, std)对图像按通道进行标准化,即减去均值,再除以方差。这样做可以加快模型的收敛速度。其中参数mean和std分别表示图像每个通道的均值和方差序列。
另外可以计算指定图像数据集的均值和方差用于transforms.Normalize()标准化,可参考示例:
3 代码示例
直接当调包侠就好
下面是比较常用的:
from torchvision import transforms
transforms = transforms.Compose(
[
transforms.Resize(224),
transforms.RandomResizedCrop(size=256, scale=(0.8, 1.0)),#scale为随机裁剪面积比例
transforms.RandomRotation(degrees=15),#随机旋转
transforms.RandomHorizontalFlip(),#随机水平翻转
transforms.RandomVerticalFlip(),#随机垂直翻转
transforms.CenterCrop(size=224),#中心裁剪到224*224
transforms.ToTensor(),#转化成张量
transforms.Normalize([0.485, 0.456, 0.406],#归一化
[0.229, 0.224, 0.225])
])