关于pytorch:数据增强之裁剪翻转与旋转

4次阅读

共计 3542 个字符,预计需要花费 9 分钟才能阅读完成。

文章和代码曾经归档至【Github 仓库:https://github.com/timerring/dive-into-AI】或者公众号【AIShareLab】回复 pytorch 教程 也可获取。

数据加强 Data Augmentation

数据加强又称为数据增广,数据扩增,它是对训练集进行变换,使训练集更丰盛,从而让模型更具泛化能力。

技巧:

debug console:命令输出窗的环境与以后代码调试的环境完全一致,能够对变量进行更改或者查看。

例如这里对于输出变量的 shape 进行了查看。

因为图片通过 transform 操作之后是 tensor,像素值在 0\~1 之间,并且标准差和方差不是失常图片的。所以定义了 transform_invert() 办法。性能是对 tensor 进行反标准化操作,并且把 tensor 转换为 image,不便可视化。

次要批改的是 transforms.Compose 代码块中的内容,其中 transforms.Resize((224, 224)) 是把图片缩放到 (224, 224) 大小,而后再进行其余 transform 操作。

裁剪 Crop

transforms.CenterCrop

torchvision.transforms.CenterCrop(size)

性能:从图像核心裁剪图片

  • size:所需裁剪图片尺寸

CenterCrop:以核心裁剪,如果裁剪尺寸小于原尺寸,则显示裁剪后的局部,否则对于多出的局部填充为 0 的像素(即彩色)。

transforms.RandomCrop

torchvision.transforms.RandomCrop(size, padding=None, pad_if_needed=False, fill=0, padding_mode='constant')

性能:从图片中随机裁剪出尺寸为 size 的图片,若有 padding,那么先进行 padding,再随机裁剪 size 大小的图片。

  • size: 裁剪大小
  • padding: 设置填充大小

    • 当为 a 时,上下左右均填充 a 个像素
    • 当为 (a, b) 时,左右填充 a 个像素,高低填充 b 个像素
    • 当为 (a, b, c, d) 时,左上右下别离填充 a,b,c,d
  • pad\_if\_need: 当图片小于设置的 size,是否填充
  • padding\_mode:

    • constant: 像素值由 fill 设定
    • edge: 用图像边缘的像素值进行填充
    • reflect: 镜像填充,最初一个像素不镜像。([1,2,3,4] -> [3,2,1,2,3,4,3,2])

      可见,1 和 4 均没有镜像。

    • symmetric: 镜像填充,最初一个像素也镜像。([1,2,3,4] -> [2,1,1,2,3,4,4,4,3])
  • fill: 当 padding\_mode 为 constant 时,设置填充的像素值,如果不设置,则默认填充为 0。

transforms.RandomResizedCrop

torchvision.transforms.RandomResizedCrop(size, scale=(0.08, 1.0), ratio=(3 / 4, 4 / 3), interpolation=2)

性能:随机大小、随机宽高比裁剪图片。首先依据 scale 的比例裁剪原图,而后依据 ratio 的长宽比再裁剪,最初应用插值法把图片变换为 size 大小。

  • size: 裁剪的图片尺寸
  • scale: 随机缩放面积比例,默认随机选取 (0.08, 1) 之间的一个数,能够自行批改范畴。
  • ratio: 随机长宽比,默认随机选取 ($\displaystyle\frac{3}{4}$, $\displaystyle\frac{4}{3}$ ) 之间的数。在这个范畴内失真不显著,能够自行批改范畴。
  • interpolation: 当裁剪进去的图片小于 size 时,就要应用插值办法 resize,次要有三种插值办法,如下:

    • PIL.Image.NEAREST
    • PIL.Image.BILINEAR
    • PIL.Image.BICUBIC

transforms.FiveCrop(TenCrop)

torchvision.transforms.FiveCrop(size)
torchvision.transforms.TenCrop(size, vertical_flip=False)

性能:FiveCrop在图像的上下左右以及核心裁剪出尺寸为 size 的 5 张图片。Tencrop对这 5 张图片进行程度(默认)或者垂直镜像取得 10 张图片。

  • size: 裁剪的图片尺寸
  • vertical\_flip: 是否垂直翻转

因为这两个办法返回的是 tuple,每个元素示意一个图片,咱们还须要把这个 tuple 转换为一张图片的tensor。代码如下:

transforms.FiveCrop(112),
transforms.Lambda(lambda crops: torch.stac k([(transforms.ToTensor()(crop)) for crop in crops]))

这里采纳 Lambda 匿名函数,:前 crops 为函数的输出,之后的为函数的返回值。其中 stack 是在张量的某一个维度上进行拼接,默认的为第 0 维度,[(transforms.ToTensor()(crop)) for crop in crops]) 中对 crops 进行 for 循环,而后取出的 crop 进行 totensor 的操作转换为张量的模式,失去长度为 5 的 list,而后 stack 将长度为 5 的 list 拼接为一个张量。

并且把 transforms.Compose 中最初两行正文:

# transforms.ToTensor(), # toTensor()接管的参数是 Image,因为下面曾经进行了 toTensor()
# transforms.Normalize(norm_mean, norm_std), # 因为是 4 维的 Tensor,因而不能执行 Normalize() 办法
  • transforms.Normalize()办法接管的是 3 维的 tensor (在 _is_tensor_image()办法 里查看是否满足这一条件,不满足则报错),而通过 transforms.FiveCrop 返回的是 4 维张量,因而正文这一行。

最初的 tensor 形态是 [ncrops, c, h, w],图片可视化的代码也须要做批改:

## 展现 FiveCrop 和 TenCrop 的图片
ncrops, c, h, w = img_tensor.shape
columns=2 # 两列
rows= math.ceil(ncrops/2) # 计算多少行
# 把每个 tensor ([c,h,w]) 转换为 image
for i in range(ncrops):
    img = transform_invert(img_tensor[i], train_transform)
    plt.subplot(rows, columns, i+1)
    plt.imshow(img)
plt.show()

5 张图片别离是左上角,右上角,左下角,右下角,核心。

翻转 Flip

transforms.RandomHorizontalFlip(RandomVerticalFlip)

transforms.RandomVerticalFlip(p=1)

性能:依据概率,在程度或者垂直方向翻转图片。

  • p: 翻转概率

transforms.RandomHorizontalFlip(p=0.5),那么一半的图片会被程度翻转。

transforms.RandomVerticalFlip(p=1),那么所有图片会被垂直翻转。

旋转 Rotation

transforms.RandomRotation

torchvision.transforms.RandomRotation(degrees, resample=False, expand=False, center=None, fill=None)

性能:随机旋转图片

  • degree: 旋转角度

    • 当为 a 时,在 (-a, a) 之间随机抉择旋转角度
    • 当为 (a, b) 时,在 (a, b) 之间随机抉择旋转角度
  • resample: 重采样办法,通常默认就好
  • expand: 是否扩充矩形框,以放弃原图信息。依据核心旋转点计算扩充后的图片。如果旋转点不是核心,即便设置 expand = True,还是会有局部信息失落。因为 expand 次要是针对 center 旋转设计的,如果更换了旋转点,会失落旋转信息。

    如果设置 expand=True,batch size 大于 1,那么在一个 Batch 中,每张图片的 shape 都不一样了,会报错 Sizes of tensors must match except in dimension 0所以如果 expand=True,那么还须要进行 resize 操作。

  • center: 旋转点设置,是坐标,默认核心旋转。如设置左上角为:(0, 0)
正文完
 0