关注点
一、常见的 transforms 操作
-
ToTensor
- 功能: 将来自 PIL 图像或 numpy 数组的数据转换为 PyTorch 张量,同时将像素值从 0-255 归一化到 0-1。
- 用途: 使图像数据以张量格式输入神经网络。
-
Normalize
- 功能: 对张量图像进行标准化处理,将每个通道的数据调整为均值为零、标准差为一。
- 用途: 提高模型的稳定性和训练效果,减轻输入数据的幅度变化。
-
Resize
- 功能: 将图像调整为指定尺寸。
- 用途: 确保输入的图像都具有统一的大小。
-
RandomCrop
- 功能: 随机裁剪图像到指定尺寸。
- 用途: 用于数据增强,可以在模型训练时提供多样化的输入视图。
-
RandomHorizontalFlip
- 功能: 随机水平翻转图像。
- 用途: 提高模型对于不同视图和变换的鲁棒性。
-
Compose
- 功能: 将多个变换组合成一个整体。
- 用途: 方便将一系列预处理操作应用到每个输入样本。
举个例子
假设有一个图像数据集,准备进行训练。可以用 transforms 来规范化数据:
import torchvision.transforms as transforms
# 定义一个变换序列
transform = transforms.Compose([
transforms.Resize((128, 128)), # 调整图像大小
transforms.ToTensor(), # 转换为张量
transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]) # 标准化每个通道
])
# 应用在数据集加载器中
# 通过这个变换序列,每个图像都将被缩放到 128x128 像素,
# 转换为张量格式,并进行标准化处理,以提高模型训练效率。
二、具体使用
1、Normalize
这段代码使用 PyTorch 和 Tensorboard 的功能来进行图像的处理和可视化。
-
导入库
from torch.utils.tensorboard import SummaryWriter from torchvision import transforms from PIL import Image import cv2torch.utils.tensorboard.SummaryWriter:用于记录和可视化数据,便于了解模型训练过程或者数据变换效果。torchvision.transforms:提供了用于图像预处理的变换,例如ToTensor和Normalize。PIL.Image:用于读写图像文件。cv2:OpenCV库,这里虽然导入了,但并没有在代码中使用它。
-
读取图像
img_path = "pytorchstu/data/train/ants_image/0013035.jpg" img = Image.open(img_path)- 用 PIL 打开指定路径的图片,得到一个
img对象,这是一个 PIL 图像。
- 用 PIL 打开指定路径的图片,得到一个
-
初始化 Tensorboard
writer = SummaryWriter("logs")- 创建一个
SummaryWriter实例,将会写日志到logs文件夹。
- 创建一个
-
图像转换为张量
tensor_trans = transforms.ToTensor() img_tensor = tensor_trans(img) print(img_tensor[0][0][0])transforms.ToTensor()将图像从 PIL 格式转换为 PyTorch 张量格式。这个转换通常将像素值从 [0, 255] 归一化到 [0, 1](实现方法为除以255)。img_tensor是图像的张量表示。print(img_tensor[0][0][0])是输出图像张量的一个像素点的值,具体是该像素点在红色通道上的值。这是因为张量的格式通常是[C, H, W](通道、行、列),所以[0][0][0]访问的是第一个通道、第一个像素行、第一个像素列的值。
-
标准化
tensor_norm = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5]) img_norm = tensor_norm(img_tensor) print(img_norm[0][0][0])transforms.Normalize通过减去均值并除以标准差来标准化每个通道,公式是(input[channel] - mean[channel]) / std[channel]。- 这里的均值和标准差都是
[0.5, 0.5, 0.5],这会将图像张量值调整到 [-1, 1] 的范围。 print(img_norm[0][0][0])输出经过标准化处理后的第一个位置的值。这是标准化之后的同一个像素的值。- 因为使用的均值和标准差都是
0.5,所以计算该像素点新的值为:(原始值 - 0.5) / 0.5, 这会将值映射到[-1, 1]的范围 - 虽然 ToTensor() 将像素值映射到了 [0, 1] 的范围,但图像数据的分布可能没有零均值和单位方差。Normalize 则是进一步调整数据,使数据的均值为零、标准差为一,符合标准机器学习假设。
- Normalize 过程帮助中心化数据,使每个通道的数据平衡,提高模型的收敛性和泛化能力。
-
可视化张量
writer.add_image("img_tensor", img_tensor) writer.add_image("img_norm", img_norm) writer.close()- 使用
add_image将图像张量和标准化后的图像写入 Tensorboard。 - 关闭
SummaryWriter,确保所有数据正确写入。
- 使用
可视化
通过执行代码并启动 Tensorboard:tensorboard --logdir=logs