transforms常用包
- 1. torchvision.transforms.ToTensor
- 2. torchvision.transforms.Resize
- 3. torchvision.transforms.Compose
- 4. torchvision.transforms.Normalize
- 5. torchvision.transforms.RandomCrop
1. torchvision.transforms.ToTensor
将PIL Image或ndarray转换为张量并相应缩放值。
官方文档:torchvision.transforms.ToTensor
CLASS torchvision.transforms.ToTensor
- 将PIL Image或ndarray转换为张量并相应缩放值
- 此转换不支持torchscript
- 如果PIL Image属于其中一种模式(L、LA、P、I、F、RGB、YCbCr、RGBA、CMYK、1)或numpy. ndarray的dtype = np.uint8,则将范围[0,255]的PIL Image或numpy.ndarray(H x W x C)转换为范围[0.0,1.0]的形状(C x H x W)的火炬.FloatTensor
- 在其他情况下,张量在不缩放的情况下返回。
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
writer = SummaryWriter("logs")
img = Image.open("image/刻晴.jpg")
# ToTensor
trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)
writer.add_image("ToTensor", img_tensor, 0)
writer.close()
2. torchvision.transforms.Resize
将输入图像的大小调整为给定大小。
如果图像是torch tensor,则预期其具有[…,H,W]形状,其中…表示任意数量的前导维度。
官方文档:torchvision.transforms.Resize
CLASS torchvision.transforms.Resize(size, interpolation=InterpolationMode.BILINEAR, max_size=None, antialias='warn')
主要参数:
- size(sequence or int):所需的输出大小。
- 如果size是一个类似(h,w)的序列,则输出size将与此匹配。
- 如果size是一个整数,图像的较小边缘将与此数字匹配。即,如果高度>宽度,则图像将被重新缩放为(尺寸 * 高度/宽度,尺寸)。
- interpolation(InterpolationMode):所需插值枚举。
- max_size(int,可选):调整大小后的图像的最大长边,如果在根据 size 调整大小之后图像的较长边缘大于 max_size ,则再次调整图像的大小,使得较长边缘等于 max_size 。
- antialias(bool,optional):是否应用抗锯齿。它只影响具有双线性或双三次模式的张量,否则将被忽略。在PIL图像上,抗锯齿始终应用于双线性或双三次模式;在其他模式下(对于PIL图像和张量),抗锯齿没有意义,并且忽略此参数。(当前默认值为 None )可能的值为:
- True :将为双线性或双三次模式应用抗锯齿。其他模式不受影响。这可能是你想要使用的。
- False :在任何模式下都不会对张量应用抗锯齿。PIL图像在双线性或双三次模式下仍然是抗锯齿的,因为PIL不支持抗锯齿。
- None :相当于张量的 False 和PIL图像的 True 。这个值的存在是由于遗留的原因,除非您真正知道自己在做什么,否则您可能不想使用它。
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
writer = SummaryWriter("logs")
img = Image.open("image/刻晴.jpg")
# Resize
trans_resize = transforms.Resize((512, 512))
# img PIL -> resize -> img_resize PIL
img_resize = trans_resize(img)
# img_resize PIL -> totensor -> img_resize tensor
img_resize = trans_totensor(img_resize)
writer.add_image("Resize", img_resize, 2)
print(img_resize)
writer.close()
3. torchvision.transforms.Compose
将多个变换组合在一起。
官方文档: torchvision.transforms.Compose
CLASS torchvision.transforms.Compose(transforms)
- transforms(list of Transform objects)-要组合的变换列表
代码实现
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
writer = SummaryWriter("logs")
img = Image.open("image/刻晴.jpg")
# 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("Compose", img_resize_2, 3)
writer.close()
4. torchvision.transforms.Normalize
使用均值和标准差归一化张量图像。此转换不支持PIL图像。
给定平均值: (mean[1],…,mean[n]) 和标准值: (std[1],…,std[n]) 对于 n 通道,该变换将归一化输入 torch.*Tensor 的每个通道,即, output[channel] = (input[channel] - mean[channel]) / std[channel]
官方文档:torchvision.transforms.Normalize
CLASS torchvision.transforms.Normalize(mean, std, inplace=False)
主要参数:
- mean(sequence):每个通道的均值序列。
- std(sequence):每个通道的标准偏差序列。
- inplace(booloptional):使用Bool使此操作就地执行。
代码实现
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
writer = SummaryWriter("logs")
img = Image.open("image/刻晴.jpg")
# Normalize
print(img_tensor[0][0][0])
trans_norm = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
img_norm = trans_norm(img_tensor)
print(img_norm[0][0][0])
writer.add_image("Normalize", img_norm, 1)
writer.close()
5. torchvision.transforms.RandomCrop
在随机位置裁剪给定的图像。
如果图像是torch tensor,则预计具有[…,H,W]形状,其中…表示任意数量的前导维度,但如果使用非恒定填充,则预计输入最多具有2个前导维度。
官方文档:torchvision.transforms.RandomCrop
CLASS torchvision.transforms.RandomCrop(size, padding=None, pad_if_needed=False, fill=0, padding_mode='constant')
主要参数:
- size (sequence or int):裁剪的所需输出大小。
- 如果size是一个int而不是像(h,w)这样的序列,则会进行方形裁剪(size,size)
- 如果提供长度为1的序列,则将其解释为(size[0],size[0])
- padding(int or sequence, optional) :可选填充图像的每个边框。默认值为“无”。
- 如果只提供一个int,则用于填充所有边框。
- 如果提供长度为2的序列,则这分别是左/右和顶/底上的填充。
- 如果提供长度为4的序列,则这分别是用于左、上、右和下边界的填充。
- pad_if_needed (boolean) :如果图像小于所需的大小,它将填充图像,以避免引发异常。由于裁剪是在填充之后完成的,因此填充似乎是在随机偏移处完成的。
- fill (number or tuple):常量填充的像素填充值。默认值为0。
- 如果是长度为3的元组,则分别用于填充R、G、B通道。
- 此值仅在padding_mode为常量时使用。
- torch张量仅支持数字。PIL图像仅支持int或tuple值。
- padding_mode (str) :填充类型。应为:恒定、边缘、反射或对称。默认值为常量。
- constant:填充一个常量值,这个值是用fill指定的
- edge:填充图像边缘的最后一个值。如果输入一个5D火炬张量,最后3个维度将被填充,而不是最后2个维度
- reflect:填充图像的反射,而不重复边缘上的最后一个值。例如,在反射模式下,在两侧使用2个元素填充[1,2,3,4]将导致[3,2,1,2,3,4,3,2]
- 对称:图像反射的焊盘重复边缘上的最后一个值。例如,在对称模式下,在两侧用2个元素填充[1,2,3,4]将导致[2,1,1,2,3,4,4,3]
代码实现
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
writer = SummaryWriter("logs")
img = Image.open("image/刻晴.jpg")
# RandomCrop
trans_random = transforms.RandomCrop(512)
trans_compose_2 = transforms.Compose([trans_random, trans_totensor])
for i in range(10):
img_crop = trans_compose_2(img)
writer.add_image("RandomCrop", img_crop, i)
writer.close()