【Pytorch】小土堆自学日记(三)

一、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打开:

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值