pytorch中transform的使用

transform中各类用法

  • 1.ToTensor转换图片格式
  • 2.Normalize图片标准化
  • 3.Resize图片大小缩放
  • 4.Compose整合以上多个类
  • 5.其它类如RandomCrop随机裁剪
  • 6.以上类完整代码

1.ToTensor转换图片格式

transform是一个transform.py文件,里面包含多个类,其中包括ToTensor类,注意ToTensor是一个类,而不是一个方法,所有首先要创建一个对象,然后在用该对象将图片的PIL格式或是numpy格式转化为Tensor格式,代码如下:

from PIL import Image
from torchvision import transforms

img_path = "data/train/ants_image/0013035.jpg"
img_PIL = Image.open(img_path)

tensor_trans = transforms.ToTensor()
tensor_img = tensor_trans(img_PIL)

print(tensor_img)

上面代码是将PIL格式转化为Tensor格式,如果是要numpy格式的图片,除了之前用numpy.array强制将格式转化为numpy格式外,还可通过OpenCV中的cv2.imread函数直接获得numpy格式的图片,代码如下:

import cv2
cv2.imread(img_path)

2.Normalize图片标准化

Normalize类用于将输入的图片进行标准化,用法是创建对象=transform.Normaliz(n维平均值, n维标准差)其中的输入的第一个参数是图片的n维平均值,第二个参数是图片的n维方差,这里的n是指通道数,一般为3通道,即第一个参数是是一个包含三个数的一维数组,第一个数是第一通道下的平均值,第二个数是第二通道的平均值,第三个数是第三通道的平均值。代码如下:

print(img_tensor[0][0][0])
trans_nor = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
img_norm = trans_nor(img_tensor)
print(img_norm[0][0][0])

其中的0.5是随便取的,输出结果是图中第一个像素点的第一个通道的值在标准化后的值与原值相比,明显不同。

3.Resize图片大小缩放

Resize类用于将图片按指定大小缩放,注意原图应该是PIL图片类型,同时输出的图像也是PIL图片类型,如果要将图片进行其他操作,则还需使用之前的ToTensor进行类型转换。用法是创建对象=transform.Resize((尺寸大小)),其中尺寸大小为一个含有两个数的一维数组,代码如下:

print(img.size)
trans_resize = transforms.Resize((512, 512))
img_resize = trans_resize(img)
print(img_resize)

输出将看到缩放后的图片大小尺寸为512*512。

4.Compose整合以上多个类

Compose类用于将上述所说的多个类,或者transform中其他的类中,任取其中多个类,将其进行一个整合的过程,即把多个类的方法包装一下,这样就可以通过Compose一个类完成多个类的操作,就相当与是一个包装操作。用法是创建对象=transform.Compose([一种类的对象, 另一种类的对象, …]),其中,前一个类的对象的输出类型应该是后一个种类的对象的输入类型,这样才是使得原来要处理的图片能按顺序进行里面多个类的一系列操作。例如,使用Compose整合上述的Resize和ToTensor两个类,其中Resize采用另一种创建方式,为参数只有单个数值,而非一个数组的方式,该方式意为按高为该数值等比缩放,代码为:

trans_resize_2 = transforms.Resize(512)
trans_compose = transforms.Compose([trans_resize_2, trans_totensor])
img_resize_2 = trans_compose(img)
writer.add_image("Resize", img_resize_2, 1)

5.其它类如RandomCrop随机裁剪

RandomCrop用于将图片裁剪为指定大小,用法为创建对象=RandomCrop((x, y))或创建对象=RandomCrop(?),当是前者时为裁剪一个xy大小的图片,当是后者时为裁剪一个??大小的图片,且每次调用都会一直往后裁剪,即裁剪还未剪过的部分,代码为:

trans_random = transforms.RandomCrop((100, 200))
trans_compose_2 = transforms.Compose([trans_random, trans_totensor])
for i in range(10):
    img_crop = trans_compose_2(img)
    writer.add_image("RandomCrop", img_crop, i)

6.以上类完整代码

from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms

writer = SummaryWriter("logs")
img = Image.open("data/train/ants_image/0013035.jpg")
print(img)

# ToTensor
trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)

# Normalize
print(img_tensor[0][0][0])
trans_nor = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
img_norm = trans_nor(img_tensor)
print(img_norm[0][0][0])
writer.add_image("Normalize", img_norm)

# Resize
print(img.size)
trans_resize = transforms.Resize((512, 512))
img_resize = trans_resize(img)
img_resize = trans_totensor(img_resize)
print(img_resize)
writer.add_image("Resize", img_resize)

# Compose
trans_resize_2 = transforms.Resize(512)
trans_compose = transforms.Compose([trans_resize_2, trans_totensor])
img_resize_2 = trans_compose(img)
writer.add_image("Resize", img_resize_2, 1)

# RandomCrop
trans_random = transforms.RandomCrop((100, 200))
trans_compose_2 = transforms.Compose([trans_random, trans_totensor])
for i in range(10):
    img_crop = trans_compose_2(img)
    writer.add_image("RandomCrop", img_crop, i)

writer.close()

你可能感兴趣的:(pytorch,pytorch,python,计算机视觉)