首页人工智能Pytorch【深度学习(PyTorch...

【深度学习(PyTorch篇)】28.Dataset变换

本系列文章配套代码获取有以下两种途径:

  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/1XuxKa9_G00NznvSK0cr5qw?pwd=mnsj 提取码:mnsj
  • 前往GitHub获取
https://github.com/returu/PyTorch





上一篇文章中介绍了通过继承 Dataset 类实现自定义数据集,返回的数据会存在图像大小是不统一的,图像的值为0~255等问题,并不适合实际使用。

针对上述问题,PyTorch提供了torchvision.transforms模块,该模块定义了一组可组合的、类似函数的对象,它可以作为参数传递到torchvision模块的数据集,在数据加载之后,在__getitem__()返回之前对数据进行图像预处理和数据增强操作。例如:

  • ToTensor(): 将 PIL Imagendarray 转换为 FloatTensor,并归一化到 [0.0, 1.0]。
  • Normalize(mean, std): 对图像进行标准化,通常与 ToTensor 结合使用。mean 和 std 分别是每个通道的平均值和标准差。
  • Resize(size): 将图像的尺寸调整为给定的大小。
  • CenterCrop(size): 从图像中心裁剪出给定大小的区域。
  • RandomCrop(size): 在图像中随机裁剪出给定大小的区域。
  • RandomHorizontalFlip(p=0.5): 以给定的概率 p 水平翻转图像。
  • RandomVerticalFlip(p=0.5): 以给定的概率 p 垂直翻转图像。
  • ColorJitter(brightness=0, contrast=0, saturation=0, hue=0): 随机更改图像的亮度、对比度、饱和度和色调。
可用对象的列表可以通过以下语句查看:
dir(transforms)

这些转换操作可以单独使用,也可以组合在一起形成一个转换流水线。
01

单独使用:


torchvision.transforms中,当你单独使用一个转换操作时,操作在定义后将以对象的形式存在,在真正使用时会自动调用该对象的__call__()方法。
例如,要将PIL对象转换为Tensor对象时,首先需要创建一个转换操作实例,然后通过圆括号()调用该对象,完成转换操作。
# 加载图像  
image = dataset[6][0]

# 创建一个转换操作实例  
transform_totensor = transforms.ToTensor()  

# 应用转换操作到图像上  
image_tensor = transform_totensor(image)  # 这里隐式调用了transform_totensor.__call__(image)

type(image_tensor)
# 输出结果:torch.Tensor

02

通过lambda封装自定义的转换操作:


torchvision.transforms中,还可以使用Lambda转换来封装自定义的转换操作。Lambda转换允许定义一个简单的lambda函数,该函数将在每个输入数据上调用。这提供了一种灵活的方式来执行不属于标准转换库中的特定操作。
下面是一个示例,展示了如何使用转换来封装一个自定义的转换操作:
# 自定义的转换函数,例如将图像转换为灰度图  
custom_transform_fn = lambda image: image.convert('L')  

# 使用Lambda封装自定义转换  
custom_transform = transforms.Lambda(custom_transform_fn)  

# 在PIL图像上应用自定义转换  
transformed_image = custom_transform(img)
在这个例子中,我们定义了一个lambda函数custom_transform_fn,它将一个PIL图像转换为灰度图像。然后,使用transforms.Lambda来封装这个自定义函数,并将其应用到一个PIL图像上。
03

transforms.Compose:


当需要对图像进行一系列复杂的预处理操作时,可以通过transforms.Compose将多个图像转换(transforms)组合成一个单一的转换流水线。通过将多个转换步骤放入一个列表中,并按顺序应用它们,可以方便地构建出强大的图像预处理流水线。
# 创建一个转换流水线 
transform = transforms.Compose([
    transforms.Resize(224), # 将图像大小调整为224x224像素  
    transforms.CenterCrop(224), # 在图像中心裁剪出224x224的区域
    transforms.Lambda(lambda img:img.rotate(random.random()*360)), # 随机旋转图像
    transforms.ToTensor(), # 将PIL图像或NumPy ndarray转换为PyTorch张量
    transforms.Normalize(mean=[-0.0325, -0.0331, -0.1010],std=[0.5220, 0.5135, 0.5287]),# 对张量图像进行标准化
])

# 应用转换流水线到图像上  
transformed_image = transform(img)
to_img = transforms.ToPILImage() # 将Tensor转换为PIL对象
to_img(transformed_image) # 显示图像
在上述示例中,创建了一个包含5个转换步骤的流水线。图像转换结果如下所示:
原图 转换结果

04

将变换作为参数传递:


当需要处理自定义数据集中的所有图像时,在自定义数据集对象时需要将 transforms 参数赋值给类的实例变量,然后在创建数据集实例时,可以将变换操作作为参数传递。
# 自定义数据集对象
class DogCat(Dataset):
    def __init__(self,root,transforms=None):
        imgs = os.listdir(root)
        self.imgs = [os.path.join(root,img) for img in imgs]
        # 将传入的 transforms 参数赋值给类的实例变量
        self.transforms = transforms

    def __getitem__(self,index):
        img_path = self.imgs[index]
        label = 1 if 'dog' in img_path.split('/')[-1else 0
        data = Image.open(img_path)
        if self.transforms:
            data = self.transforms(data)
        return data,label

    def __len__(self):
        return len(self.imgs)


# 在创建数据集实例时,可以将变换操作作为参数传递
dataset = DogCat('./data/dogcat/',transforms = transform)

05

transforms.functional


transforms.functionaltorchvision.transforms模块中的一个子模块,提供了一系列用于图像处理的函数。相比于torchvision.transforms中的类,transforms.functional中的函数更加灵活,可以直接应用于图像数据。

transforms.functional中一些主要功能和函数如下所示:

  • to_tensor(pic): 将PIL图像或NumPy数组转换为PyTorch张量。

  • normalize(tensor_image, mean, std): 对图像张量进行标准化,使用给定的均值和标准差。

  • resize(img, size): 调整图像大小到指定的尺寸。

  • crop(img, top, left, height, width): 从图像中裁剪出指定区域。

  • hflip(img): 水平翻转图像。

  • vflip(img): 垂直翻转图像。

  • rotate(img, angle): 以指定的角度旋转图像。

  • adjust_brightness(img, brightness_factor): 调整图像的亮度。

  • adjust_contrast(img, contrast_factor): 调整图像的对比度。

  • adjust_saturation(img, saturation_factor): 调整图像的饱和度。

  • adjust_hue(img, hue_factor): 调整图像的色调.

  • pad(img, padding, fill=0, padding_mode=’constant’): 用指定的填充模式和填充值填充图像。填充模式可以是‘constant’, ‘edge’, ‘reflect’‘symmetric’

  • affine(img, angle, translate, scale, shear): 对图像进行仿射变换,包括旋转、平移、缩放和剪切.

  • to_pil_image(tensor): 将PyTorch张量转换为PIL图像。

  • normalize_tensor(tensor_image, mean, std): 对图像张量进行标准化(与normalize功能相似,但直接作用于张量)。

transforms.functional中的函数通常直接作用于图像数据(如PIL图像或PyTorch张量),并返回处理后的图像。
import torchvision.transforms.functional as TF

# 以指定的角度旋转图像
TF.rotate(img, 45)


更多内容可以前往官网查看

https://pytorch.org/


本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments