pytorch torchvision.transforms 对图像数据进行归一化

本文详细介绍了如何使用PyTorch及其torchvision库对numpy数组和PIL图像进行归一化处理,展示了不同转换代码的效果,并解释了ToTensor()函数的工作原理。

1.对numpy数据进行归一化

import torch
import torchvision
import torchvision.transforms as transforms
import numpy as np

X = np.random.choice(255, (5,4,3))
print(X)

transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize(mean=(0,0,0), std=(1,1,1)),
    ])

transform(X)

print(X)
print(X.shape)

2.对PIL读取的图像进行归一化

import torch
from PIL import Image
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import numpy

plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签


img = Image.open('D:\datasets\img\lena.jpg')
plt.figure()
plt.imshow(img)
plt.title('原图',fontsize=12,color='r')
plt.show()

transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize(mean=(0,0,0), std=(8,8,8)),
    ])

img1 = transform(img)
img1 = np.array(img1*255, dtype=np.uint8)

print('转换后的shape', img.shape)
img_np = np.zeros((200,200,3),dtype=np.uint8)
### 使用 `torchvision.transforms` 预处理原始图像和掩码图像 为了有效地使用 `torchvision.transforms` 对原始图像和掩码图像进行预处理,通常会采用一系列变换操作来标准化输入数据。对于图像分类、目标检测以及语义分割任务而言,这些预处理步骤至关重要。 #### 定义转换函数 定义一组适用于训练集的增强方法,包括但不限于随机裁剪、水平翻转等;而对于验证集,则仅应用必要的缩放与归一化: ```python from torchvision import transforms data_transforms = { 'train': transforms.Compose([ transforms.Resize((256, 256)), # 调整大小至固定尺寸 transforms.RandomHorizontalFlip(), # 随机水平翻转 transforms.ToTensor(), # 将PIL Image 或 numpy.ndarray 转换为tensor并归一化到[0,1] transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) # 图像均值方差归一化 ]), 'val': transforms.Compose([ transforms.Resize((256, 256)), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) } ``` 上述代码片段展示了如何创建两个不同的转换管道——分别用于训练阶段(`'train'`) 和评估阶段 (`'val'`) 的图像预处理[^1]。 #### 应用于实际场景中的实例 当涉及到具体的应用案例时,比如使用 Mask R-CNN 来执行实例分割任务,除了常规图片外还需要考虑对应的二进制掩码(mask)文件。因此,在构建自定义的数据加载器 (dataset loader) 中应当同时对这两类数据实施相同的几何变换(如旋转、平移),而保持像素级别的对应关系不变。然而,由于标签图像是单通道灰度图而非RGB彩色图,所以在对其进行规范化之前不需要调用 `transforms.Normalize()` 函数[^2]。 ```python class CustomSegmentationDataset(Dataset): def __init__(self, image_dir, mask_dir, transform=None): self.image_paths = sorted(glob.glob(os.path.join(image_dir, "*.png"))) self.mask_paths = sorted(glob.glob(os.path.join(mask_dir, "*.png"))) self.transform = transform def __getitem__(self, idx): img_path = self.image_paths[idx] mask_path = self.mask_paths[idx] image = Image.open(img_path).convert("RGB") # 确保读取的是三通道彩图 mask = Image.open(mask_path) sample = {'image': image, 'mask': mask} if self.transform: sample["image"] = self.transform(sample["image"]) sample["mask"] = ToTensor()(sample["mask"]) # 掩码只需转化为张量形式即可 return sample def __len__(self): return len(self.image_paths) ``` 这段代码实现了针对特定目录下存储的一系列配对好的原图及其相应标注信息(即mask)所设计的一个简易版 PyTorch Dataset 类型。通过重写 `__getitem__` 方法使得每次迭代都能返回已经过适当前处理后的样本集合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值