经过 pytorch 模型输出的图像以 array 的形式呈现,其shape 如下(图片数量,通道数,长,宽),本文结合代码,介绍如何使用 matplotlib.pyplot.imsave()
和 torchvision.utils.save_image()
将上述形式的图像保存下来。
目录
归一化和反归一化
我们一般在模型训练之前,会把训练数据(缩放均值为0方差为1),所以模型的输出也是以后的输出,如果要保存图片,记得要进行(缩放到0-1的区间并还原原来的方差)后再保存。
归一化和反归一化的方法如下:
https://blog.csdn.net/weixin_42468475/article/details/121869314
matplotlib.pyplot.imsave() 保存单张图片
打印和保存图片的格式维度都是:(长,宽,通道数)
import matplotlib.pyplot as plt
import numpy as np
import torch
pic = torch.rand(1,3,32,32) # 创建一个三通道的彩色噪声图像
pic = pic.permute(0,2,3,1) # 记得要先进性维度的调整。通道数放最后
pic = np.array(pic) # 要转换成 np.array 才行
plt.imshow(pic[0]) # 先看看图片啥样
plt.imsave('./test.png', pic[0]) # 保存时候的维度是 (长,宽,通道数),没有图片数量一说
使用 torchvision.utils.save_image 将多个图片放进一张图里保存
torchvision.utils.save_image()
的保存不需要将维度进行转换,保存的维度为:(样本数目,通道数,长,宽)
,并且其可以自动进行 normalize。
import matplotlib.pyplot as plt
import numpy as np
import torch
import torchvision
pic = torch.rand(16,3,32,32) # 创建16个三通道的彩色噪声图像
for i in range(16): # 突出显示不同图片的差异
pic[i] = torch.ones(3,32,32)*i/16
torchvision.utils.save_image(pic,'./test2.png',nrow=4,normalize=True)
使用 torchvision 直接读取图片
先前读取图片到 torch.tensor
得先借助 PIL 这样的图片处理库,读取出来的格式由 (长,宽,通道数)
还得通过一定的函数转换成 (通道数,长,宽)
,参见:
https://blog.csdn.net/weixin_42468475/article/details/121869314
但是 torchvision
本身可以直接读取图片,并按照 (通道数,长,宽)
的格式输出。
from torchvision.io import image
img=image.read_image('./test2.png')
print(type(img))
print(img.shape)