赞
踩
一、在数据处理时,我们要经常用到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()
可以看到,处理前后两张图片一致,还原成功。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。