PyTorch快速入门教程【小土堆】-Transforms的使用

1.transforms作用

transforms.py像一个工具箱,里面有很多工具,工具有totensor类、resize类等等

图片经过工具 会输出我们想要的一个图片变换的结果

2.常用的transforms

(1)Totensor

作用:将PIL类型或numpy类型的图片转换为tensor类型的图片

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

注:这里重点说一下__call__

可调用对象:凡是可以将()运用到自身并执行的都可以称为可调用对象,例如 对象名(),对于可调用对象名称()可以理解为是名称.__call__()的缩写

__call__函数功能类似于在类中重载()运算符,使实例对象可以像普通函数那样,以对象名()的形式调用,将类的实例对象变为可调用对象

所以trans_totensor=transforms.ToTensor()相当于实例化,img_tensor=trans_totensor(img)调用了__call__

(2)normalize

作用:用均值和标准差归一化一个tensor类型的图片

计算方式: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)

 (3)Resize

作用:将输入图像的大小调整到给定大小输出

视频讲的该类使用时输入图片类型仅能是PIL类型,目前输入类型PIL,tensor都可以

但add_image参数类型仅能是tensor或numpy类型不能是PIL类型

trans_resize=transforms.Resize((512,512))#类实例化
img_resize=trans_resize(img)#调整大小

(4)Compose

作用:组合几个transforms变换,按照参数操作

参数:需要是一个列表,python中,列表的表示形式为[数据1,数据2,...],在compose中数据需要的是transforms类型,所以得到Compose([transforms参数1,transforms参2...])

#传入PIL类型,经过Transforms类型参数1:trans_resize_2,实现缩放,经过Transforms类型参数2:trans_totensor实现将PIL类型转为tensor类型
trans_compose=transforms.Compose([trans_resize_2,trans_totensor])#输入为PIL类型
img_resize_2=trans_compose(img)

5.RandomCrop

作用:裁剪给定图像

参数:size 希望裁剪输出的大小 如果是int类型 进行正方形裁剪,如果是像 (h, w)这样的序列,按照 (h, w)裁剪

trans_random=transforms.RandomCrop(512)#进行正方形裁剪,按照512*512
trans_random2=transforms.RandomCrop((500,1000))#进行长方形裁剪 500*1000
img_crop=trans_random(img_tensor)
img_crop2=trans_random2(img_tensor)

代码如下:

from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
writer=SummaryWriter('logs')#类实例化,传入存储事件文件的文件夹名称
img=Image.open("images/9.jpg")
print(img)
#1.Totensor
# 作用:将PIL或numpy类型的图片转换为tensor类型的图片
trans_totensor=transforms.ToTensor()#类实例化
#调用totensor的__call__函数
#作用:将PIL类型或numpy.ndarray类型的图片转换为tensor类型
img_tensor=trans_totensor(img)
writer.add_image("ToTensor",img_tensor)


#2.normalize
# 作用:用均值和标准差归一化一个tensor类型的图片
#计算方式:output[channel] = (input[channel] - mean[channel]) / std[channel]
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)

#3.Resize
# 作用:将输入图像的大小调整到给定大小输出
print(img.size)
trans_resize=transforms.Resize((512,512))#类实例化
#(1)输入图片类型是PIL
img_resize=trans_resize(img)#调整大小
#输出也是PIL类型,将PIL转化为tensor类型,
img_resize=trans_totensor(img_resize)
writer.add_image("Resize_inputPIL",img_resize)
print(img_resize)

#(2)输入图片类型也可以是tensor类型
img_resize_tensor=trans_resize(img_tensor)
writer.add_image("Resize_inputTensor",img_resize_tensor)

#4.Compose--resize--2
# 作用:组合几个transforms变换,按照参数操作
# 参数:需要是一个列表,python中,列表的表示形式为[数据1,数据2,...],在compose中数据需要的是transforms类型,所以得到
#Compose([transforms参数1,transforms参2...])
trans_resize_2=transforms.Resize(512)
#传入PIL类型,经过Transforms类型参数1:trans_resize_2,实现缩放,经过Transforms类型参数2:trans_totensor实现将PIL类型转为tensor类型
trans_compose=transforms.Compose([trans_resize_2,trans_totensor])#输入为PIL类型
img_resize_2=trans_compose(img)
writer.add_image("Resize",img_resize_2,1)



img_resize_1=trans_resize_2(img_tensor)#输入为tensor类型直接调用resize即可
writer.add_image("Resize",img_resize_1,2)


#5.RandomCrop
#作用:裁剪给定图像
#参数:size 希望裁剪输出的大小 如果是int类型 进行正方形裁剪,如果是像 (h, w)这样的序列,按照 (h, w)裁剪
trans_random=transforms.RandomCrop(512)#进行正方形裁剪,按照512*512
trans_random2=transforms.RandomCrop((500,1000))#进行长方形裁剪 500*1000
for i in range(10):
    img_crop=trans_random(img_tensor)
    img_crop2=trans_random2(img_tensor)

    writer.add_image("Random",img_crop,i)
    writer.add_image("Random2", img_crop2, i)

writer.close()

注意:

(1)关注输入、输出类型

(2)多看官方文档,按住ctrl直接点击函数和类即可看到函数或类的信息

(3)关注方法需要什么参数,ctrl+p软件会提示需要输入范润参数

(4)不知道返回值类型的时候时候 print 、print(type)、debug

(5)看transforms的structure,可以transforms包含哪些类和函数,点击structure中的类和函数,即可看到它们的官方声明

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值