def default_loader(path): im = Image.open(path).convert('RGB') # 规定读取数据按真彩色的方式读取 return im# 该函数返回的并不是我们想要的多维数组、tensor的类型,而是一个Image 对象,如下所示。
此时 im 是一个 Image 对象 ,它有很多属性,比如它的size是(w,h),通道是RGB
# 我们需要将Image对象转换成可以输入网络的数据 (输入网络的数据一般是标准化的数据 均值为0,分布在 [-1,1]之间,根据自己的需求定义) ############################################################################# 1. 分步 *** 作im = np.narray(im) ---> 转换成多维数组的形式 [H,W,C] ,像素值 [0, 255] im = np.transpose(im, (1,2,0)) ------》 网络输入数据应该是[C,H,W], 所以需要将多维数组的维度进行转换 im = torch.from_numpy(im) -----> 再将多维数组转换成tensor类型 [C,H,W] # 也可先转换成tensor在进行维度转化 im = im.permute(1, 2, 0) -------》 像素值为[0, 255],维度为[C,H,W]的 tensor # 需要根据自己的需求进行归一化 *** 作后,才能放入网络############################################################################# 2. 或者直接利用 T.ToTensor() #T.ToTensor() 函数接受PIL Image或numpy.ndarray,将其先由HWC转置为CHW格式,再转为float后每个像素除以255
from torchvision import transforms as T # 1. T.ToTensor() 直接将Image对象转换成 像素值 [0,1], 维度为 [C, H, W] 的 tensor im_tensor = T.ToTensor()(im) # 2. 将Image对象----》 numpy ---> T.ToTensor() ---> 像素值 [0,1], 维度为 [C, H, W] 的 tensor im = np.narray(im) ---> 转换成多维数组的形式 [H,W,C] im_tensor = T.ToTensor()(im) -------》 像素值为[0, 1],维度为[C,H,W]的 tensor , # 需要根据自己的需求进行归一化 *** 作后,才能放入网络使用PIL ,plt保存、显示数据,以及vutils保存数据 # 在显示/保存 数据时,需要注意 加载数据的归一化过程, 是否在保存时候进行了反归一化。 ############################################################################# 1.使用PIL中的 Image.save() Image.show() 保存以及显示图片 (Image为实例对象的名称)
# 需要将 tensor---》Image对象 # transforms.ToPILImage()中有一句 # npimg = np.transpose(pic.numpy(), (1, 2, 0)) # 因此pic只能是3-D Tensor,所以要用image[0]消去batch那一维 # 除T.tensor()所进行的归一化 *** 作之外的 其他归一化 *** 作的反归一化 img = transforms.ToPILImage((image[0]) # 将像素值 [0,1],维度为 [C, H, W] 的 tensor --- 》 numpy 对象 [0,255] [H,w,c] ---> Image 对象 #显示数据 img.show() #保存数据 img.save(path)################################################################### 2. 使用plt.imshow(),plt.imsave() 保存以及显示图片
# 像素值应该在浮点数[0, ..., 1]的范围内,或者整数[0, ... ,255],需要注意超出范围的值将被剪切为这些界限。(即像素值最大不能超过255,最小不能低于0) # plt.imshow()只能接受3-D Tensor,所以也要用image[0]消去batch那一维 img = image[0] # 归一化 *** 作的反归一化 img = img.numpy() # FloatTensor转为ndarray [C, H, W] img = np.transpose(img, (1,2,0)) # 转换维度 [C, H, W] ----> [ H, W, C] # 把channel那一维放到最后 # 显示图片 plt.imshow(img) plt.show() #保存数据 plt.imsave(im,path)################################################################## 3. 使用vutils保存数据,可以直接保存tensor, variabale--》jpg 而不需要装换成其他类型的数据
# 反归一化/将像素值范围转换到正数范围,并且像素值范围必须为【0,1】 vutils.save_image(im.cpu().float(), os.path.join("./1.jpg"))T.Totensor 与 ToPILImage
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)