图像增广在对训练图像进行一系 列的随机变化之后,生成相似但不同的训练样本,从而扩大了训练集的规模。此外,应用图像增广的原因是, 随机改变训练样本可以减少模型对某些属性的依赖,从而提高模型的泛化能力。例如,我们可以以不同的方 式裁剪图像,使感兴趣的对象出现在不同的位置,减少模型对于对象出现位置的依赖。我们还可以调整亮度、 颜色等因素来降低模型对颜色的敏感度。可以说,图像增广技术对于AlexNet的成功是必不可少的
常见的图像增广方法
使用PIL库显示测试图片,代码如下:
from PIL import Image
img = Image.open('./dog.jpeg')
img
测试图片
- 翻转和裁剪
左右翻转图像通常不会改变对象的类别。这是最早和最广泛使用的图像增广方法之一。接下来,我们使用 transforms 模块来创建 RandomFlipLeftRight 实例,这样就各有50%的几率使图像向左或向右翻转
import torchvision.transforms as transforms
from torch.utils.tensorboard import SummaryWriter
from torchvision.utils import make_grid
writer = SummaryWriter('./log')
toTensor = transforms.ToTensor()
imgTensorList = []
for index in range(12):
randomVerticalFlip = transforms.RandomVerticalFlip()
afterTrans = randomVerticalFlip(img)
imgTensor = toTensor(afterTrans)
imgTensorList.append(imgTensor)
imgTensorList2 = []
for index in range(12):
randomHorizontalFlip = transforms.RandomHorizontalFlip()
afterTrans = randomHorizontalFlip(img)
imgTensor = toTensor(afterTrans)
imgTensorList2.append(imgTensor)
writer.add_image("RandomVerticalFlip", make_grid(imgTensorList,nrow=3,padding=2), index)
writer.add_image("RandomHorizontalFlip", make_grid(imgTensorList2,nrow=3,padding=2), index)
writer.close()
在我们使用的示例图像中,狗狗位于图像的中间,但并非所有图像都是这样。我们可以通过对图像进行随机裁剪,使物体以不同的比例出现 在图像的不同位置。这也可以降低模型对目标位置的敏感性。
在下面的代码中,我们随机裁剪一个面积为原始面积10%到100%的区域,该区域的宽高比从0.5到2之间随机 取值。然后,区域的宽度和高度都被缩放到200像素。a和b之间的随机数指的是 在区间[a, b]中通过均匀采样获得的连续值
imgTensorList = []
for index in range(12):
shape_aug = transforms.RandomResizedCrop(size=(200, 200), scale=(0.1, 1), ratio=(0.5, 2))
afterTrans = shape_aug(img)
imgTensor = toTensor(afterTrans)
imgTensorList.append(imgTensor)
writer.add_image("RandomResizedCrop", make_grid(imgTensorList,nrow=3,padding=2), index)
writer.close()
随机裁剪
- 改变颜色
另一种增广方法是改变颜色。我们可以改变图像颜色的四个方面:亮度、对比度、饱和度和色调。在下面的 示例中,我们随机更改图像的亮度,随机值为原始图像的50%(1 − 0.5)到150%(1 + 0.5)之间。
toTensor = transforms.ToTensor()
imgTensorList = []
for index in range(12):
color_aug = transforms.ColorJitter(brightness=0.5,contrast=0.5,saturation=0.5,hue=0.5)
afterTrans = color_aug(img)
imgTensor = toTensor(afterTrans)
imgTensorList.append(imgTensor)
writer.add_image("ColorJitter", make_grid(imgTensorList,nrow=3,padding=2), index)
writer.close()
改变颜色