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转换相关推荐

  1. python代码转换为pytorch_python、PyTorch图像读取与numpy转换

    python.PyTorch图像读取与numpy转换 发布时间:2018-06-15 16:27, 浏览次数:1147 , 标签: python PyTorch numpy Tensor转为numpy ...

  2. python、PyTorch图像读取与numpy转换

    原文:https://blog.csdn.net/yskyskyer123/article/details/80707038 python.PyTorch图像读取与numpy转换 Tensor转为nu ...

  3. pytorch 实现张量tensor,图片,CPU,GPU,数组等的转换

    pytorch 实现张量tensor,图片,CPU,GPU,数组等的转换 1, 创建pytorch 的Tensor张量: torch.rand((3,224,224)) #创建随机值的三维张量,大小为 ...

  4. pytorch图像和张量的相互转换_[Pytorch]Pytorch的tensor变量类型转换

    原文:https://blog.csdn.net/hustchenze/article/details/79154139 Pytorch的数据类型为各式各样的Tensor,Tensor可以理解为高维矩 ...

  5. 实践教程 | 浅谈 PyTorch 中的 tensor 及使用

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者 | xiaopl@知乎(已授权) 来源 | https://z ...

  6. 【小白学PyTorch】9.tensor数据结构与存储结构

    [机器学习炼丹术]的学习笔记分享 <<小白学PyTorch>> 小白学PyTorch | 8 实战之MNIST小试牛刀 小白学PyTorch | 7 最新版本torchvisi ...

  7. 【深度学习理论】一文搞透pytorch中的tensor、autograd、反向传播和计算图

    转载:https://zhuanlan.zhihu.com/p/145353262 前言 本文的主要目标: 一遍搞懂反向传播的底层原理,以及其在深度学习框架pytorch中的实现机制.当然一遍搞不定两 ...

  8. Python数据类型、Numpy数据类型和Pytorch中的tensor类型间的相互转化

    数据类型包括Python数据类型.Numpy数据类型和Pytorch中的tensor,Pytorch中的tensor又包括CPU上的数据类型和GPU上的数据类型. 一.Python数据类型 Pytho ...

  9. pytorch 图像预处理之减去均值,除以方差

    在使用 torchvision.transforms进行数据处理时我们经常进行的操作是: transforms.Normalize((0.485,0.456,0.406), (0.229,0.224, ...

最新文章

  1. java直接内存为什么快_直接内存与 JVM 源码分析
  2. Python科学计算包应用-教你以可视化的方式打开NumPy
  3. tf.train.MomentumOptimizer()优化器
  4. 我犯的错误--关于主键
  5. 反向代理post参数怎么传输_面试必备:GET和POST的区别详细解说
  6. nginx服务器开启缓存、反向代理
  7. avue里面的select怎么设置默认值_mysql大量的waiting for table level lock怎么办
  8. 没用过这几招,别说你会使用Jupyter Notebook
  9. picker从后台取数据
  10. 管家婆服务器端linux版,管家婆辉煌2005+4.2完美特别版-支持网络、单机、门店;无任何限制...
  11. 基于机器学习中KNN算法的车牌字符识别
  12. 四川大学计算机学院2020推免公示,2020四川大学计算机学院推免夏令营通知
  13. 第九节 初始模块结构图的设计
  14. 搜集各种稀奇古怪的编码
  15. 计算机学硕毕业论文字数,华科硕士毕业论文几多要求?
  16. CentOS6.5挂载U盘
  17. springboot生鲜水果商城销售系统
  18. 网易折射出商业模式多棱镜:互联网进入Hard模式
  19. AI语音识别常见算法简介--目录参考
  20. 风河产品license介绍(Wind River Product Licensing video)

热门文章

  1. Linux 下查看文件的命令介绍
  2. 广度优先搜索求解迷宫问题
  3. 归并排序--数组和链表的实现
  4. Android--GridView实现动态文字排版
  5. html5制作交互式课件,用flash制作交互式课件.ppt
  6. java redis mq_redis之mq实现发布订阅模式
  7. /scripts/checkkconfigsymbols.sh
  8. html 滚动条_数十种自定义多彩多样滚动条样式
  9. mysql row 转int_mysql_row[]取值转换有关问题,
  10. linux下dump命令,Linux dump命令