Pytorch下transforms.ToTensor(),transforms.Normalize()详解,及代码实现和复原

本文介绍了使用PyTorch对图像数据进行标准化处理的方法,并提供了一种逆向操作以恢复原始图像的技术。首先,通过transforms.ToTensor()和transforms.Normalize()实现图像数据的预处理,包括图像数据格式的转换和标准化计算。接着,文章详细解释了如何通过自定义函数来逆向这个过程,以便于可视化已经过训练模型处理的图像数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、在数据处理时,我们要经常用到transforms.ToTensor(),transforms.Normalize()语句,将图像数据转换为tensor并标准化到[-1,1]之间。

其计算过程为:

①将image数据由(H,W,C)变为(C,H,W),并除以255进行归一化到[0,1]区间;

②将numpy.ndarray数据类型转换为Tensor

③根据image=(x-mean)/std进行标准化计算

代码如下:

from torchvision import transforms
import torch
import cv2 as cv
import numpy
import numpy as np
def normalize(image,mean=[0.485,0.456,0.406],std=[0.229,0.224,0.225]):
    image=image.transpose(2,0,1)/255 #由(H,W,C)变为(C,H,W),并进行归一化
    image=torch.from_numpy(image)
    mean = torch.as_tensor(mean)
    std = torch.as_tensor(std)
    if mean.ndim == 1:
        mean = mean.view(-1, 1, 1)
    if std.ndim == 1:
        std = std.view(-1, 1, 1)
    image=(image-mean)/std #根据image=(x-mean)/std进行标准化计算
    return image

二、对于经过标准化的数据,或者经过模型输出的数据,如何从标准化变为可查看的原始数据呢?我们对以上过程进行逆化,其代码如下:

def de_normalize(image,mean=[0.485,0.456,0.406],std=[0.229,0.224,0.225]):
    mean = torch.as_tensor(mean)
    std = torch.as_tensor(std)
    if mean.ndim == 1:
        mean = mean.view(-1, 1, 1)
    if std.ndim == 1:
        std = std.view(-1, 1, 1)
    image=image*std+mean #由image=(x-mean)/std可知,x=image*std+mean
    image=image.numpy().transpose(1,2,0)  # 从tensor转为numpy,并由(C,H,W)变为(H,W,C)
    image=numpy.around(image * 255)  ##对数据恢复并进行取整
    image=numpy.array(image, dtype=np.uint8)  # 矩阵元素类型由浮点数转为整数
    return image

三、通过OpenCV的方式读取一张图像,查看效果;运行完可以看到,其type及shape是相同,都为<class 'torch.Tensor'>, torch.Size([3, 300, 300]),print其数值也是一样的。

'''读取数据'''
image=cv.imread('dog.jpg')
'''分别利用transfors.normalize和自定义的normalize函数对图像数据进行处理,比较'''
image_transform=transform(image/255)
image_normalize=normalize(image)
print(type(image_normalize),image_transform.shape)
print(type(image_normalize),image_normalize.shape)

四、对标准化后的数据进行还原

'''调用自定义的函数对数据进行还原'''
deal_image=de_normalize(image_normalize)
'''显示最初图像及还原后的图像'''
cv.imshow('src_image',image)
cv.imshow('deal_image',deal_image)
cv.waitKey(5000)
cv.destroyAllWindows()

可以看到,处理前后两张图片一致,还原成功。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值