一、在数据处理时,我们要经常用到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是相同,都为
'''读取数据'''
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()
可以看到,处理前后两张图片一致,还原成功。