pytorch的 torchvision transforms

torchvision是pytorch的数据集,也包含常用数据处理工具,包含几个模块

  1. datasets(包含常用的数据集:minist,COCO等)
  2. models(包含常用的著名网络结构:AlexNet,VGG,ResNet等等,你可以使用随机初始化的网络结构,也可以使用已经训练好的网络)
  3. transforms(对PIL.Image进行变换处理:Scale(缩放)、CenterCrop(中心切割)、Pad(填充)等),PIL(Python Imaging Library)是python对图形处理的库。

下面具体讲一下transforms中常用函数的使用

1. transforms.Scale(size): 将输入的PIL.Image重新改变大小成给定的sizesize是最小边的边长。举个例子,如果原图的height>width,那么改变大小后的图片大小是(size*height/width, size),若是height<width,那么就是(size, size*width/height)。
例:

from PIL import Image
from torchvision import transforms
crop=transforms.Scale(12)
img=Image.open('test.jpg')
print(type(img))
print(img.size)
print(crop(img).size)

输出:
<class ‘PIL.JpegImagePlugin.JpegImageFile’>
(261, 230)
(13, 12)

2. transforms.ToTensor():把一个取值范围是[0,255]的PIL.Image或者shape为(Height,Width,Channel)的numpy.ndarray,转换成形状为[Channel,Height,Width],(也就是把通道数放第一维度了)且取值范围是[0,1.0]的torch.FloadTensor。
例:

from PIL import Image
from torchvision import transforms
import numpy as np
im = Image.open('test.jpg')
im_arry=np.asarray(im)
print(im_arry.shape)
im_tensor=transforms.ToTensor()(im)#或者用im_arry也是可以的
print(im_tensor)
print(im_tensor.shape)

输出:
(230, 261, 3)
tensor([[[0.2314, 0.2392, 0.2392, …, 0.2314, 0.2314, 0.2392],
[0.2314, 0.2314, 0.2314, …, 0.2314, 0.2314, 0.2314],
[0.2314, 0.2314, 0.2314, …, 0.2314, 0.2314, 0.2314],
…,

torch.Size([3, 230, 261])
可以看出通道数的确放前面去了,且取值范围都在0-1之间,而且transforms.ToTensor()是直接处理PIL image也可以是image array

3 transforms.ToPILImage与前面的相反:将shape为(C,H,W)的Tensor或shape为(H,W,C)的numpy.ndarray转换成PIL.Image,值不变

4 transforms.Normalize(mean, std):给定均值:(R,G,B) ,方差:(R,G,B),将会把Tensor正则化。即:Normalized_image=(image-mean)/std
例:

from PIL import Image
from torchvision import transforms
import numpy as np
im = Image.open('test.jpg')
im_arry=np.asarray(im)
print(im_arry.shape)
im_tensor=transforms.ToTensor()(im)

im_Normal=transforms.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5))(im_tensor)
print(im_tensor)
print(im_tensor.shape)

输出:
(230, 261, 3)
tensor([[[-0.5373, -0.5216, -0.5216, …, -0.5373, -0.5373, -0.5216],
[-0.5373, -0.5373, -0.5373, …, -0.5373, -0.5373, -0.5373],
[-0.5373, -0.5373, -0.5373, …, -0.5373, -0.5373, -0.5373],
…,
[-0.6627, -0.6627, -0.6627, …, -0.6627, -0.6627, -0.6627],
[-0.6627, -0.6627, -0.6627, …, -0.6627, -0.6627, -0.6627],
[-0.6627, -0.6627, -0.6627, …, -0.6627, -0.6627, -0.6627]],

torch.Size([3, 230, 261])
一定要把图像先转换为tensor,在用此函数。

5 transforms.Pad(padding, fill=0):将给定的PIL.Image的所有边用给定的pad value填充。 padding:要填充多少像素 fill:用什么值填充
例:

from PIL import Image
from torchvision import transforms
import numpy as np
im = Image.open('test.jpg')
print(im)
im_re=transforms.Resize((3, 3))(im)
print(np.asarray(im_re))
print(np.asarray(im_re).shape)
im_pad=transforms.Pad(padding=1,fill=0)(im_re)
print(np.asarray(im_pad))
print(np.asarray(im_pad).shape)

输出:
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=261x230 at 0x20FBDA02EB8>
[[[60 61 61]
[61 62 62]
[62 64 64]]

[[53 54 53]
[53 53 52]
[51 51 50]]

[[45 45 45]
[45 45 45]
[45 45 45]]]
(3, 3, 3)
[[[ 0 0 0]
[ 0 0 0]
[ 0 0 0]
[ 0 0 0]
[ 0 0 0]]

[[ 0 0 0]
[60 61 61]
[61 62 62]
[62 64 64]
[ 0 0 0]]

[[ 0 0 0]
[53 54 53]
[53 53 52]
[51 51 50]
[ 0 0 0]]

[[ 0 0 0]
[45 45 45]
[45 45 45]
[45 45 45]
[ 0 0 0]]

[[ 0 0 0]
[ 0 0 0]
[ 0 0 0]
[ 0 0 0]
[ 0 0 0]]]
(5, 5, 3)
可以看出图片填充在每一个通道上都进行了填充,可以把初始[3,3,3]想像成一个333的立方体,然后上下两个面不动,周围4个面各向外推出2,就得到553的立方体。
6 transforms.Resize((height, width)):resize图像,例子见上

7 transforms.Compose():就是把多个transforms组合起来.
例子:

from PIL import Image
from torchvision import transforms
import numpy as np
im = Image.open('test.jpg')
print(im)
com=transforms.Compose([
     transforms.Resize((3,4)),
     transforms.ToTensor(),
 ])
im_com=com(im)
print(im_com)

输出:
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=261x230 at 0x1BDDCFC2E10>
tensor([[[0.2353, 0.2314, 0.2471, 0.2392],
[0.2078, 0.2078, 0.2039, 0.1961],
[0.1765, 0.1765, 0.1765, 0.1765]],…

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值