秃姐学AI系列之:数据增广 + 代码实现

目录

数据增广

常见的图像增广方法

翻转

切割

颜色

总结

 代码实现

 左右翻转图像 RandomHorizontalFlip()

 上下翻转图像 RandomVerticalFlip()

随机裁剪 RandomResizedCrop()

随机更改图像的亮度 ColorJitter()

改变色调 ColorJitter()

一起改!

结合多种图像增广方法


数据增广

 图像增广在对训练图像进行一系列的随机变化之后,生成相似但不同的训练样本,从而扩大了训练集的规模。 此外,应用图像增广的原因是,随机改变训练样本可以减少模型对某些属性的依赖,从而提高模型的泛化能力。

例如,我们可以以不同的方式裁剪图像,使感兴趣的对象出现在不同的位置,减少模型对于对象出现位置的依赖。 我们还可以调整亮度、颜色等因素来降低模型对颜色的敏感度。 

数据增广就是——在一个已有的数据集上面通过对数据进行变化,使其拥有更多多样性,比如:

  • 在语言里面加入各种不同的背景噪音
  • 改变图片的颜色和形状

一般是在线生成增强的数据。即还是从原始数据集读取图片,一般做法是随机做增强,会生成一堆不同的数据,然后再送入模型做训练。

当然这是训练的时候!测试的时候就不需要对数据做增强了!(可以理解成一个正则项)

常见的图像增广方法

翻转

上下翻转:如果是建筑物这种具有强方向性的数据,就不一定效果会好;但是比如树叶啊这种无强方向性的数据就会有一定效果

切割

从图片中切割一块,然后变形到固定形状

  • 随机高宽比(在 3/4 和 4/3 之间随机取一个数字,即为我们切下来的图片的大小)
  • 随即大小(8% ~ 100%之间随机选一个数,即为切下来的图片占原图片的多少)
  • 随机位置 

颜色

另一种增广方法是改变颜色。 我们可以改变图像颜色的四个方面:亮度、对比度、饱和度和色调。

在下面的示例中,我们随机更改图像的亮度,随机值为原始图像的50%(1−0.5)到150%(1+0.5)之间。

同样,我们可以随机更改图像的色调

总结

  • 图像增广基于现有的训练数据生成随机图像,来提高模型的泛化能力。

  • 为了在预测过程中得到确切的结果,我们通常对训练样本只进行图像增广,而在预测过程中不使用带随机操作的图像增广。

  • 深度学习框架提供了许多不同的图像增广方法,这些方法可以被同时应用。

  • 常见的图片增广包括反转、切割、变色

 代码实现

%matplotlib inline
import torch
import torchvision
from torch import nn
from d2l import torch as d2l

d2l.set_figsize()
img = d2l.Image.open('../img/cat1.jpg')
d2l.plt.imshow(img);

我们将使用下面这个尺寸为400×500的图像作为示例。

大多数图像增广方法都具有一定的随机性。为了便于观察图像增广的效果,我们下面定义辅助函数apply。 此函数在输入图像 img上多次运行图像增广方法 aug并显示所有结果。

# img:图片 aug:图像增广 num_rows、num_cols:对它重复作用多少次(两行四列 = 8次) scale:画的图片有多大(这个可忽略,就是为了画大一些)
def apply(img, aug, num_rows=2, num_cols=4, scale=1.5):
    Y = [aug(img) for _ in range(num_rows * num_cols)]    # 把所有图片存到 Y 里面
    d2l.show_images(Y, num_rows, num_cols, scale=scale)    # 把它投影出来

 左右翻转图像 RandomHorizontalFlip()

在水平方向随机的进行翻转

apply(img, torchvision.transforms.RandomHorizontalFlip())

结果: 

 上下翻转图像 RandomVerticalFlip()

apply(img, torchvision.transforms.RandomVerticalFlip())

结果:

随机裁剪 RandomResizedCrop()

下面的代码将随机裁剪一个面积为原始面积10%到100%的区域,该区域的宽高比从0.5~2之间随机取值。 然后,区域的宽度和高度都被缩放到200像素。

# RandomResizedCrop(最终输出大小(无论你裁剪多大区域,最终都resize成这个大小),随机裁剪的区域范围(比如下面代码:在0.1到1之间随机选一个数),高宽比(要么1/2,要么2/1))
shape_aug = torchvision.transforms.RandomResizedCrop(
    (200, 200), scale=(0.1, 1), ratio=(0.5, 2))
apply(img, shape_aug)

 结果:

随机更改图像的亮度 ColorJitter()

ColorJitter(亮度(0.5是指上下浮动50%),对比度(0即不改变),饱和度,颜色)

apply(img, torchvision.transforms.ColorJitter(
    brightness=0.5, contrast=0, saturation=0, hue=0))

 结果:

改变色调 ColorJitter()

apply(img, torchvision.transforms.ColorJitter(
    brightness=0, contrast=0, saturation=0, hue=0.5))

 结果:

一起改!

同时随机更改图像的亮度(brightness)、对比度(contrast)、饱和度(saturation)和色调(hue)。

color_aug = torchvision.transforms.ColorJitter(
    brightness=0.5, contrast=0.5, saturation=0.5, hue=0.5)
apply(img, color_aug)

 结果:

结合多种图像增广方法

在实践中,我们通常结合多种图像增广方法。比如,我们可以通过使用一个 Compose 实例来综合上面定义的不同的图像增广方法,并将它们应用到每个图像。 

augs = torchvision.transforms.Compose([
    # color_aug 和 shape_aug 是上面存下来的颜色增广和形状增广
    torchvision.transforms.RandomHorizontalFlip(), color_aug, shape_aug])
apply(img, augs)

结果: 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值