《动手学深度学习》图像增广(数据增强)

图像增广

图像增广(image augmentation)技术通过对训练图像做一系列随机改变,来产生相似但又不同的训练样本,从而扩大训练数据集的规模。
其优点在于通过随机改变训练样本可以降低模型对某些属性的依赖,从而提高模型的泛化能力。
例如:

  1. 对图像进行不同方式的裁剪,使感兴趣的物体出现在不同位置,从而减轻模型对物体出现位置的依赖性。
  2. 可以调整亮度、色彩等因素来降低模型对色彩的敏感度。

常用增广方法

我们这里使用torchvision对图像进行处理,torchvision内置了一些图像处理API。
torchvision.transforms 下内置各种图像处理方法,调用并输入图像就可以得到处理后的 Image 对象。
基本调用方法为:

import torchvision
from PIL import Image

img = Image.open('./cat3.jpg')
img = torchvision.transforms.RandomHorizontalFlip()(img)

我们这里写一个函数方便测试:

def deal_single_img(path, deal_function):
    d2l.set_figsize()
    img2 = Image.open(path)
    origin_type = type(img2)
    d2l.plt.imshow(img2)
    plt.show()
    img2 = deal_function(img2)
    target_type = type(img2)
    d2l.plt.imshow(img2)
    plt.show()
    print("{} => {}".format(origin_type, target_type))

函数接收两个参数,图片路径和处理方法,最后会输出处理前的图像和处理后的图像,并打印出前后图像的 Image 对象的类型。
这里列出了源码中列举的可以调用的操作。

__all__ = ["Compose", "ToTensor", "ToPILImage", "Normalize", "Resize",
"Scale", "CenterCrop", "Pad", "Lambda", "RandomCrop", 
"RandomHorizontalFlip", "RandomVerticalFlip", "RandomResizedCrop", 
"RandomSizedCrop", "FiveCrop", "TenCrop","LinearTransformation", 
"ColorJitter", "RandomRotation", "Grayscale", "RandomGrayscale"]

随机翻转

dfunc = torchvision.transforms.RandomHorizontalFlip()
deal_single_img(dfunc)

在这里插入图片描述

随机裁剪

dfunc = torchvision.transforms.RandomResizedCrop(200, scale=(0.1, 1), ratio=(0.5, 2))
deal_single_img(dfunc)

在这里插入图片描述

随机亮度

dfunc = torchvision.transforms.ColorJitter(brightness=0.5, contrast=0, saturation=0, hue=0)
deal_single_img(dfunc)

在这里插入图片描述

随机色彩变化

这里解释一下 ColorJitter 里面的参数:亮度(brightness)、对比度(contrast)、饱和度(saturation)和色调(hue)。这里可以组合的进行调整。

dfunc = torchvision.transforms.ColorJitter(brightness=0.5, contrast=0, saturation=0, hue=0)
deal_single_img(dfunc)

在这里插入图片描述

叠加多个图像增强

使用 Compose 叠加多种图像操作,这里我们叠加了随机水平翻转,随机颜色变化,随机裁剪。

dfunc = torchvision.transforms.Compose([
    torchvision.transforms.RandomHorizontalFlip(),
    torchvision.transforms.ColorJitter(brightness=0.5, contrast=0.5, saturation=0.5, hue=0.5),
    torchvision.transforms.RandomResizedCrop(200, scale=(0.1, 1), ratio=(0.5, 2))])
deal_single_img(dfunc)

在这里插入图片描述

图像转为张量

torchvision.transforms.ToTensor()(img).shape

我们使用 ToTensor() 操作图像,可将图像转为张量形式。

torch.Size([3, 400, 500])

经过图像增强,增大数据规模后,就可以开始训练并对比模型的泛化能力了。


版权声明:本文为weixin_39198406原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。