目录
一、transform的用法
1. tranforms的结构
2. transforms的使用步骤
二、 transforms.ToTensor()的使用
1. 内置__call__方法简介
2. ToTensor()使用
2.1 将PIL类型图像转换为tensor型
2.2 将numpy类型图像转换为tensor型
2.3 使用tensorboard显示tensor型图片
三、使用Tensor数据类型的原因
transforms在计算机视觉工具包torchvision下,torchvision.transforms是常用的图像预处理方法,对图像进行变换。
transforms为工具箱,其中的class为不同的工具,可以使用帮助手册进行具体每个类以及其使用的查看。
点击pycharm左下角的structure可以看到transforms中个各类的具体结构。
transforms中有许多不同的类,分别对应不同的作用,比如最常用的ToTensor类,可以把PIL图片类型或者numpy类型转换为tensor型。
需要创建transforms工具箱中具体的工具进行使用。
- 首先冲transforms中选择想要使用的类,如选择ToTensor类,transforms.ToTensor()
- 为这个类的使用来创建具体的工具 ( 实例化对象 ),tool = transforms.ToTensor()
- 将想要输入的图形使用刚刚创建的tool进行变换操作,result_image=tool(input_image)
- 得到结果
Python __call__()方法(详解版) (biancheng.net)
call()方法是Python中一个很特殊的方法。凡是可调用对象,都可以通过调用__call__()方法来调用该对象。如果类中定义了__call__()方法,那么该类的实例对象也将成为可调用对象。该对象被调用时,将执行__call__()方法中的代码。
该方法的功能类似于在类中重载 () 运算符,使得类实例对象可以像调用普通函数那样,以“对象名()”的形式使用。
因此当我们实例化ToTensor对象为tool时,tool = transforms.ToTensor(),则可以使用tool( )的形式来使用call函数。
如下所示为ToTensor中call函数所需的参数,为pic,即为PIL或numpy类型图像。所以可以在tool中传入pic参数来调用该方法,即 tool(pic)
def __call__(self, pic):
"""
Args:
pic (PIL Image or numpy.ndarray): Image to be converted to tensor.
Returns:
Tensor: Converted image.
"""
return F.to_tensor(pic)
from PIL import Image
from torchvision import transforms
#创建PIL图像
img_path = "datasets2/train/ants_image/0013035.jpg"
img_PIL = Image.open(img_path)
#创建ToTensor对象,实例化工具
totensor_tool = transforms.ToTensor()
#接收tensor类型图像
img_tensor = totensor_tool(img_PIL)
print(img_tensor)
1. 使用pip命令安装OpenCV(OpenCV创建的图形都是numpy类型)
2. 创建numpy类型图像
import cv2
img_cv = cv2.imread(img_path)
可以看到创建出来的img_cv类型是numpy型。
创建两个图片对象,一个为PIL型,一个为numpy型,都使用ToTensor转换为tensor型,然后使用tensorboard可视化图片。
#tensor数据类型的使用
#通过transform.ToTensor解决两个问题
#1. transform如何使用 2. tensor
import cv2
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
img_path1 = "datasets2/train/ants_image/0013035.jpg"
#创建PIL图像
img_PIL = Image.open(img_path1)
#创建ToTensor对象,实例化工具
totensor_tool = transforms.ToTensor()
#接收tensor类型图像1
img_tensor1 = totensor_tool(img_PIL)
img_path2 = "datasets2/train/bees_image/16838648_415acd9e3f.jpg"
#创建numpy类型对象
img_cv = cv2.imread(img_path2)
#接收tensor类型图像2
img_tensor2 = totensor_tool(img_cv)
#使用tensorboard显示图片
writer = SummaryWriter("logs")
writer.add_image("Tensor_img1",img_tensor1)
writer.add_image("Tensor_img2",img_tensor2)
writer.close()
可以看到两张图片都进行了显示。
张量(Tensor)是神经网络中使用的主要数据结构,在网络的输入、转换和输出都涉及到张量。在深度学习和神经网络中,张量是n维数组,我们用张量这个词来表示所有的n值,比如标量是零维张量、矢量是一维张量、矩阵是二维张量、n维数组是n维张量。
在pytorch中使用tensor是因为tensor型可以给我们提供深度学习和神经网络训练过程中需要的重要参数,非常方便。