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官网教程

深度学习图像预测 pytorch pytorch 图像预处理_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() 来组合。

深度学习图像预测 pytorch pytorch 图像预处理_深度学习图像预测 pytorch_02

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 代码示例

直接当调包侠就好

深度学习图像预测 pytorch pytorch 图像预处理_Image_03

深度学习图像预测 pytorch pytorch 图像预处理_归一化_04


深度学习图像预测 pytorch pytorch 图像预处理_归一化_05


下面是比较常用的:

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])
])