Resize()
注意一点:
Resize(512)是将图像等比例缩放,使得图像的最短边为512像素,保持了原始的宽高比例。
而Resize((512, 512))则是将图像强制缩放为512x512的正方形,无论图像的原始宽高比是什么。
因此,如果你需要不改变比例的缩放,使用Resize(512),如果需要固定大小为正方形的图像,则使用Resize((512, 512))。
compose()
Compose()函数的功能是将多个变换(transforms)组合在一起,使得输入的图像可以经过一系列指定的变换操作。它在实际开发过程中可以简化图像处理的流程,尤其是在数据预处理阶段,将多步操作串联起来。具体的作用是将这些变换按顺序执行。
例如,以下代码会先对图像进行随机裁剪,然后将其转换为张量格式:
transforms.Compose([
transforms.RandomCrop(32),
transforms.ToTensor()
])
这个列表中的元素就是按顺序执行的变换,每个变换操作都是transforms类型,列表的作用就是存储这些操作,使得Compose()可以顺序执行这些变换。
transforms.Compose([trans_resize_2, trans_totensor])
在小土堆的这段代码中:
# Compose - Resize - 2 trans_resize_2 = transforms.Resize(512) # PIL -> PIL -> Tensor trans_compose = transforms.Compose([trans_resize_2, trans_totensor]) img_resize_2 = trans_compose(img) writer.add_image("Resize", img_resize_2, 1)
我们注意 transforms.Compose([trans_resize_2, trans_totensor])。
trans_resize_2 和 trans_totensor 分别代表两个实例,前一个是调整大小的操作,后一个是将图像转换为张量的操作。
Compose()的参数是一个列表,列表中的每一个元素是transforms类型的变换操作,比如Resize()、ToTensor()等。这些操作会被顺序执行。
我们可以这样简单理解:Compose类的功能就在于,将列表中的操作组合起来,按顺序挨个执行一遍。
注释中提到的PIL -> PIL -> Tensor的意思是图像首先是PIL格式,经过第一个变换后仍然是PIL格式,经过第二个变换后转换为了Tensor格式。
在说明文档部分,Args是参数的意思。文档解释了Compose类的参数是一个包含transforms对象的列表,用于组合这些变换。
TensorBoard中第0步和第1步两张图像
在第0步,图像被调整为了正方形(512x512);在第1步,图像被按照原比例缩放,并没有强制变成正方形。
我一开始疑惑了很久,为什么Compose这部分代码输出了两步图像,并且在第0步被调整成正方形,而在第1步中却是等比例缩放。
后来才意识到,标签Resize下的这两步生成图像其实分别来自于 # Resize 和 # Compose - Resize - 2 这两部分代码……writer.add_image里面写第0步的就是写入第0步图像;写第1步的就是写入第1步图像……这个在 # RandomCrop 部分表现得很清楚……
说会当时困扰了我十分钟的这部分内容,其实非常非常简单:
第0步
在 # Resize 部分代码中,trans_resize将图像的短边调整到了512像素,保持了正方形的形状。它来自这一行代码:
trans_resize = transforms.Resize((512,512))
img_resize = trans_resize(img)
它将图像强制调整为512x512的正方形。这意味着,无论原始图像的宽高比例是什么,这个变换都会将图像的大小调整为正方形。这就是为什么在第0步中,图像显示为正方形的原因。
随后它被转换文Tortensor格式:
img_resize = trans_totensor(img_resize)
最终通过writer写作第0步结果
第1步
在 # Compose - Resize - 2 部分代码中,trans_resize_2 将图像的短边调整到512像素,保持宽高比不变。它来自于这段代码:
trans_resize_2 = transforms.Resize(512)
因此,在第1步,图像是等比例缩放的,而不是强制缩放为正方形。
再借助Compose,先等比例缩放,后转换为totensor格式:
trans_compose = transforms.Compose([trans_resize_2, trans_totensor])
img_resize_2 = trans_compose(img)
至此,缩放过的图像已经被转换为Tortensor格式,可以直接通过writer写作第1步结果
RandomCrop()
在实际开发过程中有什么作用呢?请举例说明。
RandomCrop()的功能是在图像中随机裁剪一个区域。它在实际开发中的作用通常是用于数据增强,比如在训练神经网络时,随机裁剪可以生成不同的图像区域,增强模型的泛化能力。
举个例子,在图像分类任务中,使用RandomCrop()可以生成不同的子图像,避免模型过度拟合训练数据的固定部分,使模型能够更好地应对不同场景下的图像输入。
标签:Compose,transforms,笔记,Transforms,图像,土堆,trans,resize,Resize From: https://blog.csdn.net/qq_40525602/article/details/143088622