图像增广是对训练图像做一系列随机改变,来产生相似但又不同的训练样本,从而扩大训练数据集的规模。我们深知大型数据集是成功应用深度神经网络的先决条件。应用图像增广能够随机改变训练样本可以减小模型对某些属性的依赖,从而提高模型的泛化能力。例如我们可以对一张图片实现裁剪、调整亮度、颜色等等。
先导入相关得包和图片
%matplotlib inline
import torch
import torchvision
from torch import nn
from d2l import torch as d2l
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
#设置matplotlab的图表大小
d2l.set_figsize()
#打开图片
img=d2l.Image.open('./小兔.jpg')
#显示图片
d2l.plt.imshow(img)
为了并于观察图像增广得效果,我们定义一个辅助函数apply。
def apply(img,aug,num_rows=2,num_cols=4,scale=1.5):
Y=[aug(img) for _ in range(num_rows*num_cols)]
d2l.show_images(Y,num_rows,num_cols,scale=scale)
1.torchvision.transforms.RandomHorizontalFlip( p )
给定的概率随机水平翻转给定的图像,默认p为0.5
apply(img,torchvision.transforms.RandomHorizontalFlip())
2.torchvision.transforms.RandomVerticalFlip( p )
给定的概率随机垂直翻转给定的图像,默认p为0.5
apply(img,torchvision.transforms.RandomVerticalFlip())
1.torchvision.transforms.CenterCrop(size)
根据给定的size在中心裁剪图像。
apply(img,torchvision.transforms.CenterCrop(2000))
2.torchvision.transforms.RandomCrop(size)
根据给定的size随机裁剪图像。
apply(img,torchvision.transforms.RandomCrop(2000))
3.torchvision.transforms.FiveCrop(size)
根据给定的size对图片进行上下左右以及中心裁剪,获得5张图片。
4.torchvision.transforms.RandomResizedCrop(size,scale,ratio)
随机长宽比裁剪。参数:
**size:**随机裁减后图片尺寸
**scale:**随机裁剪后图片的大小为原来图片的倍数
**ratio:**随机裁剪后图片的宽高比
apply(img,torchvision.transforms.RandomResizedCrop(1000,scale=(0.1,1),ratio=(0.5,2)))
5.torchvision.transforms.TenCrop(size, vertical_flip=False)
上下左右中心裁剪后翻转.对图片进行上下左右以及中心裁剪,然后全部翻转(水平或者垂直),获得 10 张图片。
1.torchvision.transforms.Normalize(mean, std)
对数据按通道进行标准化,即先减均值,再除以标准差。
2.torchvision.transforms.ToTensor()
将 PIL Image 或者 ndarray 转换为 tensor,并且归一化至[0,1]。
3.torchvision.transforms.Pad(padding, fill=0, padding_mode=‘constant’)
对图像进行填充
padding:(sequence or int, optional),此参数是设置填充多少个pixel。当为 int 时,图像上下左右均填充 int 个。
padding_mode:填充模式,有4种模式,constant、edge、reflect和symmetric
**fill:**设置填充的像素值(R, G, B)或GRAY。
4.torchvision.transforms.ColorJitter(brightness=0, contrast=0, saturation=0,hue=0)
修改修改亮度、对比度、饱和度和色度
**brightness:**亮度调整因子当为a时,从[max(0, 1-a), 1+a]中随机选择当为(a, b)时,从[a, b]中随机选择
**contrast:**对比度参数,同brightness
**saturation:**饱和度参数,同brightness
**hue:**色度参数
当为a时,从[-a, a]中选择参数(0≤ a≤0.5)
当为(a, b)时,从[a, b]中选择参数(0≤ a≤0.5,0≤ b≤0.5)
5.torchvision.transforms.Grayscale(num_output_channels=1)
将图片转换为灰度图
6.torchvision.transforms.ToPILImage(mode=None)
将 tensor 或者 ndarray 的数据转换为 PIL Image 类型数据
mode=None为1通道; mode=3 通道转换为 RGB.
7.torchvision.transforms.RandomErasing(p=0.5, scale=(0.02, 0.33), ratio=(0.3, 3.3), value=0, inplace=False)
**p:**概率值,执行改操作的概率
**scale:**遮挡区域的面积
**ratio:**遮挡区域长宽比
**value:**设置遮挡区域的像素值,(R,G,B)或 (Gray)
通常在实战中我们一般会使用多种图像增广方法,在这里我们使用一个Compose实例来实现不同得图像增广方法,并将他们应用到示例。
flip_aug=torchvision.transforms.RandomHorizontalFlip()
color_aug=torchvision.transforms.ColorJitter(brightness=0.5, contrast=0.5, saturation=0.5,hue=0.5)
crop_aug=torchvision.transforms.RandomResizedCrop((200,200),scale=(0.1,1),ratio=(0.5,2))
augs=torchvision.transforms.Compose([flip_aug,color_aug,crop_aug])
apply(img,augs)