一、概念
transforms就像是一个工具箱,里面装有很多类 (比如:totensor、resize等,可以在结构里查看到一个列表),类就是工具。
但是类不能直接使用,要创建其实例对象之后才能调用(tool=transforms.ToTensor())
而 实例对象名(参数) 这种形式可以自动调用call方法,进行工具的使用。
补充: call方法可以使对象具有当作函数的功能,当你调用对象实例并且参数满足条件时,就会自动调用call方法(说白了就是先实例化,满足条件后自动调用call方法)注意到:init方法是 类名(参数),而call方法是 实例对象名(参数),都是能自动调用的
二、为什么需要Transforms?
tensor类型包装了一些训练神经网络所必须用到的参数(比如grad梯度)
三、如何使用Transforms?(以其中的ToTensor类为例)
ToTensor:把PIL.Image或numpy.array类型转成Tensor类型
实例化 + 实例名(参数:要转换的对象),即可调用
from PIL import Image
from torchvision import transforms
img_path=r"C:\Users\zzr\Desktop\Learning\dataset\hymenoptera_data\train\bees\16838648_415acd9e3f.jpg"
img=Image.open(img_path) #PIL.Image类型
tensor_trans=transforms.ToTensor() #生成ToTensor类的实例
img_tensor=tensor_trans(img) #把PIL.Image类型转换成torch.Tensor类型
print(img_tensor)
***区分:
使用Image.open('path’)生成的是 PIL.Image类型;
from PIL import Image
img_path="dataset/hymenoptera_data/train/bees/359928878_b3b418c728.jpg"
img_PIL=Image.open(img_path) #生成图像的PIL对象
使用cv2.imread('path')生成的是numpy.array类型
import cv2
img_path = r"C:\Users\zzr\Desktop\Learning\dataset\hymenoptera_data\train\bees\16838648_415acd9e3f.jpg"
img_array=cv2.imread(img_path) #numpy.array类型
(add_image要使用numpy.array或torch.Tensor类型)
numpy.array(一个方法):PIL.Image——>numpy.array
img_array=np.array(img_PIL) #将PIL.Image类型转为numpy.array类型
ToTensor(一个类,仍需实例化):PIL.Image或numpy.array——>Tensor
tensor_trans=transforms.ToTensor() #生成ToTensor类的实例
img_tensor=tensor_trans(img_PIL) #把PIL.Image类型转换成torch.Tensor类型