一、简介:
在PyTorch的torchvision库中,transforms是一个用于图像预处理和数据增强的模块。它包含了一系列用于图像或数据的格式变换、裁剪、缩放、旋转等操作的方法,对于深度学习项目来说非常有用。
具体来说,transforms模块中包含了如ToTensor、Normalize、Resize、Compose、RandomCrop等类和方法,用于对图像数据进行各种预处理操作。这些操作对于提升模型性能、优化训练过程具有重要意义。
因此,transforms可以被视为PyTorch深度学习框架中的一个重要模块或工具包,用于处理图像数据预处理和增强任务。
二、用法:把特定格式的图片用Transforms类包含的方法改变,最常用的是将PIL照片类型和numpy照片类型转化为tensor照片类型。
转换为tensor类型的原因是:tensor类型数据可以理解为包装了一些反向神经网络的理论基础所需要的参数,因此在反向神经网络中需要把PIL数据类型和numpy数据类型转化为tensor类型,然后对其进行一个训练,所以需要用到tensor数据类型
三、Transforms中最常用的类ToTensor类:
作用:将照片的数据类型转化为tensor类型
代码实战:
from torchvision import transforms
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
img_path = "D:\Python项目\pytorch练习\dateset\\train\\ants\\0013035.jpg"
img = Image.open(img_path)
# ToTensor的作用是将一个PIL图片类型或numpy图片类型转化为tensor图片类型
# 设置类的实例对象
tensor_trans = transforms.ToTensor()
# 将PIL类型的图片转化为tensor类型的图片
tensor_img = tensor_trans(img) # 相当于直接调用内置函数__call__(self,pic)
writer = SummaryWriter("logs")
writer.add_image("Tensor_img",tensor_img)
writer.close()
四、常见的transforms
1、ToTensor类:(在设置实例对象的时候将均值和方差传入)
1)、简介:它用于将PIL图像或NumPy ndarray转换为PyTorch的张量(tensor)
2、Normalize类:
1)、简介:用于对tensor类型图像张量进行标准化(Normalization)。标准化是图像预处理中常用的一个步骤,尤其是在训练深度学习模型时,它可以帮助模型更好地收敛。
举例:
from PIL import Image
from torchvision.transforms import Normalize
from torchvision.transforms import ToTensor
from torch.utils.tensorboard import SummaryWriter
img_PIL = Image.open('dateset/train/ants/0013035.jpg')
tensor_trans = ToTensor()
img_tensor = tensor_trans(img_PIL) # 先将数据类型转化为tensor型数据
writer = SummaryWriter("glo")
writer.add_image("ants",img_tensor) # 先将未进行标准化的图片打开,以作对比
trans_norm = Normalize([0.5,0.5,0.5],[0.5,0.5,0.5]) # 传入标准化图片的参数
# 第一个参数mean:图片的均值
# 第二个参数std:图片的标准差
img_nor = trans_norm(img_tensor) # 将tensor图片进行标准化
writer.add_image("Normalize",img_nor) # 输出图片,会发现有明显的对比
writer.close()
此时在终端打开图片,会发现图片变化:
3、Resize()类:
1、简介:它用于调整输入图像的大小。这个类在图像预处理中非常有用,尤其是在你需要将不同尺寸的图像调整为统一大小以输入到神经网络模型中进行训练或测试时。
2、传参:(在设置实例对象的时候就需要传入)当传入一个有两个参数的列表时,列表中第一个元素是缩放后照片的长,第二个参数是缩放后照片的宽。如果只传入一个参数,则这个参数会自动匹配图片最小的边进行改变,但不会改变照片的长宽比,相当于将照片进行等比例缩放
注意:与上边两个类不同的是,当操作照片时,需要传入的是PIL类型的照片,其返回值也是PIL类型的照片,因此需要配合Totensor使用
代码实战:
import transform
from torchvision import transforms
from torch.utils.tensorboard import SummaryWriter
from PIL import Image
img_PIL = Image.open("dateset/train/ants/0013035.jpg") # 打开PIL型图片
resize_trans = transforms.Resize([800,521]) # 将图片尺寸设计好,后序进行图片尺寸变化
img_resize = resize_trans(img_PIL) # 将图片尺寸改变,此时仍然是PIL类型的图片
tensor_trans = transform.ToTensor() # 设置类型转化实例对象
img_tensor1 = tensor_trans(img_PIL) # 原图的tensor类型
img_tensor2 = tensor_trans(img_resize) # 缩放后的图片的tensot类型
writer = SummaryWriter("test")
writer.add_image("test1",img_tensor1) # 打开原图,与缩放后的图片形成对比
writer.add_image("test2",img_tensor2) # 打开缩放后的图片
writer.close()
4、compose类:
1、简介:它的主要作用是将多个图像转换操作组合在一起,形成一个单一的转换流程。这样,你就可以通过一个简单的接口,一次性完成多个复杂的图像转换操作。
compose类接受一个转换操作的列表作为输入,然后按照列表中的顺序,依次对图像进行转换。每个转换操作都是transforms
模块中的一个函数或类实例。
2、传参:接收一个序列,序列中包含各种对图片的操作方法(各种方法都是transforms类型,传入的是设置好参数的实例对象,且在设置实力对象的时候进行传参)
上述为传参的实例图(使用实例对象时传入的参数以传入的方法需要的参数为准)
3、代码实战:(以Resize的第二种传参方式为例子)
from PIL import Image
from torchvision import transforms
from torch.utils.tensorboard import SummaryWriter
img_PIl = Image.open("dateset/train/ants/0013035.jpg")
resize_trans = transforms.Resize(300) # 设置好参数
tensor_trans = transforms.ToTensor() # 设置好参数
trans = transforms.Compose([resize_trans,tensor_trans]) # 设置compose的一些列操作
img_tensor = tensor_trans(img_PIl) # 将原照片的tensor类型转化出来、
img = trans(img_PIl) # 将缩放后的照片的tensor类型转化出来
writer = SummaryWriter("test")
writer.add_image("test1",img_tensor,1) #原照片,用来做对比
writer.add_image("test2",img,1) # 缩放后的照片
writer.close()
应用后的效果:
注意:在操作完打开此界面时,记得点击照片右上角的一个标准(如图),否则很难出更改后与更改前照片的对比情况
五、总结使用方法:
1、使用某个类时,先查看方法的官方文档,关注其输入和输出
2、多看官方文档,比网上对方法的解释和介绍要准确
3、关注方法需要什么参数
4、不知道返回值的数据类型时,直接print或type()返回的结果