pytorch 图像与tensor转换
Pytorch中Tensor与各种图像格式的相互转化
在pytorch中经常会遇到图像格式的转化,例如将PIL库读取出来的图片转化为Tensor,亦或者将Tensor转化为numpy格式的图片。而且使用不同图像处理库读取出来的图片格式也不相同,因此,如何在pytorch中正确转化各种图片格式(PIL、numpy、Tensor)是一个在调试中比较重要的问题。
本文主要说明在pytorch中如何正确将图片格式在各种图像库读取格式以及tensor向量之间转化的问题。以下代码经过测试都可以在Pytorch-0.4.0或0.3.0版本直接使用。
对python不同的图像库读取格式有疑问可以看这里:https://oldpan.me/archives/pytorch-transforms-opencv-scikit-image
格式转换
我们一般在pytorch或者python中处理的图像无非这几种格式:
PIL:使用python自带图像处理库读取出来的图片格式
numpy:使用python-opencv库读取出来的图片格式
tensor:pytorch中训练时所采取的向量格式(当然也可以说图片)
注意,之后的讲解图片格式皆为RGB三通道,24-bit真彩色,也就是我们平常使用的图片形式。
PIL与Tensor
PIL与Tensor的转换相对容易些,因为pytorch已经提供了相关的代码,我们只需要搭配使用即可:
所有代码都已经引用了(之后的代码省略引用部分):
import torch
from PIL import Image
import matplotlib.pyplot as plt
# loader使用torchvision中自带的transforms函数
loader = transforms.Compose([
transforms.ToTensor()])
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 将PIL图片转化为Tensor
# 输入PIL格式图片
# 返回tensor变量
def PIL_to_tensor(image):
image = loader(image).unsqueeze(0)
return image.to(device, torch.float)
3 Tensor转化为PIL图片
# 输入tensor变量
# 输出PIL格式图片
def tensor_to_PIL(tensor):
image = tensor.cpu().clone()
image = image.squeeze(0)
image = unloader(image)
return image
4 直接展示tensor格式图片
def imshow(tensor, title=None):
image = tensor.cpu().clone() # we clone the tensor to not do changes on it
image = image.squeeze(0) # remove the fake batch dimension
image = unloader(image)
plt.imshow(image)
if title is not None:
plt.title(title)
plt.pause(0.001) # pause a bit so that plots are updated
5 直接保存tensor格式图片
def save_image(tensor, **para):
dir = 'results'
image = tensor.cpu().clone() # we clone the tensor to not do changes on it
image = image.squeeze(0) # remove the fake batch dimension
image = unloader(image)
if not osp.exists(dir):
os.makedirs(dir)
image.save('results_{}/s{}-c{}-l{}-e{}-sl{:4f}-cl{:4f}.jpg'
.format(num, para['style_weight'], para['content_weight'], para['lr'], para['epoch'],
para['style_loss'], para['content_loss']))
numpy与Tensor
numpy格式是使用cv2,也就是python-opencv库读取出来的图片格式,需要注意的是用python-opencv读取出来的图片和使用PIL读取出来的图片数据略微不同,经测试用python-opencv读取出来的图片在训练时的效果比使用PIL读取出来的略差一些(详细过程之后发布)。
之后所有代码引用:
import cv2
import torch
import matplotlib.pyplot as plt
numpy转化为tensor
def toTensor(img):
assert type(img) == np.ndarray,'the img type is {}, but ndarry expected'.format(type(img))
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = torch.from_numpy(img.transpose((2, 0, 1)))
return img.float().div(255).unsqueeze(0) # 255也可以改为256
tensor转化为numpy
def tensor_to_np(tensor):
img = tensor.mul(255).byte()
img = img.cpu().numpy().squeeze(0).transpose((1, 2, 0))
return img
展示numpy格式图片
def show_from_cv(img, title=None):
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.figure()
plt.imshow(img)
if title is not None:
plt.title(title)
plt.pause(0.001)
展示tensor格式图片
def show_from_tensor(tensor, title=None):
img = tensor.clone()
img = tensor_to_np(img)
plt.figure()
plt.imshow(img)
if title is not None:
plt.title(title)
plt.pause(0.001)
注意
上面介绍的都是一张图片的转化,如果是n张图片一起的话,只需要修改一下相应代码即可。
举个例子,将之前说过的修改略微修改一下即可:
# 将 N x H x W X C 的numpy格式图片转化为相应的tensor格式
def toTensor(img):
img = torch.from_numpy(img.transpose((0, 3, 1, 2)))
return img.float().div(255).unsqueeze(0)
pytorch 图像与tensor转换相关推荐
- python代码转换为pytorch_python、PyTorch图像读取与numpy转换
python.PyTorch图像读取与numpy转换 发布时间:2018-06-15 16:27, 浏览次数:1147 , 标签: python PyTorch numpy Tensor转为numpy ...
- python、PyTorch图像读取与numpy转换
原文:https://blog.csdn.net/yskyskyer123/article/details/80707038 python.PyTorch图像读取与numpy转换 Tensor转为nu ...
- pytorch 实现张量tensor,图片,CPU,GPU,数组等的转换
pytorch 实现张量tensor,图片,CPU,GPU,数组等的转换 1, 创建pytorch 的Tensor张量: torch.rand((3,224,224)) #创建随机值的三维张量,大小为 ...
- pytorch图像和张量的相互转换_[Pytorch]Pytorch的tensor变量类型转换
原文:https://blog.csdn.net/hustchenze/article/details/79154139 Pytorch的数据类型为各式各样的Tensor,Tensor可以理解为高维矩 ...
- 实践教程 | 浅谈 PyTorch 中的 tensor 及使用
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者 | xiaopl@知乎(已授权) 来源 | https://z ...
- 【小白学PyTorch】9.tensor数据结构与存储结构
[机器学习炼丹术]的学习笔记分享 <<小白学PyTorch>> 小白学PyTorch | 8 实战之MNIST小试牛刀 小白学PyTorch | 7 最新版本torchvisi ...
- 【深度学习理论】一文搞透pytorch中的tensor、autograd、反向传播和计算图
转载:https://zhuanlan.zhihu.com/p/145353262 前言 本文的主要目标: 一遍搞懂反向传播的底层原理,以及其在深度学习框架pytorch中的实现机制.当然一遍搞不定两 ...
- Python数据类型、Numpy数据类型和Pytorch中的tensor类型间的相互转化
数据类型包括Python数据类型.Numpy数据类型和Pytorch中的tensor,Pytorch中的tensor又包括CPU上的数据类型和GPU上的数据类型. 一.Python数据类型 Pytho ...
- pytorch 图像预处理之减去均值,除以方差
在使用 torchvision.transforms进行数据处理时我们经常进行的操作是: transforms.Normalize((0.485,0.456,0.406), (0.229,0.224, ...
最新文章
- java直接内存为什么快_直接内存与 JVM 源码分析
- Python科学计算包应用-教你以可视化的方式打开NumPy
- tf.train.MomentumOptimizer()优化器
- 我犯的错误--关于主键
- 反向代理post参数怎么传输_面试必备:GET和POST的区别详细解说
- nginx服务器开启缓存、反向代理
- avue里面的select怎么设置默认值_mysql大量的waiting for table level lock怎么办
- 没用过这几招,别说你会使用Jupyter Notebook
- picker从后台取数据
- 管家婆服务器端linux版,管家婆辉煌2005+4.2完美特别版-支持网络、单机、门店;无任何限制...
- 基于机器学习中KNN算法的车牌字符识别
- 四川大学计算机学院2020推免公示,2020四川大学计算机学院推免夏令营通知
- 第九节 初始模块结构图的设计
- 搜集各种稀奇古怪的编码
- 计算机学硕毕业论文字数,华科硕士毕业论文几多要求?
- CentOS6.5挂载U盘
- springboot生鲜水果商城销售系统
- 网易折射出商业模式多棱镜:互联网进入Hard模式
- AI语音识别常见算法简介--目录参考
- 风河产品license介绍(Wind River Product Licensing video)
热门文章
- Linux 下查看文件的命令介绍
- 广度优先搜索求解迷宫问题
- 归并排序--数组和链表的实现
- Android--GridView实现动态文字排版
- html5制作交互式课件,用flash制作交互式课件.ppt
- java redis mq_redis之mq实现发布订阅模式
- /scripts/checkkconfigsymbols.sh
- html 滚动条_数十种自定义多彩多样滚动条样式
- mysql row 转int_mysql_row[]取值转换有关问题,
- linux下dump命令,Linux dump命令