torchvision是pytorch的数据集,也包含常用数据处理工具,包含几个模块:
1. transforms.Scale(size): 将输入的PIL.Image
重新改变大小成给定的size
,size
是最小边的边长。举个例子,如果原图的height>width
,那么改变大小后的图片大小是(size*height/width, size)
,若是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)
输出:
(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)
输出:
[[[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)
输出:
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]],…