在 PyTorch 中,transform 主要用于数据预处理和数据增强,尤其在计算机视觉任务中,通过 torchvision.transforms 模块进行图像的变换。transforms 可以对图像进行一系列操作,如裁剪、旋转、缩放、归一化等,以增强数据集的多样性,并提高模型的泛化能力。

1. torchvision.transforms 模块概述

torchvision.transforms 是 PyTorch 提供的一个图像转换工具,它包含一系列的变换操作。常见的转换操作包括:

  • 图像大小调整(Resize)
  • 裁剪(Crop)
  • 图像翻转(Flip)
  • 颜色调整(Color Jitter)
  • 图像归一化(Normalization)
  • 转换为张量(ToTensor)

2. 常用的 transforms 操作

from torchvision import transforms
1) transforms.ToTensor()

将图像转换为 PyTorch 张量(Tensor),并且自动将图像的像素值缩放到 [0, 1] 的范围内。

transform = transforms.ToTensor()
image_tensor = transform(image)
2) transforms.Resize()

调整图像的大小,可以指定一个单一的大小或宽度/高度。

transform = transforms.Resize((224, 224))  # 调整为 224x224 的尺寸
image_resized = transform(image)
3) transforms.CenterCrop()transforms.RandomCrop()

CenterCrop 会从图像的中心裁剪出指定大小的区域;RandomCrop 会随机裁剪出一个指定大小的区域。

transform = transforms.CenterCrop(224)  # 从中心裁剪出 224x224 的区域
image_cropped = transform(image)

# 或者使用随机裁剪
transform = transforms.RandomCrop(224)
image_random_cropped = transform(image)
4) transforms.RandomHorizontalFlip()transforms.RandomVerticalFlip()

进行水平或垂直的随机翻转。

transform = transforms.RandomHorizontalFlip(p=0.5)  # 50% 的概率进行水平翻转
image_flipped = transform(image)
5) transforms.Normalize()

对图像的每个通道进行归一化。通常用来调整图像的颜色通道,使其符合模型训练时的要求。

transform = transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
image_normalized = transform(image_tensor)  # 对每个通道进行归一化
6) transforms.ColorJitter()

随机调整图像的亮度、对比度、饱和度和色相。适用于增强数据集的多样性。

transform = transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1)
image_jittered = transform(image)
7) transforms.RandomRotation()

对图像进行随机旋转。

transform = transforms.RandomRotation(30)  # 随机旋转 -30 到 30 度之间
image_rotated = transform(image)

3. 多种 transforms 组合使用

通常,我们会将多个变换操作组合成一个 Compose,使得一个图像依次经过多个变换步骤。

transform = transforms.Compose([
    transforms.Resize(256),
    transforms.RandomCrop(224),
    transforms.RandomHorizontalFlip(),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

image_transformed = transform(image)

上面的代码会将图像:

  1. 调整为 256x256
  2. 随机裁剪为 224x224
  3. 进行水平翻转
  4. 转换为张量
  5. 归一化图像

4. 结合 Dataset 使用 transforms

通常,我们会将 transformstorch.utils.data.Datasettorch.utils.data.DataLoader 结合使用,用于训练过程中的数据预处理。

from torchvision import datasets
from torch.utils.data import DataLoader

transform = transforms.Compose([
    transforms.Resize(256),
    transforms.RandomCrop(224),
    transforms.RandomHorizontalFlip(),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

train_dataset = datasets.ImageFolder(root='path_to_train_data', transform=transform)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)

在上面的代码中,ImageFolder 是一个 PyTorch 提供的通用图像数据集类,用于加载目录结构为类标签的图像数据。transform 用于对数据集中的每个图像进行预处理。

5. 自定义 transform

如果 torchvision.transforms 中的预定义操作不能满足需求,我们还可以自定义一个转换类。例如,如果你想为每张图片添加噪声:

from PIL import Image
import numpy as np

class AddGaussianNoise(object):
    def __init__(self, mean=0., std=1.):
        self.mean = mean
        self.std = std
    
    def __call__(self, image):
        image = np.array(image)
        noise = np.random.normal(self.mean, self.std, image.shape)
        noisy_image = image + noise
        noisy_image = np.clip(noisy_image, 0, 255)  # 保证像素值在 [0, 255] 范围内
        return Image.fromarray(noisy_image.astype(np.uint8))

# 使用自定义转换
transform = transforms.Compose([
    transforms.Resize(256),
    transforms.RandomCrop(224),
    AddGaussianNoise(mean=0, std=0.1),  # 添加高斯噪声
    transforms.ToTensor(),
])

image = Image.open('path_to_image.jpg')
transformed_image = transform(image)

总结

  • transforms 是 PyTorch 中处理图像数据的一组强大工具,适用于图像预处理和数据增强。
  • 通过 transforms.Compose() 可以组合多个转换操作。
  • ToTensor()Resize()RandomCrop()Normalize() 等是常用的转换。
  • 通过 DataLoader 可以高效地加载批量数据,并在训练过程中对每个样本应用转换。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部