当前位置:   article > 正文

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

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进行标准化计算

代码如下:

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

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

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

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

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

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

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

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

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/351039
推荐阅读
相关标签
  

闽ICP备14008679号