当前位置: 首页 > article >正文

pytorch中的transform用法

在 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 可以高效地加载批量数据,并在训练过程中对每个样本应用转换。

http://www.kler.cn/a/396003.html

相关文章:

  • 操作系统实验:在linux下用c语言模拟进程调度算法程序
  • Unity图形学之Blend指令
  • Linux服务器定时执行jar重启命令
  • 【服务器】本地安装X11 服务器-Windows
  • [DB]
  • 【Window主机访问Ubuntu从机——Xrdp配置与使用】
  • 21.<基于Spring图书管理系统②(图书列表+删除图书+更改图书)(非强制登录版本完结)>
  • Kafka入门:Java客户端库的使用
  • C语言.冒泡排序的练习
  • 在word文档中,内容是一段英文,一段英文的显示,且段落的前后都有空行,我如何只去掉英文段落后面的空行。
  • 25浙江省考-28天学行测-Day5 Day6-判断推理(中)
  • reduce-scatter:适合分布式计算;Reduce、LayerNorm和Broadcast算子的执行顺序对计算结果的影响,以及它们对资源消耗的影响
  • R门 - rust第一课陈天 -内存知识学习笔记
  • Apache Doris:监控与运维及系统调优
  • 【RabbitMQ】07-业务幂等处理
  • Tomcat NIO 配置实操指南
  • JVM——类加载器、类加载器的分类
  • 【Ubuntu侧边菜单点击没反应】【Ubuntu 20.04】【浏览器、文件夹点击没反应】
  • LabVIEW开发相机与显微镜自动对焦功能
  • 消息中间件分类
  • 《Django 5 By Example》阅读笔记:p17-p53
  • 去中心化存储:Web3数据安全新标准
  • Wireshark中的length栏位
  • YOLO理解
  • 一个C++线程安全的栈数据结构的例子
  • 电子商务系统设计与Spring Boot框架