将给定的PIL.Image
进行中心切割,得到给定的size
,size
可以是tuple
,(target_height, target_width)
。size
也可以是一个Integer
,在这种情况下,切出来的图片的形状是正方形。
切割中心点的位置随机选取。size
可以是tuple
也可以是Integer
。
随机水平翻转给定的PIL.Image
,概率为0.5
。即:一半的概率翻转,一半的概率不翻转。
先将给定的PIL.Image
随机切,然后再resize
成给定的size
大小。
将给定的PIL.Image
的所有边用给定的pad value
填充。 padding:
要填充多少像素 fill:
用什么值填充 例子:
from torchvision import transforms
from PIL import Image
padding_img = transforms.Pad(padding=10, fill=0)
img = Image.open('test.jpg')
print(type(img))
print(img.size)
padded_img=padding(img)
print(type(padded_img))
print(padded_img.size)
(10, 10)
(30, 30) #由于上下左右都要填充10个像素,所以填充后的size是(30,30)
给定均值:(R,G,B)
方差:(R,G,B)
,将会把Tensor
正则化。即:Normalized_image=(image-mean)/std
。
把一个取值范围是[0,255]
的PIL.Image
或者shape
为(H,W,C)
的numpy.ndarray
,转换成形状为[C,H,W]
,取值范围是[0,1.0]
的torch.FloadTensor
data = np.random.randint(0, 255, size=300)
img = data.reshape(10,10,3)
print(img.shape)
img_tensor = transforms.ToTensor()(img) # 转换成tensor
print(img_tensor)
将shape
为(C,H,W)
的Tensor
或shape
为(H,W,C)
的numpy.ndarray
转换成PIL.Image
,值不变。
使用lambd
作为转换器。
import torch
import torchvision
from torchvision import transforms, utils
import matplotlib.pyplot as plt
#读取图片
#compose函数会将多个transforms包在一起
#transforms有如下几种
# Resize:把给定的图片resize到given size
# Normalize(mean,std)是通过下面公式实现数据归一化
# channel=(channel-mean)/std
# ToTensor是指把PIL.Image(RGB) 或者numpy.ndarray(H x W x C) 从0到255的值映射到0到1的范围内,并转化成Tensor格式。
# ToPILImage: convert a tensor to PIL image
# Scale:目前已经不用了,推荐用Resize
# CenterCrop:在图片的中间区域进行裁剪
# RandomCrop:在一个随机的位置进行裁剪
# RandomHorizontalFlip:以0.5的概率水平翻转给定的PIL图像
# RandomVerticalFlip:以0.5的概率竖直翻转给定的PIL图像
# RandomResizedCrop:将PIL图像裁剪成任意大小和纵横比
# Grayscale:将图像转换为灰度图像
# RandomGrayscale:将图像以一定的概率转换为灰度图像
# FiceCrop:把图像裁剪为四个角和一个中心
# TenCrop
# Pad:填充
# ColorJitter:随机改变图像的亮度对比度和饱和度
img_data = torchvision.datasets.ImageFolder('/media/chenli/F1/newwork/flower_photos',
transform=transforms.Compose([
transforms.Scale(256),
transforms.CenterCrop(224),
transforms.ToTensor()])
)
#转成pytorch读取格式,可以设置batch_size和是否打乱所有数据
print(len(img_data))
data_loader = torch.utils.data.DataLoader(img_data, batch_size=30,shuffle=False)
print(len(data_loader))
#显示图片
def show_batch(imgs):
#每一列五个
grid = utils.make_grid(imgs,nrow=5)
print grid.shape
#将三维矩阵((0, 1, 2)转化为((1, 2, 0)
#plt.imshow()函数负责对图像进行处理,并显示其格式
plt.imshow(grid.numpy().transpose((1, 2, 0)))
plt.title('Batch from dataloader')
#按一个batch_size读取数据,batch_x为数据,batch_y为标签
for i, (batch_x, batch_y) in enumerate(data_loader):
if(i<4):
# print(i, batch_x.size(), batch_y.size())
# print(batch_y)
show_batch(batch_x)
plt.axis('off')
# plt.show()则是将plt.imshow()处理后的函数显示出来。
plt.show()