PyTorch 实现图片预处理(归一化 & 标准化)代码整理

一、写在前面

本来图片预处理(归一化 & 标准化)的原理不难,但我这个人工智能小白被 Tensor 和 array 等几个类型的通道顺序搞得晕头转向,好不容易整理好了,故写一篇 blog 记录一下

 

二、先上代码

import torchvision.transforms as transforms
from PIL import Image
import numpy as np


img_path = "/lena.jpeg"


# guiyihua:[0, 255] -> [0, 1]
guiyihua = transforms.ToTensor()



# biaozhunhua (ImageNet)
biaozhunhua = transforms.Normalize(
    mean=[0.485, 0.456, 0.406],
    std=[0.229, 0.224, 0.225]
)


# zuhe
zuhe_transform = transforms.Compose([
    guiyihua,
    biaozhunhua
])


# open Image
img = Image.open(img_path)

# transformation: [H, W, C] -> [C, H, W]
img_after = zuhe_transform(img)

# tensor -> numpy
img_after = img_after.numpy()

# [C, H, W] -> [H, W, C]
img_after = np.transpose(img_after, (1, 2, 0))

# print img_after
print("img_after = ", img_after)

 

三、实现过程中一些注意的点

1、用 PIL 打开的图片 img 是标准 RGB 通道。如果转成 array【np.array(img)】的话,它的 shape 为 【Height,Width,Channel】

2、用 PIL 打开的图片 img 经过 ToTensor() 操作后,shape 会从【H,W,C】变成【C,H,W】。

3、如果想要变回原来的 shape ,需要先用【tensor.numpy()】将 tensor 类型转回 array 类型。再使用 np.transpose() 函数,带上参数(1, 2, 0),变回【H,W,C】。至于为什么是(1,2,0),是因为对于【C,H,W】来说,0指的是第一个(即 C);1,2分别指的是第二、三个(即 H,W)。那按照(1,2,0)的顺序一排,就是【H,W,C】了。

  • 5
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch中,图像数据的归一化可以通过使用torchvision.transforms.Normalize()函数来实现。该函数需要传入三个参数,分别是均值(mean)、标准差(std)、以及一个布尔值,用来指示是否将图像像素值剪裁到0和1之间。 具体的步骤如下: 1. 首先,根据数据集计算图像的均值和标准差。可以使用torchvision.datasets.ImageFolder()函数加载数据集,并使用torch.utils.data.DataLoader()函数生成一个数据加载器。 2. 接下来,使用torchvision.transforms.Compose()函数将多个图像预处理操作组合起来。常见的预处理操作包括图像尺寸调整、裁剪、翻转、旋转等。 3. 在组合的图像预处理操作中,添加torchvision.transforms.ToTensor()函数,将图像转换为张量形式。 4. 最后,添加torchvision.transforms.Normalize()函数,传入计算得到的均值和标准差作为参数,并设置布尔值为True,以剪裁图像像素值到0和1之间。 参考代码如下所示: ``` import torchvision.transforms as transforms # 计算数据集的均值和标准差 dataset = torchvision.datasets.ImageFolder(root='dataset_path', transform=transforms.ToTensor()) data_loader = torch.utils.data.DataLoader(dataset, batch_size=1, shuffle=True) mean = 0.0 std = 0.0 for images, _ in data_loader: batch_mean = torch.mean(images, dim=(0, 2, 3)) batch_std = torch.std(images, dim=(0, 2, 3)) mean += batch_mean std += batch_std mean /= len(data_loader) std /= len(data_loader) # 图像预处理操作 preprocess = transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize(mean, std) ]) # 使用预处理操作对图像进行归一化处理 normalized_image = preprocess(image) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值