Pytorch之ToPILImage()不输出图片问题及解决
作者:Adversity-sl
这篇文章主要介绍了Pytorch之ToPILImage()不输出图片问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
Pytorch ToPILImage()不输出图片
先导torchvision包
from PIL import Image from torchvision.transforms import ToTensor,ToPILImage
定义转换操作
img_to_tensor = ToTensor() # img -> tensor tensor_to_pil = ToPILImage() # tensor -> img
读取图片
img = Image.open('../test.jpg') # ‘' 引号内为要读取图片的相对路径
把读取的图片转换成tensor进而对其操作,
unsqueeze(0)是在给转换后的tensor加一个维度
input = img_to_tensor(img).unsqueeze(0) #torch.Size([1, 3, 960, 720])
对图像进行一个简单的操作,此处用的3*3的kernel进行锐化卷积
kernel = t.ones(3,3)/-9. kernel[1][1] = 1 conv = nn.Conv2d(1,1,(3,3),1,bias=False) #卷积 conv.weight.data = kernel.view(1,1,3,3) #权重
将图片传入卷积层,并输出
out = conv(V(input)) tensor_to_pil(out.data.squeeze(0)).show()
注意,此处若不用.show()则输出台无显示。
另附torchvision.transforms.ToTensor及torchvision.transforms.ToPILImage的转换过程
torchvision.transforms.ToTensor
对于一个图片img,调用ToTensor转化成张量的形式,发生的不是将图片的RGB三维信道矩阵变成tensor
图片在内存中以bytes的形式存储,转化过程的步骤是:
- img.tobytes() 将图片转化成内存中的存储格式
- torch.BytesStorage.frombuffer(img.tobytes() ) 将字节以流的形式输入,转化成一维的张量
- 对张量进行reshape
- 对张量进行permute(2,0,1)
- 将当前张量的每个元素除以255
- 输出张量
torchvision.transforms.ToPILImage
对于一个Tensor的转化过程是:
- 将张量的每个元素乘上255
- 将张量的数据类型有FloatTensor转化成Uint8
- 将张量转化成numpy的ndarray类型
- 对ndarray对象做permute (1, 2, 0)的操作
- 利用Image下的fromarray函数,将ndarray对象转化成PILImage形式
- 输出PILImage
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。