transforms
transforms主要用于图片的一些变换。
transforms指的是transforms.py文件,里面有很多class,每个class为一个图片处理工具。
transforms的工具有totensor,resize等等。
ToTensor
将图片转换为tensor
from PIL import Image
from torchvision import transforms
img_path = "dataset/train/ants/0013035.jpg"
img = Image.open(img_path)
tensor_trans = transforms.ToTensor()
tensor_img = tensor_trans(img)
print(type(tensor_img))
变为tensor后传给tensorboard,后续例子的变化均传给tensorboard,以便查看结果。
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
img_path = "dataset/train/ants/5650366_e22b7e1065.jpg"
img = Image.open(img_path)
tensor_trans = transforms.ToTensor()
tensor_img = tensor_trans(img)
writer = SummaryWriter("logs")
writer.add_image("ToTensor", tensor_img)
writer.close()
Normalize
对图片的像素点的均值和标准差进行设置,这里先将图片变为tensor,再传入Normalize。
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
writer = SummaryWriter("logs")
img = Image.open("dataset/train/ants/0013035.jpg")
# ToTensor
trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)
writer.add_image("ToTensor", img_tensor)
# Normalize
'''transforms.Normalize的参数为tensor的每一个channel的均值和标准差,第一个[0.5, 0.5, 0.5]为tensor的每一个channel的均值,第二个[0.5, 0.5, 0.5]为标准差,
函数作用为output[channel] = (input[channel] - mean[channel]) / std[channel]'''
trans_norm = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
img_norm = trans_norm(img_tensor)
writer.add_image("Normalize", img_norm)
writer.close()
tensorboard 显示结果为:
Resize
将图片变为指定大小。
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
writer = SummaryWriter("logs")
img = Image.open("data/VCG211363439424.jpg")
# resize
trans_resize = transforms.Resize((512, 512))# (512,512)为图片大小,只传入一个数图片形状不会改变。
img_resize = trans_resize(img)
img_resize = trans_totensor(img_resize)
writer.add_image('resize', img_resize, 0)
writer.close()
Compose
Compose可以将多个操作串联在一起,这里先Resize在ToTensor,串联在一起。
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
writer = SummaryWriter("logs")
img = Image.open("data/VCG211363439424.jpg")
# ToTensor
trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)
writer.add_image("ToTensor", img_tensor)
# Compose
trans_resize_2 = transforms.Resize(512) #这里只输入一个数,对原图做等比缩放
trans_compose = transforms.Compose([trans_resize_2, trans_totensor]) #compose将缩放和转tensor操作合成在一起
img_resize_2 = trans_compose(img)
writer.add_image("resize", img_resize_2, 1)
writer.close()
RandomCrop
随机位置在原图中裁剪指定大小的图片。
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
writer = SummaryWriter("logs")
img = Image.open("data/VCG211363439424.jpg")
# ToTensor
trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)
writer.add_image("ToTensor", img_tensor)
# RandomCrop
trans_random = transforms.RandomCrop(512) #随机位置在原图中裁剪(512,512)大小的图片
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()
总结
1.注意transforms的输入和输出类型,如果文档没有告诉输出是什么类型,可以print结果或print(type()),或者debug,看变量类型。
2.看官方文档,transforms.py文件里每一个类都有简介,注意输入参数。
4.使用方法:导入transfrom.py;创建该文件里面类的实例,创建的时候需要传参数,表示该实例的具体作用;用该实例对数据进行变换。