神经网络:加载,读取,保存 jpg,png类型的数据

神经网络:加载,读取,保存 jpg,png类型的数据,第1张

神经网络:加载,读取,保存 jpg,png类型的数据 使用PIL加载png,jpg数据 ---》网络的输入
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

 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zaji/5578838.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存