PIL.Image/numpy.ndarray与Tensor的相互转换

转载 2018年04月17日 15:18:07
为了方便进行数据的操作,pytorch团队提供了一个torchvision.transforms包,我们可以用transforms进行以下操作:
  • PIL.Image/numpy.ndarray与Tensor的相互转化;
  • 归一化;
  • 对PIL.Image进行裁剪、缩放等操作。

通常,在使用torchvision.transforms,我们通常使用transforms.Compose将transforms组合在一起。

PIL.Image/numpy.ndarray与Tensor的相互转换

PIL.Image/numpy.ndarray转化为Tensor,常常用在训练模型阶段的数据读取,而Tensor转化为PIL.Image/numpy.ndarray则用在验证模型阶段的数据输出。

我们可以使用 transforms.ToTensor() 将 PIL.Image/numpy.ndarray 数据进转化为torch.FloadTensor,并归一化到[0, 1.0]:

  • 取值范围为[0, 255]的PIL.Image,转换成形状为[C, H, W],取值范围是[0, 1.0]的torch.FloadTensor;
  • 形状为[H, W, C]的numpy.ndarray,转换成形状为[C, H, W],取值范围是[0, 1.0]的torch.FloadTensor。

而transforms.ToPILImage则是将Tensor转化为PIL.Image。如果,我们要将Tensor转化为numpy,只需要使用 .numpy() 即可。如下:

[python] view plain copy
  1. img_path = "./data/img_37.jpg"  
  2.   
  3. # transforms.ToTensor()  
  4. transform1 = transforms.Compose([  
  5.     transforms.ToTensor(), # range [0, 255] -> [0.0,1.0]  
  6.     ]  
  7. )  
  8.   
  9. ##numpy.ndarray  
  10. img = cv2.imread(img_path)# 读取图像  
  11. img1 = transform1(img) # 归一化到 [0.0,1.0]  
  12. print("img1 = ",img1)  
  13. # 转化为numpy.ndarray并显示  
  14. img_1 = img1.numpy()*255  
  15. img_1 = img_1.astype('uint8')  
  16. img_1 = np.transpose(img_1, (1,2,0))  
  17. cv2.imshow('img_1', img_1)  
  18. cv2.waitKey()  
  19.   
  20. ##PIL  
  21. img = Image.open(img_path).convert('RGB'# 读取图像  
  22. img2 = transform1(img) # 归一化到 [0.0,1.0]  
  23. print("img2 = ",img2)  
  24. #转化为PILImage并显示  
  25. img_2 = transforms.ToPILImage()(img2).convert('RGB')  
  26. print("img_2 = ",img_2)  
  27. img_2.show()   


归一化

归一化对神经网络的训练是非常重要的,那么我们如何归一化到[-1.0, -1.0]呢?只需要将上面的transform1改为如下所示:

[python] view plain copy
  1. transform2 = transforms.Compose([  
  2.     transforms.ToTensor(),  
  3.     transforms.Normalize(mean = (0.50.50.5), std = (0.50.50.5))  
  4.     ]  
  5. )  

(1)transforms.Compose就是将transforms组合在一起;

(2)transforms.Normalize使用如下公式进行归一化:

channel=(channel-mean)/std

这样一来,我们的数据中的每个值就变成了[-1,1]的数了。


PIL.Image的缩放裁剪等操作

此外,transforms还提供了裁剪,缩放等操作,以便进行数据增强。下面就看一个随机裁剪的例子,这个例子中,仍然使用 Compose 将 transforms 组合在一起,如下:

[python] view plain copy
  1. # transforms.RandomCrop()  
  2. transform4 = transforms.Compose([  
  3.     transforms.ToTensor(),   
  4.     transforms.ToPILImage(),  
  5.     transforms.RandomCrop((300,300)),  
  6.     ]  
  7. )  
  8.   
  9. img = Image.open(img_path).convert('RGB')  
  10. img3 = transform4(img)  
  11. img3.show()  

最后,安利一下pytorch中文文档

在各方小伙伴的努力和支持下,pytorch中文文档第一版终于上线啦!!!(鼓掌)文档还有很多小瑕疵,但是大体可以放心使用了~我们遵循快速迭代的原则,所以赶紧上线第一版来接受广大开源社区的意见和建议。欢迎加入我们!

github项目地址:awfssv/pytorch-cn

中文翻译组QQ群:628478868

还有pytorch项目交流群:613523596

欢迎关注!

深入浅出Numpy

随着人工智能的复兴,越来越多AI的架构采用Python语言来开发,因此学会Numpy处理数据,就成为当下最急需的技能。人工智能其实就是数据处理方式,因此需要学习怎么样表示数据、以及数据处理方式,Numpy库就是人工智能里的基础,比如在TensorFlow应用非常广泛。
  • 2017年09月27日 08:38

tensor 和 numpy 的互相转换

要对tensor进行操作,需要先启动一个Session,否则,我们无法对一个tensor比如一个tensor常量重新赋值或是做一些判断操作,所以如果将它转化为numpy数组就好处理了。下面一个小程序讲...
  • ljs_a
  • ljs_a
  • 2017-12-09 11:40:19
  • 5396

has invalid type <class 'numpy.ndarray'>, must be a string or Tensor

has invalid type , must be a string or Tensor
  • jacke121
  • jacke121
  • 2017-12-18 15:55:09
  • 548

第一个tensorflow小程序——异或门实现

代码:#author@chengxiaona import tensorflow as tf import numpy as np#输入训练数据,这里是python的list, 也可以定义为numpy...
  • chengxiaona
  • chengxiaona
  • 2017-10-15 16:32:25
  • 909

Python中PILImage和Python转化

Python中PILImage和Python转化
  • wfei101
  • wfei101
  • 2017-12-09 09:53:28
  • 215

Python(5) Image和Ndarray互相转换

import numpy as np from PIL import Imageimg = Image.open(filepath) img_convert_ndarray = Image.froma...
  • GZHermit
  • GZHermit
  • 2017-05-25 22:53:25
  • 5358

python中list由于numpy array的转换

u = array([[1,2],[3,4]]) m = u.tolist() #转换为list m.remove(m[0]) #移除m[0] m = np.array(m) #转换为ar...
  • BigFish_yukang
  • BigFish_yukang
  • 2017-03-20 18:09:59
  • 3939

Tensorflow踩坑记

这里是踩坑纪录,大家如果想看教程的话请出门右转~从前有个小孩,正在学习TF,一开始,写了个逻辑回归的优化程序:import tensorflow as tf import numpy as npx=t...
  • hejunqing14
  • hejunqing14
  • 2016-09-28 15:38:27
  • 10356

convert between PIL Image and ndarray

arr = imread(‘a.jpg’) img = Image.fromarray(arr) arr = np.asarray(img) References: 1. http://...
  • visionfans
  • visionfans
  • 2015-04-27 16:50:41
  • 942

PIL.Image和np.ndarray图片与Tensor之间的转换

为了方便进行数据的操作,pytorch团队提供了一个torchvision.transforms包,我们可以用transforms进行以下操作: PIL.Image/numpy.ndarray与Ten...
  • tsq292978891
  • tsq292978891
  • 2017-12-10 20:48:41
  • 320
收藏助手
不良信息举报
您举报文章:PIL.Image/numpy.ndarray与Tensor的相互转换
举报原因:
原因补充:

(最多只允许输入30个字)