pytorch 读取自己的数据

读取自己数据所使用的transforms方法

class torchvision.transforms.CenterCrop(size)

将给定的PIL.Image进行中心切割,得到给定的sizesize可以是tuple(target_height, target_width)size也可以是一个Integer,在这种情况下,切出来的图片的形状是正方形。

class torchvision.transforms.RandomCrop(size, padding=0)

切割中心点的位置随机选取。size可以是tuple也可以是Integer

class torchvision.transforms.RandomHorizontalFlip

随机水平翻转给定的PIL.Image,概率为0.5。即:一半的概率翻转,一半的概率不翻转。

class torchvision.transforms.RandomSizedCrop(size, interpolation=2)

先将给定的PIL.Image随机切,然后再resize成给定的size大小。

class torchvision.transforms.Pad(padding, fill=0)

将给定的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)
<class 'PIL.PngImagePlugin.PngImageFile'>
(10, 10)
<class 'PIL.Image.Image'>
(30, 30) #由于上下左右都要填充10个像素,所以填充后的size是(30,30)

对Tensor进行变换

class torchvision.transforms.Normalize(mean, std)

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

Conversion Transforms

class torchvision.transforms.ToTensor

把一个取值范围是[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)

class torchvision.transforms.ToPILImage

shape(C,H,W)Tensorshape(H,W,C)numpy.ndarray转换成PIL.Image,值不变。

通用变换

class torchvision.transforms.Lambda(lambd)

使用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()

猜你喜欢

转载自blog.csdn.net/a362682954/article/details/81191048
今日推荐