Transfrom是什么?
可以看作是一个图像处理的工具箱,通过查看Transform类可以找到不同的图像处理方法
更准确的说,Transform中有各种类的的定义,我们可以通过继承或者构造这些类,然后调用里面的方法来实现相应的功能
可以通过结构来便捷的查看transform中的类和方法,然后实现对应的对象即可。其中__call__函数的作用就是在调用这个对象的时候自动调用的函数比如这是Totensor类的定义,可以看到就是将其他格式的图像转化为tensor格式的图像
具体的代码如下,输出的就是tensor类型的图像
from torchvision import transforms
from PIL import Image
image_path="dataset/hymenoptera_data/train/ants_image/7759525_1363d24e88.jpg"
image=Image.open(image_path)
transform_class = transforms.ToTensor() # 构造transform中的ToTensor类
image_tensor =transform_class(image) # 调用类将图像转化为tensor格式(__call__函数)
print(type(image_tensor))
Tensor格式有什么用
相较于PIL的image格式和numpy的array格式,tensor图像格式的作用在于它包含了用于神经网络的一些属性,比如反向传递、使用的是CPU还是GPU进行训练等等,所以tensor图像格式更适合用来进行神经网络的训练
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
from PIL import Image
image_path="dataset/hymenoptera_data/train/ants_image/7759525_1363d24e88.jpg"
image=Image.open(image_path)
transform_class = transforms.ToTensor() # 构造transform中的ToTensor类
image_tensor =transform_class(image) # 调用类将图像转化为tensor格式(__call__函数)
writer = SummaryWriter("logs")
writer.add_image("tensor_image",image_tensor,1) # 用tensor格式显示图像
writer.close()
此外,我们可以看到,使用PIL处理的图像格式是Jpeg格式,opencv处理的图像是numpy的array格式,transform处理的图像是tensor格式,三者是不相同的
各种格式以及对应的调用方法如下: