目录
数据增广
图像增广在对训练图像进行一系列的随机变化之后,生成相似但不同的训练样本,从而扩大了训练集的规模。 此外,应用图像增广的原因是,随机改变训练样本可以减少模型对某些属性的依赖,从而提高模型的泛化能力。
例如,我们可以以不同的方式裁剪图像,使感兴趣的对象出现在不同的位置,减少模型对于对象出现位置的依赖。 我们还可以调整亮度、颜色等因素来降低模型对颜色的敏感度。
数据增广就是——在一个已有的数据集上面通过对数据进行变化,使其拥有更多多样性,比如:
- 在语言里面加入各种不同的背景噪音
- 改变图片的颜色和形状
一般是在线生成增强的数据。即还是从原始数据集读取图片,一般做法是随机做增强,会生成一堆不同的数据,然后再送入模型做训练。
当然这是训练的时候!测试的时候就不需要对数据做增强了!(可以理解成一个正则项)
常见的图像增广方法
翻转
上下翻转:如果是建筑物这种具有强方向性的数据,就不一定效果会好;但是比如树叶啊这种无强方向性的数据就会有一定效果
切割
从图片中切割一块,然后变形到固定形状
- 随机高宽比(在 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)
结果: