PyTorch框架学习六——图像预处理transforms(二)

这次笔记是续PyTorch框架第五次笔记,上次笔记链接为:https://blog.csdn.net/qq_40467656/article/details/107914085

(续)二、transforms的具体方法

4.图像变换

(1)尺寸变换:transforms.Resize()

功能:将输入图像的尺寸resize到给定的尺寸。
操作对象:PIL格式或是张量。

torchvision.transforms.Resize(size, interpolation=2)

参数如下:
在这里插入图片描述

  1. size:同上(上次笔记)。
  2. interpolation:同上(上次笔记)。

原始图像尺寸(224,224):(注意坐标轴)
在这里插入图片描述

transforms.Resize((512, 512))

resize后的结果,注意坐标轴
在这里插入图片描述

(2)标准化:transforms.Normalize()

功能:逐通道的标准化图像,公式为
output[channel] = (input[channel] - mean[channel]) / std[channel]
操作对象:张量。

torchvision.transforms.Normalize(mean, std, inplace=False)

参数如下:
在这里插入图片描述

  1. mean:(序列)每个通道的均值。
  2. std:(序列)每个通道的标准差。
  3. inplace:(布尔,可选)是否为原地操作。

标准化的作用:可以加快模型的收敛。

例子如下,这是RGB三通道图像,所以均值标准差都要有三个:

norm_mean = [0.485, 0.456, 0.406]
norm_std = [0.229, 0.224, 0.225]
transforms.Normalize(norm_mean, norm_std)

在这里插入图片描述

(3)转为tensor:transforms.ToTensor()

功能:将 PIL Image 或 numpy.ndarray 转变为tensor。
操作对象:PIL格式或是ndarray。

torchvision.transforms.ToTensor

在这里插入图片描述
将一个尺寸为(H×W×C)像素值范围[0, 255]的PIL图像或numpy的ndarray转变为尺寸为(C×H×W)像素值范围[0.0, 1.0]。

transforms.ToTensor()

在这里插入图片描述
因为像素值都小于等于1,所以显示不出来,其实像素值是有值的。

(4)将数据转换为PILImage:transforms.ToPILImage()

功能:将张量或ndarray转换为PIL图像,同时保留值的范围。
操作对象:ndarray或是张量。

torchvision.transforms.ToPILImage(mode=None)

参数如下:
在这里插入图片描述

(5)填充:transforms.Pad()

功能:对图片的边缘进行填充。
操作对象:PIL格式或是张量。

torchvision.transforms.Pad(padding, fill=0, padding_mode='constant')

参数如下:
在这里插入图片描述

  1. padding:设置填充的大小。若为a,则四边都填充a个像素距离;若为(a,b),则左右两边填充a个,上下两边填充b个;若为(a,b,c,d),则分别对应左、上、右、下四个边。
  2. fill:只有padding_mode设置为constant时有效,constant模式下要填充的像素值(R、G、B)或(Gray),默认为0。
  3. padding_mode:填充模式,有constant、edge、reflect和symmetric四种,同上。

几个例子如下:

(1)四边都填充32像素,模式为constant,填充值为(255, 0, 0)(红色)。

transforms.Pad(padding=32, fill=(255, 0, 0), padding_mode='constant')

在这里插入图片描述
(2)padding不一样,其他和(1)一样:

transforms.Pad(padding=(8, 64), fill=(255, 0, 0), padding_mode='constant')

在这里插入图片描述
(3)padding不一样,其他和(1)一样:

transforms.Pad(padding=(8, 16, 32, 64), fill=(255, 0, 0), padding_mode='constant')

在这里插入图片描述
(4)模式改成了symmetric,此时的fill无效:

transforms.Pad(padding=(8, 16, 32, 64), fill=(255, 0, 0), padding_mode='symmetric')

在这里插入图片描述

(6)修改亮度、对比度、饱和度:transforms.ColorJitter()

功能:调整亮度、对比度、饱和度和色相。
操作对象:PIL格式或是张量。

torchvision.transforms.ColorJitter(brightness=0, contrast=0, saturation=0, hue=0)

参数如下:
在这里插入图片描述

  1. brightness:亮度调整因子,当为a时,从[max(0, 1-a), 1+a]中随机选择;当为(a, b)时,从[a, b]中随机选择。
  2. contrast:对比度参数,同brightness。
  3. saturation:饱和度参数,同brightness。
  4. hue:色相参数,当为a时,从[-a, a]中选择,0<=a<=0.5;当为(a, b)时,从[a, b]中随机选择,-0.5<=a<=b<=0.5。

例子如下:

(1)亮度:

transforms.ColorJitter(brightness=0.5)

即亮度在[0.5, 1.5]之间选择:
在这里插入图片描述
(2)对比度:

transforms.ColorJitter(contrast=0.5)

在这里插入图片描述
(3)饱和度:

transforms.ColorJitter(saturation=0.5)

在这里插入图片描述
(4)色相:

transforms.ColorJitter(hue=0.3)

在这里插入图片描述

(7)转灰度图:transforms.Grayscale()

功能:将图像转变为灰度图,返回类型为PIL图像。
操作对象:PIL图像。

torchvision.transforms.Grayscale(num_output_channels=1)

参数:
在这里插入图片描述
注意它的返回,通道为3时,三通道的值相等:
在这里插入图片描述
例子如下:

transforms.Grayscale(num_output_channels=3)

在这里插入图片描述

(8)依概率p转为灰度图:transforms.RandomGrayscale()

功能:依概率将图片转换为灰度图。
操作对象:PIL图像。

torchvision.transforms.RandomGrayscale(p=0.1)

在这里插入图片描述

(9)仿射变换:transforms.RandomAffine()

功能:对图像进行仿射变换,仿射变换是二维的线性变换,由五种基本原子构成,分别是旋转、平移、缩放、错切和翻转。
操作对象:PIL格式(或是张量?不清楚张量可不可以)。

torchvision.transforms.RandomAffine(degrees, translate=None, scale=None, shear=None, resample=False, fillcolor=0)

参数如下:
在这里插入图片描述

  1. degrees:旋转角度,同RandomRotation()。
  2. translate:平移区间设置,如(a,b),则水平平移距离在(-img_width×a,img_width×a)区间内选择,垂直平移距离在(-img_height×b,img_height×b)区间内选择,默认不平移。
  3. scale:缩放比例,默认不缩放。
  4. shear:错切角度设置,若为a,则图像会沿着x轴方向错切,错切角度在(-a,a)范围内;若为(a,b),则图像会沿着x轴方向错切,错切角度在(a,b)范围内;若为(a,b,c,d),则图像会沿着x轴方向错切,错切角度在(a,b)范围内,并且沿着y轴错切,错切角度在(c,d)范围内。
  5. resample:插值方法。
  6. fillcolor:填充颜色设置,(R,G,B)或(Gray)。

例子如下:

(1)旋转

transforms.RandomAffine(degrees=30)

在这里插入图片描述
(2)平移

transforms.RandomAffine(degrees=0, translate=(0.2, 0.2), fillcolor=(255, 0, 0))

在这里插入图片描述
(3)缩放

transforms.RandomAffine(degrees=0, scale=(0.7, 0.7))

在这里插入图片描述
(4)y方向错切

transforms.RandomAffine(degrees=0, shear=(0, 0, 0, 45))

在这里插入图片描述
(5)x方向错切

transforms.RandomAffine(degrees=0, shear=90, fillcolor=(255, 0, 0))

在这里插入图片描述

(10)随机遮挡:transforms.RandomErasing()

功能:在图像中随机选择一个矩阵区域并遮挡其像素。
操作对象:张量。

torchvision.transforms.RandomErasing(p=0.5, scale=(0.02, 0.33), ratio=(0.3, 3.3), value=0, inplace=False)

参数如下:
在这里插入图片描述

  1. p:执行随机遮挡操作的概率。
  2. scale:遮挡区域的面积。
  3. ratio:遮挡区域的长宽比。
  4. value:设置遮挡区域的像素值,(R,G,B)或(Gray)。
  5. inplace:是否原地操作,默认False。

例子如下:

(1)

transforms.RandomErasing(p=1, scale=(0.02, 0.33), ratio=(0.3, 3.3), value=(254/255, 0, 0))

在这里插入图片描述
(2)value若是一个字符串,则会是随机填充。

transforms.RandomErasing(p=1, scale=(0.02, 0.33), ratio=(0.3, 3.3), value='1234')

在这里插入图片描述

5.transforms的操作

(1)transforms.Lambda()

功能:用户自定义lambda方法。

torchvision.transforms.Lambda(lambd)

参数:
在这里插入图片描述
格式为:
lambda[ arg1 [,arg2,…] ]:expression
其中:
arg1 [,arg2,…]为输入参数,expression为要做的操作以及返回的内容。

例子如下:

transforms.TenCrop(112, vertical_flip=False)
transforms.Lambda(lambda crops: torch.stack([(transforms.ToTensor()(crop)) for crop in crops]))

这里的操作是将TenCrop生成的十个图像拼接成一个张量。

(2)transforms.RandomChoice()

功能:从一系列transforms方法中随机挑选一个。

torchvision.transforms.RandomChoice(transforms)

格式为:

transforms.RandomChoice([transforms1, transforms2, transforms3,...])

如:要么垂直翻转,要么水平翻转。

transforms.RandomChoice([transforms.RandomVerticalFlip(p=1), transforms.RandomHorizontalFlip(p=1)])

(3)transforms.RandomApply()

功能:依据概率执行一组transforms操作。

torchvision.transforms.RandomApply(transforms, p=0.5)

如:0.5的概率执行仿射变换后灰度化。

transforms.RandomApply([transforms.RandomAffine(degrees=0, shear=45, fillcolor=(255, 0, 0)), transforms.Grayscale(num_output_channels=3)], p=0.5)

(4)transforms.RandomOrder()

功能:对一组transforms方法打乱,然后顺序执行。

torchvision.transforms.RandomOrder(transforms)

如:

transforms.RandomOrder([transforms.RandomRotation(15),
                        transforms.Pad(padding=32),
                        transforms.RandomAffine(degrees=0, translate=(0.01, 0.1), scale=(0.9, 1.1))]),
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Pytorch中,图像预处理通常使用transforms模块来完成。以下是一些常见的图像预处理操作: 1. Resize:调整图像大小。 ``` transforms.Resize((height, width)) ``` 2. CenterCrop:在图像中心进行裁剪。 ``` transforms.CenterCrop(size) ``` 3. RandomCrop:在随机位置进行裁剪。 ``` transforms.RandomCrop(size, padding=None, pad_if_needed=False, fill=0, padding_mode='constant') ``` 4. Normalize:对图像进行标准化处理。 ``` transforms.Normalize(mean, std) ``` 5. ToTensor:将数据类型转换为张量(Tensor)。 ``` transforms.ToTensor() ``` 6. RandomHorizontalFlip:随机水平翻转。 ``` transforms.RandomHorizontalFlip(p=0.5) ``` 7. RandomRotation:随机旋转。 ``` transforms.RandomRotation(degrees, resample=False, expand=False, center=None) ``` 这些操作可以通过组合使用来构建一个预处理管道。例如,以下代码将对图像进行中心裁剪、标准化和转换为张量: ``` transform = transforms.Compose([ transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) ``` ### 回答2: PyTorch是一种流行的机器学习框架,提供了丰富的图像预处理功能,便于处理和准备图像数据用于训练深度学习模型。 首先,PyTorch图像预处理的第一步通常是加载图像。PyTorch提供了torchvision库,其中包括一些常用的数据集,如ImageFolder,可以方便地加载和处理图像数据。 接下来,预处理图像的常见步骤是将其转换为Tensor格式。PyTorch将图像表示为张量,可以通过使用transforms.ToTensor()转换图像数据类型为torch.Tensor。这样可以使图像数据可以直接输入到神经网络中进行训练。 此外,图像预处理包括常见的数据增强方法,如随机裁剪、随机翻转、旋转和缩放等。这些数据增强方法有助于增加模型的泛化能力,提高模型对于不同样本的鲁棒性。可以使用transforms库提供的方法,如RandomCrop、RandomHorizontalFlip和RandomRotation等来实现这些数据增强操作。 另外,在进行图像预处理时,还可以进行归一化操作。这可以通过使用transforms.Normalize()方法,将图像的像素值进行标准化处理,使其符合模型训练的要求。标准化会根据图像像素的均值和标准差进行处理。 最后,为了方便创建可以训练的数据集,可以使用torch.utils.data.DataLoader将预处理后的图像加载为批量数据。DataLoader还提供了一些常用的功能,如数据随机打乱和并行加载等。 综上所述,PyTorch提供了丰富的图像预处理功能,通过transforms库以及相关的方法,可以将图像数据加载、转换为张量、进行数据增强和标准化等操作,方便地准备和处理图像数据以供深度学习模型使用。 ### 回答3: PyTorch图像预处理是一系列的操作,用于将输入的图像数据转换为适合神经网络训练的格式。下面将介绍几种常见的PyTorch图像预处理方法。 1. 图像变换(Image Transformations):这是最基本的图像预处理步骤,包括调整图像大小,裁剪、缩放、旋转等操作。可以使用torchvision库中的transforms模块来实现,例如使用Resize函数调整图像大小,使用RandomCrop函数进行随机裁剪。 2. 数据增强(Data Augmentation):数据增强是指通过对原始图像进行一系列变换来生成新的训练样本,旨在扩大训练集规模和增加数据的多样性,以提高模型的泛化能力。常用的数据增强操作包括随机翻转、随机旋转、随机裁剪等。可以使用torchvision库中的transforms模块的RandomHorizontalFlip、RandomVerticalFlip、RandomRotation、RandomCrop等函数来实现。 3. 标准化(Normalization):标准化是将图像的像素值进行归一化处理,使其符合神经网络的输入要求。常用的标准化方法是将像素值减去均值,然后除以标准差。可以使用torchvision库中的transforms模块的Normalize函数来实现。 4. 数据加载(Data Loading):在PyTorch中,可以使用torchvision库中的datasets模块来加载图像数据集。datasets模块提供了一些常用的图像数据集,如CIFAR-10、ImageNet等。加载图像数据集时,可以使用transforms参数来指定需要进行的图像预处理操作。 5. 批量处理(Batch Processing):在神经网络训练过程中,通常会将训练数据划分为小批量进行训练,以提高运算效率。可以使用torch.utils.data.DataLoader模块中的DataLoader函数来进行批量处理。 总结起来,PyTorch图像预处理包括图像变换、数据增强、标准化、数据加载和批量处理等操作,通过这些操作可以将原始图像数据转换为适合神经网络训练的格式。这些预处理操作可以提高模型的训练效果和泛化能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值