需要导入的工具库:
import torch
from PIL import Image
import matplotlib.pyplot as plt
from torchvision import transforms as T
# loader使用torchvision中自带的transforms函数
loader = transforms.Compose([ transforms.ToTensor() ])
#在.Compose()中可添加多个操作,对图片进行改变
unloader = transforms.ToPILImage()
1. PIL读取图片转化为Tensor
输入图片地址返回tensor变量:
def image_loader(image_name):
image = Image.open(image_name).convert(‘RGB’)
image = loader(image).unsqueeze(0)
return image.to(device, torch.float)
2. Tensor转化为PIL图片
输入tensor变量 输出 PIL格式图片:
def tensor_to_PIL(tensor):
image = tensor.cpu().clone()
image = image.squeeze(0)
image = unloader(image)
return image
3. 直接展示tensor格式图片
def imshow(tensor, title=None):
image = tensor.cpu().clone()
image = image.squeeze(0)
image = unloader(image)
#先转换成PIL格式的image,再展示
plt.imshow(image)
** 4、直接保存tensor格式图片**
def save_image(tensor, **para):
dir = ‘./results’
image = tensor.cpu().clone()
image = image.squeeze(0)
image = unloader(image)
#先转换成PIL格式的image,再保存
if not os.path.exists(dir):
os.makedirs(dir)
image.save(‘results_{}/s{}-c{}-l{}-e{}-sl{:4f}-cl{:4f}.jpg’.format(num,‘style_weight’,‘content_weight’,‘lr’,‘epoch’,‘style_loss’,‘content_loss’))
5. 将 N * H * W * C 的numpy格式图片转化为相应的tensor格式:
def toTensor(img):
img = torch.from_numpy( img.transpose((0, 3, 1, 2)) )
return img.float().div(255).unsqueeze(0)
Numpy的ndarray 或者Tensor转化成PILImage类型【在数据类型上,两者都有明确的要求】
1. ndarray的数据类型要求:
dtype=uint8, range[0, 255] and shape H x W x C
2. Tensor 的shape为: C * H * W 要求:
FloadTensor的,不允许DoubleTensor或者其他类型.
可以直接使用 pip torchsnooper 来安装:
用 **
@torchsnooper.snoop()
** 装饰一下要调试的函数,这个函数在执行的时候,就会自动print 出来每一行的执行结果的 tensor 的形状、数据类型、设备、是否需要梯度的信息。
在使用
matplotlib的过程中:
常常会需要画很多图,但是好像并不能同时**展示许多图。**这是因为python可视化库matplotlib的显示模式默认为阻塞(block)模式。
什么是阻塞模式那?我的理解就是在plt.show()之后,程序会暂停到那儿,并不会继续执行下去。如果需要继续执行程序,就要关闭图片。
那如何展示动态图或多个窗口呢?这就要使用
图前 plt.ion() — 图后 plt.ioff()
这2个函数,使matplotlib的显示模式转换为交互(interactive)模式。即使在脚本中遇到plt.show(),代码还是会继续执行。