一、Transforms的结构及用法
1.Transform结构:
Transform.py是一个文件/工具箱,totensor、resize这些class就是其中的工具;
一般就是拿特定格式的图片--->工具--->输出想要的图片的结果:
2.常见的Transforms:
①ToTensor类:
class ToTensor:
''''''
#作用:
将PIL或者Numpy类型的图片转换为tensor类型
#参数使用:
使用时需要传递pic参数
#_ _call_ _的作用
_ _call_ _是一种不用.调用的方式,如果定义了内置call的话,直接输入类型名(需要的参数)就可以调用call方法
''''''
totensor使用示例代码:
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
writer = SummaryWriter("log")
img = Image.open("dataset/train/ants/0013035.jpg")
trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)
writer.add_image("Totensor",img_tensor)
writer.close()
#terminal调用:
#tensorboard --logdir=log
②Compose类:
class Compose:
''''''
#作用:把不同的Transforms结合在一起
#案例
transforms.Compose([transforms.CenterCrop(10),#先中心裁剪
transforms.PILToTensor(),#转化为totensor类
transforms.ConvertImageDtype(torch.float)])
Compose使用示例代码:
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
writer = SummaryWriter("log")
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
print(img_tensor[0][0][0])#原来第一行第一列像素值输出
trans_norm = transforms.Normalize([0.5,0.5,0.5],[0.5,0.5,0.5])
img_norm = trans_norm(img_tensor)
print(img_norm[0][0][0])#归一化结果输出
writer.add_image("Normalize",img_norm)#tensorboard结果输出
#Resize
print(img.size)
trans_resize = transforms.Resize((512,512))
#img PIL->resize->img_resize PLI先调整大小
img_resize = trans_resize(img)
#img_resize PIL->totensor->img_resize tensor变为tensor类型
img_resize = trans_totensor(img_resize)
print(img_resize)
writer.add_image("Resize",img_resize,0)
#Compose的参数是一个列表,数据要求为Transforms类型
#完成一件事是用一个方法把a变成b,另一个方法把b变成c,Compose拼接了Resize和totensor
trans_resize_2 = transforms.Resize(512)
#PIL ->resize输出为PIL->totensor输入类型为PIL——>输出为tensor
#compose第一个参数的输出要和第二个参数的输入匹配
trans_compose = transforms.Compose([trans_resize_2,trans_totensor])
img_resize_2 = trans_compose(img)
writer.add_image("Resize2",img_resize_2,1)
writer.close()
③ToPILImage类:
class ToPILImage:
''''''
#作用:将tensor型或者ndarray 转换为PIL图片
''''''
④Normalize类:
class Normalize(torch.nn.Module):
''''''
#作用:可以归一化一个tensor图像,消除奇异值,加快训练速度
#输入参数:
mean (sequence): 平均值,有几个通道写几个
std (sequence): 方差,有几个通道写几个图片一般有三个
#公式:output[channel] = (input[channel] - mean[channel]) / std[channel]
''''''
normalize使用示例代码:
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
writer = SummaryWriter("log")
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
print(img_tensor[0][0][0])#原来第一行第一列像素值输出
trans_norm = transforms.Normalize([0.5,0.5,0.5],[0.5,0.5,0.5])
img_norm = trans_norm(img_tensor)
print(img_norm[0][0][0])#归一化结果输出
writer.add_image("Normalize",img_norm)#tensorboard结果输出
writer.close()
结果:
tensor(0.3137)
tensor(-0.3725)
⑤Resize类:
class Resize
''''''
#作用:
将PIL Image转换为固定大小
#所需参数:
需要输入(h,w)这样的序列;如果只输入一个int型数据,则等比例缩放
Resize使用示例代码:
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
writer = SummaryWriter("log")
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
print(img_tensor[0][0][0])#原来第一行第一列像素值输出
trans_norm = transforms.Normalize([0.5,0.5,0.5],[0.5,0.5,0.5])
img_norm = trans_norm(img_tensor)
print(img_norm[0][0][0])#归一化结果输出
writer.add_image("Normalize",img_norm)#tensorboard结果输出
#Resize
print(img.size)
trans_resize = transforms.Resize((512,512))
#img PIL->resize->img_resize PLI先调整大小
img_resize = trans_resize(img)
#img_resize PIL->totensor->img_resize tensor变为tensor类型
img_resize = trans_totensor(img_resize)
print(img_resize)
writer.add_image("Resize",img_resize,0)
writer.close()
⑥RandomCrop类
class RandomCrop
''''''
#作用:随机裁剪
#参数size:
序列(h,w)or int值size(裁剪为正方形(size,size))
RandomCrop使用示例代码:
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
writer = SummaryWriter("log")
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
print(img_tensor[0][0][0])#原来第一行第一列像素值输出
trans_norm = transforms.Normalize([0.5,0.5,0.5],[0.5,0.5,0.5])
img_norm = trans_norm(img_tensor)
print(img_norm[0][0][0])#归一化结果输出
writer.add_image("Normalize",img_norm)#tensorboard结果输出
#Resize
print(img.size)
trans_resize = transforms.Resize((512,512))
#img PIL->resize->img_resize PLI先调整大小
img_resize = trans_resize(img)
#img_resize PIL->totensor->img_resize tensor变为tensor类型
img_resize = trans_totensor(img_resize)
print(img_resize)
writer.add_image("Resize",img_resize,0)
#Compose的参数是一个列表,数据要求为Transforms类型
#完成一件事是用一个方法把a变成b,另一个方法把b变成c,Compose拼接了Resize和totensor
trans_resize_2 = transforms.Resize(512)
trans_compose = transforms.Compose([trans_resize_2,trans_totensor])
img_resize_2 = trans_compose(img)
writer.add_image("Resize2",img_resize_2,1)
#RandomCrop
trans_random = transforms.RandomCrop(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()
二、Transform在python中的使用:
1、解决transforms如何使用:
①代码:
(ctrl+p可以查看参数;alt+回车可以查看错误原因)
from PIL import Image
from torchvision import transforms
#python中的用法-》 tensor的数据类型
#通过transforms.ToTensor去解决两个问题
#1、transforms如何使用
#2、为什么需要Tensor的数据类型
img_path="dataset/train/ants/0013035.jpg"
img=Image.open(img_path)
#也可以使用opencv读取图片
#import cv2
#cv_img=cv2.imread(img_path)
print(img)
#transform是一个泛类,先创建一个具体的工具
tensor_trans=transforms.ToTensor()
#使用工具
tensor_img = tensor_trans(img)
print(tensor_img)
②输出结果:类型由JPEG-->tensor
③过程图解:
2、为什么要用tensor数据类型:
①tensor数据类型具体内容:
包装了神经网络的一些参数,对其进行训练
②ToTensor的使用示例,在tensorboard中打开图片:
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
img_path="dataset/train/ants/0013035.jpg"
img=Image.open(img_path)
writer=SummaryWriter("log")
tensor_trans=transforms.ToTensor()
tensor_img = tensor_trans(img)
writer.add_image("Tensor_img",tensor_img)
writer.close()
③结果显示:
在终端用tensorboard --logdir=log打开: