torchvision.transforms

上一篇博客讲解了如何组织自己的数据集,这节讲解如何对数据集进行一系列的预处理操作,即Transform。

1. torchvision.transforms.Compose(transforms)

该API将多个 transform 组合起来对数据进行预处理,其中参数 transforms 是由 transform 构成的列表。
现在举一个例子,先看原始图片:
在这里插入图片描述
接着对这个图片进行预处理操作 ToTensor(),即将 PILImage 或者 numpy 的 ndarray 转化成 Tensor。

import torch
import torchvision
import torchvision.transforms as transforms
import cv2
import numpy as np
from PIL import Image

img_path = "./data/train/Daffodil/image_0001.jpg"

# transforms.ToTensor()
transform1 = transforms.Compose([
    transforms.ToTensor(),  # range [0, 255] -> [0.0,1.0]
]
)

# Way1
# numpy.ndarray --> tensor
img = cv2.imread(img_path)  # 读取图像, returned 500*689*3 (H * W * channel),数值[0, 255]
print("img type", type(img), img.shape)
img1 = transform1(img)      # 归一化到 [0.0,1.0], img1 is a returned tensor, torch.Size([3, 500, 689])
print("img type after ToTensor transform", type(img1), img1.size())

# 转化为numpy.ndarray并显示
img_1 = img1.numpy()*255
img_1 = img_1.astype('uint8')
img_1 = np.transpose(img_1, (1,2,0))
cv2.imshow('img_1', img_1)  # cv2.imshow() input shape: (H * W * channel)
cv2.waitKey()

# Way2
# PIL --> tensor
img = Image.open(img_path).convert('RGB')    # 读取图像
img2 = transform1(img)        # 归一化到 [0.0, 1.0]
print("img type after ToTensor transform", type(img2), img2.size())

# 转化为PILImage并显示
img_2 = transforms.ToPILImage()(img2).convert('RGB')
print("type", img_2)
img_2.show()

在这里插入图片描述
注意:shape为 (H,W,C) 的numpy.ndarray,转换成 size 为 [C,H,W]的 tensor ,并且 tensor 的取值范围是[0, 1.0]。通道数在第一个维度

2. 常见的一些预处理操作

  1. class torchvision.transforms.CenterCrop(size):将给定的PIL.Image进行中心切割,得到给定的size,size可以是tuple,(target_height, target_width)。size也可以是一个Integer,在这种情况下,切出来的图片的形状是正方形。
  2. class torchvision.transforms.RandomCrop(size, padding=0):切割中心点的位置随机选取。size可以是tuple也可以是Integer。
  3. class torchvision.transforms.RandomHorizontalFlip():随机水平翻转给定的PIL.Image,概率为0.5。即:一半的概率翻转,一半的概率不翻转。
  4. class torchvision.transforms.RandomSizedCrop(size, interpolation=2):先将给定的PIL.Image随机切割(尺寸不定),然后再resize成给定的size大小。
  5. class torchvision.transforms.Pad(padding, fill=0):将给定的PIL.Image的所有边用给定的pad value填充。 padding:要填充多少像素,fill:用什么值填充。
  6. transforms.Normalize((m1, m2, m3), (v1, v2, v3)):使用如下公式进行归一化:channel =(channel - mean)/ std,将在 0 到 1 之间的值变换到了 -1 到 1 区间。其中,mi、vi分别表示第 i 个通道的均值与方差。(比如 transforms.Normalize((.5,.5,.5),(.5,.5,.5)),因为transforms.ToTensor() 已经把数据处理成 [0, 1],那么(x - 0.5) / 0.5 就是 [-1.0, 1.0]。)

至于为什么对数据使用 transforms.Normalize() 变换到 [-1, 1],请读者自行思考!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
torchvision.transforms.v2是一个Python库,它提供了一系列的数据预处理操作,可以用于对图像数据进行处理和转换。其中一些常见的预处理操作包括: 1. transforms.CenterCrop(size):将给定的图像进行中心切割,得到给定的size大小的图像。size可以是一个tuple,表示目标图像的高度和宽度;也可以是一个整数,表示切出来的图像是正方形。 2. transforms.RandomCrop(size, padding=0):随机选取图像的中心点位置进行切割。size可以是一个tuple,也可以是一个整数。 3. transforms.RandomHorizontalFlip():随机水平翻转给定的图像,概率为0.5,即有50%的概率进行翻转。 4. transforms.RandomSizedCrop(size, interpolation=2):先随机切割图像(尺寸不定),然后再将切割后的图像resize成给定的size大小。 5. transforms.Pad(padding, fill=0):将给定的图像的所有边用给定的填充值进行填充。padding表示要填充多少像素,fill表示用什么值进行填充。 6. transforms.Normalize(mean, std):使用给定的均值和标准差进行归一化操作。归一化公式为:channel = (channel - mean) / std。其中mean和std分别表示每个通道的均值和标准差。 以上是torchvision.transforms.v2库中的一些常见的预处理操作,可以根据需要选择合适的操作来对图像数据进行处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [torchvision.transforms](https://blog.csdn.net/qq_33254870/article/details/103364028)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [pytorch-nyuv2:PyTorch NYUv2数据集类](https://download.csdn.net/download/weixin_42100188/18378138)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值