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文件
输入 | 输出 | 作用 | |
---|---|---|---|
Image.open() | PIL | ||
ToTensor() | PIL/ndarray | tensor | Convert a PIL Image or ndarray to tensor |
cv.imread() | ndarray | ||
ToPILImage() | tensor/ndarray | PIL | Convert 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()
# ToTensor() 的使用
trans_totensor = transforms.ToTensor() # 创建Totensor类型的数据对象trans_totensor
img_tensor = trans_totensor(img) # Totensor类型的数据对象的内置函数会将PIL类型的数据转化为tensor数据类型
结果
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)
经过归一化的结果
# Resize()
print(img.size)
trans_resize = transforms.Resize((10))
# img PIL ->resize -> img_resize PIL(尺寸改变后)
img_resize = trans_resize(img)
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)
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