PyTorch是目前非常流行的深度学习框架之一,它提供了transforms模块来进行图像的预处理。其中,transforms.ToTensor
和transforms.Normalize
是常用的图像预处理方法,下面将详细讲解它们的实现。
一. transforms.ToTensor实现
transforms.ToTensor
用于将PIL图像或numpy.array数组类型的图像转换成PyTorch中的tensor类型,并将图像像素值归一化到[0,1]之间。其实现可分为以下几个步骤:
- 将PIL图像或numpy.array数组类型的图像转换成tensor类型;
- 将图像像素值转换为[0,1]之间的小数;
- 调整图像的维度,将通道维度放在第二个位置。即变为
(C,H,W)
的形式。
以下是使用样例一:
from PIL import Image
from torchvision import transforms
import torch
# 加载图像
img = Image.open('test.jpg')
# 定义变换
transform = transforms.Compose([
transforms.Resize((224,224)),
transforms.ToTensor(),
])
# 进行图像变换
img_t = transform(img)
print(img_t.shape)
print(torch.min(img_t), torch.max(img_t))
输出结果为:
torch.Size([3, 224, 224])
tensor(0.) tensor(1.)
解释一下输出的结果:torch.Size([3, 224, 224])
表示变换后图像的维度为(C,H,W)
,其中C表示图像的通道数,为3;tensor(0.) tensor(1.)
表示变换后的图像像素值位于[0,1]之间。
以下是使用样例二:
import numpy as np
# 生成numpy数组
img_np = np.array(img)
# 定义变换
transform = transforms.Compose([
transforms.ToTensor(),
])
# 进行图像变换
img_t = transform(img_np)
print(img_t.shape)
print(torch.min(img_t), torch.max(img_t))
输出结果为:
torch.Size([3, 300, 400])
tensor(0.) tensor(1.)
解释一下输出的结果:torch.Size([3, 300, 400])
表示变换后图像的维度为(C,H,W)
,其中C表示图像的通道数,为3;tensor(0.) tensor(1.)
表示变换后的图像像素值位于[0,1]之间。
需要注意的是,在使用transforms.ToTensor
变换时,PIL图像或numpy.array数组类型的图像需要保证通道维度在最后一个位置。
二. transforms.Normalize实现
transforms.Normalize
用于对输入图像进行标准化处理,即按照给定的均值和标准差对输入图像进行标准化。其实现可分为以下几个步骤:
- 根据给定的均值和标准差对输入图像进行标准化;
- 将图像像素值再次归一化到[-1,1]之间。
以下是使用样例一:
from PIL import Image
from torchvision import transforms
import torch
# 加载图像
img = Image.open('test.jpg')
# 定义变换
transform = transforms.Compose([
transforms.Resize((224,224)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])
# 进行图像变换
img_t = transform(img)
print(img_t.shape)
print(torch.min(img_t), torch.max(img_t))
输出结果为:
torch.Size([3, 224, 224])
tensor(-2.1179) tensor(2.2489)
解释一下输出的结果:torch.Size([3, 224, 224])
表示变换后图像的维度为(C,H,W)
,其中C表示图像的通道数,为3;tensor(-2.1179) tensor(2.2489)
表示变换后的图像像素值位于[-1,1]之间。
以下是使用样例二:
import numpy as np
# 生成numpy数组
img_np = np.array(img)
# 定义变换
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])
# 进行图像变换
img_t = transform(img_np)
print(img_t.shape)
print(torch.min(img_t), torch.max(img_t))
输出结果为:
torch.Size([3, 300, 400])
tensor(-2.1179) tensor(2.2489)
解释一下输出的结果:torch.Size([3, 300, 400])
表示变换后图像的维度为(C,H,W)
,其中C表示图像的通道数,为3;tensor(-2.1179) tensor(2.2489)
表示变换后的图像像素值位于[-1,1]之间。
需要注意的是,在使用transforms.Normalize
时,输入的图像必须是tensor类型。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:pytorch中的transforms.ToTensor和transforms.Normalize的实现 - Python技术站