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

一、在数据处理时,我们要经常用到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是相同,都为, 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()

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

Pytorch下transforms.ToTensor(),transforms.Normalize()详解,及代码实现和复原_第1张图片

 

你可能感兴趣的:(pytorch,深度学习,python,opencv,人工智能)