本系列文章配套代码获取有以下两种途径:
-
通过百度网盘获取:
链接:https://pan.baidu.com/s/1XuxKa9_G00NznvSK0cr5qw?pwd=mnsj
提取码:mnsj
-
前往GitHub获取:
https://github.com/returu/PyTorch
针对上述问题,PyTorch提供了torchvision.transforms模块,该模块定义了一组可组合的、类似函数的对象,它可以作为参数传递到torchvision模块的数据集,在数据加载之后,在__getitem__()返回之前对数据进行图像预处理和数据增强操作。例如:
-
ToTensor(): 将 PIL Image 或 ndarray 转换为 FloatTensor,并归一化到 [0.0, 1.0]。 -
Normalize(mean, std): 对图像进行标准化,通常与 ToTensor 结合使用。mean 和 std 分别是每个通道的平均值和标准差。 -
Resize(size): 将图像的尺寸调整为给定的大小。 -
CenterCrop(size): 从图像中心裁剪出给定大小的区域。 -
RandomCrop(size): 在图像中随机裁剪出给定大小的区域。 -
RandomHorizontalFlip(p=0.5): 以给定的概率 p 水平翻转图像。 -
RandomVerticalFlip(p=0.5): 以给定的概率 p 垂直翻转图像。 -
ColorJitter(brightness=0, contrast=0, saturation=0, hue=0): 随机更改图像的亮度、对比度、饱和度和色调。
dir(transforms)
这些转换操作可以单独使用,也可以组合在一起形成一个转换流水线。
单独使用:
# 加载图像
image = dataset[6][0]
# 创建一个转换操作实例
transform_totensor = transforms.ToTensor()
# 应用转换操作到图像上
image_tensor = transform_totensor(image) # 这里隐式调用了transform_totensor.__call__(image)
type(image_tensor)
# 输出结果:torch.Tensor
通过lambda封装自定义的转换操作:
# 自定义的转换函数,例如将图像转换为灰度图
custom_transform_fn = lambda image: image.convert('L')
# 使用Lambda封装自定义转换
custom_transform = transforms.Lambda(custom_transform_fn)
# 在PIL图像上应用自定义转换
transformed_image = custom_transform(img)
transforms.Compose:
# 创建一个转换流水线
transform = transforms.Compose([
transforms.Resize(224), # 将图像大小调整为224x224像素
transforms.CenterCrop(224), # 在图像中心裁剪出224x224的区域
transforms.Lambda(lambda img:img.rotate(random.random()*360)), # 随机旋转图像
transforms.ToTensor(), # 将PIL图像或NumPy ndarray转换为PyTorch张量
transforms.Normalize(mean=[-0.0325, -0.0331, -0.1010],std=[0.5220, 0.5135, 0.5287]),# 对张量图像进行标准化
])
# 应用转换流水线到图像上
transformed_image = transform(img)
to_img = transforms.ToPILImage() # 将Tensor转换为PIL对象
to_img(transformed_image) # 显示图像
原图 | 转换结果 |
将变换作为参数传递:
# 自定义数据集对象
class DogCat(Dataset):
def __init__(self,root,transforms=None):
imgs = os.listdir(root)
self.imgs = [os.path.join(root,img) for img in imgs]
# 将传入的 transforms 参数赋值给类的实例变量
self.transforms = transforms
def __getitem__(self,index):
img_path = self.imgs[index]
label = 1 if 'dog' in img_path.split('/')[-1] else 0
data = Image.open(img_path)
if self.transforms:
data = self.transforms(data)
return data,label
def __len__(self):
return len(self.imgs)
# 在创建数据集实例时,可以将变换操作作为参数传递
dataset = DogCat('./data/dogcat/',transforms = transform)
transforms.functional:
transforms.functional中一些主要功能和函数如下所示:
-
to_tensor(pic): 将PIL图像或NumPy数组转换为PyTorch张量。
-
normalize(tensor_image, mean, std): 对图像张量进行标准化,使用给定的均值和标准差。
-
resize(img, size): 调整图像大小到指定的尺寸。
-
crop(img, top, left, height, width): 从图像中裁剪出指定区域。
-
hflip(img): 水平翻转图像。
-
vflip(img): 垂直翻转图像。
-
rotate(img, angle): 以指定的角度旋转图像。
-
adjust_brightness(img, brightness_factor): 调整图像的亮度。
-
adjust_contrast(img, contrast_factor): 调整图像的对比度。
-
adjust_saturation(img, saturation_factor): 调整图像的饱和度。
-
adjust_hue(img, hue_factor): 调整图像的色调.
-
pad(img, padding, fill=0, padding_mode=’constant’): 用指定的填充模式和填充值填充图像。填充模式可以是‘constant’, ‘edge’, ‘reflect’或‘symmetric’。
-
affine(img, angle, translate, scale, shear): 对图像进行仿射变换,包括旋转、平移、缩放和剪切.
-
to_pil_image(tensor): 将PyTorch张量转换为PIL图像。
-
normalize_tensor(tensor_image, mean, std): 对图像张量进行标准化(与normalize功能相似,但直接作用于张量)。
import torchvision.transforms.functional as TF
# 以指定的角度旋转图像
TF.rotate(img, 45)
更多内容可以前往官网查看:
https://pytorch.org/
本篇文章来源于微信公众号: 码农设计师