Transforms的使用

transforms主要是对图片进行变换

1. transforms结构及用法

transforms如何使用(python)

tensor_trans = transforms.ToTensor()    # 新建了ToTensor类的数据对象tensor_trans
# ctrl+p可以查看函数需要输入的参数类型
tensor_img = tensor_trans(img)  # 将PIL数据类型的img转化为tensor数据类型img

print(tensor_img)结果

在这里插入图片描述

transforms类似于一个工具箱,里面有很多tool,基本的使用如下

# 创建具体的工具
tool = transforms.ToTensor()
# 使用工具
result = tool(input)

为什么要使用tensor数据类型?因为其包含的很多参数在后续训练神经网络时需要用到

在这里插入图片描述

示例代码:

from torchvision import transforms
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
# python的用法 --》tensor的数据类型

img_path = "hymenoptera_data/train/ants_image/0013035.jpg"
img = Image.open(img_path)
# print(img)
writer = SummaryWriter("logs")

# 1.transforms如何使用(python)
tensor_trans = transforms.ToTensor()    # 新建了ToTensor类型的数据对象tensor_trans
tensor_img = tensor_trans(img)  # 将PIL数据类型的img转化为tensor数据类型img

# print(tensor_img)

# 传入的是tensor数据类型的tensor_img
writer.add_image("Tensor_img", tensor_img)

writer.close()

查看logs文件

在这里插入图片描述

2. 常见的transforms

输入输出作用
Image.open()PIL
ToTensor()PIL/ndarraytensorConvert a PIL Image or ndarray to tensor
cv.imread()ndarray
ToPILImage()tensor/ndarrayPILConvert a tensor or an ndarray to PIL Image
Normalize()tensor输出 = (输入- 均值) / 标准差归一化
Resize()Resize the input image to the given size
Compose()Compose([transforms参数1, transforms参数2,…])Compose()中的参数需要一个列表,列表中的数据需要是transforms类型,所以不难得到

示例代码:

from PIL import Image
from torchvision import transforms
from torch.utils.tensorboard import SummaryWriter

writer = SummaryWriter("logs")
img_path = "images/touxiang.jpg"
img = Image.open(img_path)
# print(img)

# ToTensor() 的使用
trans_totensor = transforms.ToTensor()      # 创建Totensor类型的数据对象trans_totensor
img_tensor = trans_totensor(img)    # Totensor类型的数据对象的内置函数会将PIL类型的数据转化为tensor数据类型
writer.add_image("ToTensor", img_tensor)

# Normalize()
print(img_tensor[0][0][0])  # tensor(0.9647)
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])    # 经过归一化的图像tensor(0.9294)
writer.add_image("Normalize", img_norm)

# Resize()
print(img.size)
trans_resize = transforms.Resize((10))
# img PIL ->resize -> img_resize PIL
img_resize = trans_resize(img)
print(img_resize)
# img_resize PIL -> totensor ->img_resize tensor
# 第11行已经定义过trans_totensor的数据类型为ToTensor
img_resize = trans_totensor(img_resize)
writer.add_image("Resize", img_resize, 0)

# Compose - resize -2 不改变比例,等比放大缩小
trans_resize_2 = transforms.Resize(512)
# img PIL -> Resize img PIL -> Compose()先缩放,再转换成tensor数据类型img_resize_2
# trans_resize_2的输出是trans_totensor的输入,最终输出tensor数据类型
trans_compose = transforms.Compose([trans_resize_2, trans_totensor])
img_resize_2 = trans_compose(img)
writer.add_image("Resize", img_resize_2, 1)

# RandomCrop()的使用
# transforms.RandomCrop(H, W)可指定高宽
trans_random = transforms.RandomCrop(52)
# Compose()先随机裁剪再转化为tensor数据类型
trans_compose_2 = transforms.Compose([trans_random, trans_totensor])
for i in range(10):
    # img PIL->random img PIL->totensor img tensor
    img_crop = trans_compose_2(img)
    writer.add_image("RandomCrop", img_crop, i)

writer.close()

2.1 ToTensor()的使用

# ToTensor() 的使用
trans_totensor = transforms.ToTensor()      # 创建Totensor类型的数据对象trans_totensor
img_tensor = trans_totensor(img)    # Totensor类型的数据对象的内置函数会将PIL类型的数据转化为tensor数据类型

结果

在这里插入图片描述

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)

示例代码

# Normalize
print(img_tensor[0][0][0])  # tensor(0.9647)
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])    # 经过归一化的图像tensor(0.9294)
writer.add_image("Normalize", img_norm)

经过归一化的结果

在这里插入图片描述

2.3 Resize()的使用

# Resize()
print(img.size)
trans_resize = transforms.Resize((10))
# img PIL ->resize -> img_resize PIL(尺寸改变后)
img_resize = trans_resize(img)

2.4 Compose()的使用

Compose()中的参数需要一个列表,列表中的数据需要是transforms类型,所以不难得到Compose([transforms参数1, transforms参数2,…])

Compose( transforms参数1, transforms参数2)实际上就相当于一个组合技,先进行参数一操作,再经过参数2操作,一定要保证参数1的输出和参数2的输入相匹配

# Compose - resize -2 不改变比例,等比放大缩小
trans_resize_2 = transforms.Resize(512)
# img PIL -> Resize img PIL -> Compose()先缩放,再转换成tensor数据类型img_resize_2
# trans_resize_2的输出是trans_totensor的输入,最终输出tensor数据类型
# 当前版本不仅支持PIL也支持tensor所以交换顺序也不会报错
trans_compose = transforms.Compose([trans_resize_2, trans_totensor])
img_resize_2 = trans_compose(img)
writer.add_image("Resize", img_resize_2, 1)

2.5 RandomCrop()的使用

trans_random = transforms.RandomCrop(52)
# Compose()先随机裁剪再转化为tensor数据类型
trans_compose_2 = transforms.Compose([trans_random, trans_totensor])
for i in range(10):
    # img PIL->random img PIL->totensor img tensor
    img_crop = trans_compose_2(img)
    writer.add_image("RandomCrop", img_crop, i)

结果
在这里插入图片描述

总结:

  • 关注输入输出类型(可以CTRL进官方文档查看)

  • 关注方法需要什么参数

    不知道方法返回值可以直接 print(type( ))/print()/debug

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值