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

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)
需要根据自己的需求进行归一化操作后,才能放入网络

使用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

Original: https://blog.csdn.net/m0_45894804/article/details/121523137
Author: LvJu
Title: 神经网络:加载,读取,保存 jpg,png类型的数据

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/763127/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球