Pytorch基本操作(4)——torchvision中的transforms的使用

1 简介

在学习李沐在B站发布的《动手学深度学习》PyTorch版本教学视频中发现在操作使用PyTorch方面有许多地方看不懂,往往只是“动手”了,没有动脑。所以打算趁着寒假的时间好好恶补、整理一下PyTorch的操作,以便跟上课程。

学习资源:

2 Transforms

主要用于变换图形
在这里插入图片描述

import cv2
import torch
from torchvision import transforms
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
img_path = r"F:\Data and code\data\蚂蚁蜜蜂数据\hymenoptera_data\hymenoptera_data\train\ants\0013035.jpg"
img = Image.open(img_path) # 读出来PIL Image格式图片
cv_img = cv2.imread(img_path) # opencv读出来numpy.array格式图片

writer = SummaryWriter("logs")

在这里插入图片描述

2.1 transforms.ToTensor

用于将各种图片格式转化为Tensor格式,便于神经网络中的训练

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

'''在tensorboard中插入一个图片试试'''
writer.add_image("ToTensor", img_tensor)

# writer.close()
  1. 在工作路径下的命令行中,进入pytorch环境输入:
    tensorboard --logdir logs --port=6007

  2. 打开对应地址http://localhost:6007/
    在这里插入图片描述

2.2 Normalize归一化,标准化

按通道数输入对应维数的均值以及标准差

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)# 也可以在后面输入step参数看变换趋势
writer.close()

得到新的图片:
在这里插入图片描述

注:添加新图片后,直接在tensorboard面板里面点刷新就行,不必重新搞命令行

2.3 Resize

注:由PIL->PIL

print(img.size)
trans_resize = transforms.Resize((512,512)) # 非等比缩放,改变长宽比例;若只有1个参数则为等比缩放,限制最长边。
img_resize = trans_resize(img) # 注意这里的img是PIL格式,Resize之后也是PIL格式,还需要进行ToTensor变换
img_resize = trans_totensor(img_resize) # 此时的img_resize就变为了Tensor格式

writer.add_image("Resize", img_resize, 0)
(768, 512)

在这里插入图片描述

2.4 Compose

将多个transforms方法组合起来。

Compose()中的参数需要的是一个列表,列表中的数据为transforms类型,得到:Compose([transforms参数1, transforms参数2,...])

  • 注:需要注意transforms参数1的输出是否与transforms参数2的输入匹配
# compose - resize - 2
trans_resize_2 = transforms.Resize(512) # 等比缩放,限制最长边
trans_compose = transforms.Compose([trans_resize_2, trans_totensor]) # 注意两个transform方法输入输出参数的匹配

img_resize_2 = trans_compose(img)
writer.add_image("Resize", img_resize_2, 1)

在这里插入图片描述

可以看到对比原先的Resize直接将图片缩成正方形,compose方法成功保持了原有比例并且限制了最长边。

2.5 RandomCrop()随机裁剪

随机剪10张看看效果

trans_random = transforms.RandomCrop(512)
# trans_random = transforms.RandomCrop((500, 1000))
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)

在这里插入图片描述

成功随机剪了10张,太多就不全放了

3 Python中__call__的用法

class Person:
    def __call__(self, name):
        print("__call__" + "Hello " + name)
    
    def hello(self, name):
        print("hello" + name)
        
person = Person()
person("zhangsan")
person.hello("lisi")
__call__Hello zhangsan
hellolisi
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值