文章目录
一、transforms是什么?
transforms 对应 transform.py 文件。可以理解成一个工具箱,里面定义的各种类和方法,可以处理图片,对图片进行加工,得到我们想要的结果。
常用的输入图片对象的数据类型
PIL : Image.open()
tensor : ToTensor()
ndarrays: cv.imread()
常用的Transform有:
1.ToTensor() :将图片对象类型转为 tensor
2.Normalize() :对图像像素进行归一化计算
3.Resize():重新设置 PIL Image的大小,返回也是PIL Image格式
4.Compose(): 输入为 transforms类型参数的列表,
关于transforms的导入如下
from torchvisoin import transforms
二、Tensor
1.为何引入tensor类型的变量呢
深度学习引入tensor类型的变量是因为深度学习模型中涉及大量的矩阵运算和张量运算。Tensor(张量)是多维数组的抽象表示,可以表示各种数据类型,如标量(0维张量)、向量(1维张量)、矩阵(2维张量)以及更高维度的数组。在深度学习中,神经网络的参数和输入数据都可以表示为张量,通过张量操作可以高效地进行大规模数据的运算和处理。
Tensor数据类型还包装了神经网络需要的一些参数,如下图。
Tensor类型的变量具有以下优点:
- 支持并行计算:张量运算可以在GPU等并行计算设备上高效执行,加速深度学习模型的训练和推理过程。
- 灵活性:张量可以表示不同维度的数据,适用于各种深度学习任务,如图像处理、自然语言处理等。
- 数学表达能力:张量操作支持各种数学运算,如矩阵乘法、逐元素操作等,方便构建复杂的神经网络模型。
因此,引入tensor类型的变量可以更好地满足深度学习模型对数据表示和运算的需求,提高模型的效率和灵活性。
2.代码示例
代码如下(示例):
from torchvision import transforms
from PIL import Image
img_path = "S:/pythonProject/1.png"
img = Image.open(img_path)
tensor_trans = transforms.ToTensor() #创建工具
tensor_img = tensor_trans(img) #实验工具转化成tensor
print(tensor_img)
tensor类数据也可以配合tensorboard输出图片。
writer.add_image(tensor)
二、Normalize类
normalize 可以直接理解成规范化,标准化亦或是归一化,这里的Normalize工具就是为了实现标准化的。
先看一下源码的注释:
该类实例化时需要两个参数,第一个参数mean 代表每个通道上所有数值的平均值,第二个参数std 代表每个通道上所有数值的标准差。而图片的channels查看,可以通过print(img)进行查看mode是几个通道。
在这里插from torchvision import transforms
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter("logs")
img_path = "S:/pythonProject/1.png"
img = Image.open(img_path)
print(img)
tensor_trans = transforms.ToTensor() #创建工具
tensor_img = tensor_trans(img) #实验工具转化成tensor
writer.add_image("ToTensor",tensor_img)
print(tensor_img[0][0][0])
#进行归一化Normalize
trans_norm = transforms.Normalize([0.5,0.5,0.5],[0.5,0.5,0.5]) #实例化normalize工具类
img_norm = trans_norm(tensor_img) #归一化
writer.add_image("Normalize",img_norm)
writer.close()入代码片
归一化后的效果
三、Resize
改变图片的尺寸。
注意:
当如果输入的参数是一个序列,即长和宽两个整数(h,w),则图像会按该长和宽进行resize。
如果输入的参数是一个整数x,将图片短边缩放至x,长宽比保持不变。
这里无论是Image.open()读取的图像信息,亦或者tensor数据都是可以的。
print(img.size) #输出现在图像的尺寸规格
trans_resize = transforms.Resize((512,512))
img_resize = trans_resize(img)
img_resize = tensor_trans(img_resize)
writer.add_image("Resize",img_resize,0)
print(img_resize)
writer.close()
这里可以明显看出图片的大小已经改变了呢。
三、Compose
compose如单词的意思,组成,其功能就是将resize和tensor这种工具一块组成为一个结合体,实现多步变换。链式编程一步完成。
下面用代码举例说明
tensor_trans = transforms.ToTensor() #创建工具
trans_resize = transforms.Resize(512)
trans_compose = transforms.Compose([trans_resize,tensor_trans]) #需要注意这里输入的是一个列表[]
res = trans_compose(img)
writer.add_image("resize",res,1) #输出图片
writer.close()
注意compose列表的顺序,前一个列表元素的输出,是下一个列表元素的输入。顺序的不同可能会导致不同的结果或者报错。但是这里并无这种情况,因为Resize可以处理PIL数据和tensor数据。
三、Random_Crop
随机裁剪:对图像进行随机大小裁剪,如果指定数字后就是按照数字大小进行裁剪。
tensor_trans = transforms.ToTensor() #创建工具
trans_cup = transforms.RandomCrop(512) #裁剪大小为512*512,也可直接给出h和w
trans_compose2 = transforms.Compose([trans_cup,tensor_trans])
for i in range(10):
co2 = trans_compose2(img)
writer.add_image("randomcup",co2,i)
效果如图所示。