经过 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])  # 保存时候的维度是 (长,宽,通道数),没有图片数量一说

【matplotlib&torchvision&torch】图片的保存,呈现(plt.imshow),读取;将tensor保存为图片-LMLPHP

【matplotlib&torchvision&torch】图片的保存,呈现(plt.imshow),读取;将tensor保存为图片-LMLPHP

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

【matplotlib&torchvision&torch】图片的保存,呈现(plt.imshow),读取;将tensor保存为图片-LMLPHP

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

【matplotlib&torchvision&torch】图片的保存,呈现(plt.imshow),读取;将tensor保存为图片-LMLPHP

10-27 13:52