博客
关于我
Pytorch 图像增强 实现翻转裁剪色调等 附代码(全)
阅读量:797 次
发布时间:2023-03-04

本文共 5633 字,大约阅读时间需要 18 分钟。

数据增强技巧:提升图像处理效果的秘密

在处理图像数据时,数据增强是一种非常有效的方法。尤其是在数据量较少或类别不平衡的情况下,数据增强可以帮助模型更好地泛化能力。以下是一些常用的数据增强方法及其实现方式。

1. 裁剪

1.1 中心裁剪

中心裁剪是一种常见的图像预处理方法。通过将图像的中心部分裁剪成指定尺寸,可以保留图像的主要内容,同时减少边缘失真。

核心函数:transforms.CenterCrop(size)

  • size 参数为 int,表示裁剪后的图像尺寸。如果参数为 (h, w),则裁剪后的尺寸为 (h, w)

代码示例:

from PIL import Image
from torchvision import transforms as tfs
img = Image.open('scenery.jpg') # 原图尺寸为474 * 379
img1 = tfs.CenterCrop(300)(img) # 裁剪成300 * 300

1.2 随机裁剪

随机裁剪可以根据需要随机选择裁剪区域,增加图像的多样性。

核心函数:transforms.RandomCrop(size, padding=None, pad_if_needed=False, fill=0, padding_mode='constant')

参数 具体说明
size 1. 为 size,结果为 size * size。2. 为 (h, w),结果为 h * w
padding 1. 为 a,上下左右填充 a 个像素。2. 为 (a, b),左右填充 a 个像素,上下填充 b 个像素。3. 为 (a, b, c, d),左、上、右、下分别填充 abcd 个像素。
pad_if_needed 默认为 False,超出尺寸不会填充。为 True 时,超出尺寸进行填充。
fill 填充值,默认为 0(黑色)。
padding_mode 1. constant,像素值由 fill 填充。2. edge,图像边缘像素值填充。3. reflect,镜像填充,最后一个像素不镜像。4. symmetric,镜像填充,最后一个像素镜像。

代码示例:

from PIL import Image
from torchvision import transforms as tfs
img = Image.open('scenery.jpg') # 原图尺寸为474 * 379
img1 = tfs.RandomCrop(300)(img) # 默认填充模式为 `constant`
img2 = tfs.RandomCrop(300, padding=(16, 64))(img) # 自定义填充大小
img3 = tfs.RandomCrop(300, padding=(16, 64), fill=(255, 255, 0))(img) # 自定义填充色彩
img4 = tfs.RandomCrop(2000, pad_if_needed=True)(img) # 超出尺寸填充

2. 翻转

翻转可以增加图像的多样性,常用于数据增强。

2.1 水平翻转

核心函数:transforms.RandomHorizontalFlip(p=0.5)

  • p 为概率值。如果为 1,图像会被水平翻转。为 0.5 时,有 50% 的概率翻转。

代码示例:

from PIL import Image
from torchvision import transforms as tfs
img = Image.open('scenery.jpg')
img1 = tfs.RandomHorizontalFlip(p=1)(img) # 确保翻转

2.2 垂直翻转

核心函数:transforms.RandomVerticalFlip(p=0.5)

  • p 为概率值。如果为 1,图像会被垂直翻转。为 0.5 时,50% 的概率翻转。

代码示例:

from PIL import Image
from torchvision import transforms as tfs
img = Image.open('scenery.jpg')
img1 = tfs.RandomVerticalFlip(p=1)(img) # 确保翻转

2.3 随机旋转

核心函数:transforms.RandomRotation(degrees, expand=False, center=None, fill=0, resample=None)

  • degrees 为旋转角度范围。1. 为 a,在 (-a, a) 区间随机选择角度。2. 为 (a, b),在 (a, b) 区间随机选择角度。
  • expand 默认为 False,超出部分不会显示。如果为 True,超出部分会显示完整图像。
  • center 默认为图像中心旋转。
  • resample 为重采样方法,可选 PIL.Image.NEARESTPIL.Image.BILINEARPIL.Image.BICUBIC

代码示例:

from PIL import Image
from torchvision import transforms as tfs
img = Image.open('scenery.jpg')
img1 = tfs.RandomRotation(degrees=(45, 45))(img) # 随机旋转 45 度
img2 = tfs.RandomRotation(degrees=(45, 45), expand=True)(img) # 超出部分显示
img3 = tfs.RandomRotation(degrees=(45, 45), fill=(255, 255, 0))(img) # 填充颜色

3. 色调

3.1 灰度变换

灰度变换可以将图像转换为单通道灰度。

核心函数:transforms.Grayscale(num_output_channels=1)

  • 通常不需要设置,默认输出单通道灰度。如果需要三通道灰度,可设置为 3

代码示例:

from PIL import Image
from torchvision import transforms as tfs
img = Image.open('scenery.jpg')
img1 = tfs.Grayscale()(img) # 灰度变换

3.2 色彩抖动

色彩抖动可以随机调整图像的亮度、对比度、饱和度和色调。

核心函数:transforms.ColorJitter(brightness=0, contrast=0, saturation=0, hue=0)

参数 具体说明
brightness 1. 元组 (min, max),在该区间随机变换亮度。2. 浮点数,亮度范围为 [max(0, 1 - brightness), 1 + brightness]
contrast 对比度,规则与亮度相同。
saturation 饱和度,规则与亮度相同。
hue 色调,1. 元组 (min, max),在该区间随机变换色调。2. 浮点数,色调范围为 [-hue, hue],整体区间范围为 [0, 0.5][-0.5, 0.5]

代码示例:

from PIL import Image
from torchvision import transforms as tfs
img = Image.open('scenery.jpg')
img1 = tfs.ColorJitter(brightness=(3, 3))(img) # 亮度调整
img2 = tfs.ColorJitter(contrast=(3, 3))(img) # 对比度调整
img3 = tfs.ColorJitter(saturation=(3, 3))(img) # 饱和度调整

3.3 随机翻转颜色

随机翻转颜色可以增加图像的多样性。

核心函数:transforms.RandomInvert(p=0.5)

  • p 为概率值。如果为 1,颜色会被翻转。为 0.5 时,50% 的概率翻转。

代码示例:

from PIL import Image
from torchvision import transforms as tfs
img = Image.open('scenery.jpg')
img1 = tfs.RandomInvert(p=0.5)(img) # 随机翻转颜色

3.4 随机调整锐度

随机调整锐度可以增加图像的多样性。

核心函数:transforms.RandomAdjustSharpness(sharpness_factor, p=0.5)

  • sharpness_factor 为调整锐度的因子。0 为模糊,1 为原图。随着数字越大,锐度越高。
  • p 为概率值。如果为 1,锐度会被调整。为 0.5 时,有 50% 的概率调整。

代码示例:

from PIL import Image
from torchvision import transforms as tfs
img = Image.open('scenery.jpg')
img1 = tfs.RandomAdjustSharpness(200)(img) # 随机调转图片锐度

3.5 高斯模糊

高斯模糊可以模糊图像的一部分,增加数据多样性。

核心函数:transforms.GaussianBlur(kernel_size, sigma=(0.1, 2.0))

参数 具体说明
kernel_size 模糊半径(奇数)。
sigma 正态分布标准差。1. 为元组 (min, max),在该区间随机取一个数。2. 为浮点数,则为该数。

代码示例:

from PIL import Image
from torchvision import transforms as tfs
img = Image.open('scenery.jpg')
img1 = tfs.GaussianBlur(11, 10)(img) # size 为 11,标准差为 10
img2 = tfs.GaussianBlur(51, 10)(img) # size 为 51,标准差为 10
img3 = tfs.GaussianBlur(101, 100)(img) # size 为 101,标准差为 100

4. 边缘填充

边缘填充可以增加图像的尺寸,用于数据增强。

核心函数:transforms.Pad(padding, fill=0, padding_mode=‘constant’)

参数 具体说明
padding 1. 为 a,上下左右填充 a 个像素。2. 为 (a, b),左右填充 a 个像素,上下填充 b 个像素。3. 为 (a, b, c, d),左、上、右、下分别填充 abcd 个像素。
fill 填充值,默认为 0(黑色)。
padding_mode 1. constant,像素值由 fill 填充。2. edge,图像边缘像素值填充。3. reflect,镜像填充,最后一个像素不镜像。4. symmetric,镜像填充,最后一个像素镜像。

代码示例:

from PIL import Image
from torchvision import transforms as tfs
img = Image.open('scenery.jpg')
img1 = tfs.Pad(100, fill=(0, 0, 255))(img) # 填充颜色为蓝色

5. 仿射变换

仿射变换是一种旋转、平移、缩放、扭曲等组合的变换。

核心函数:transforms.RandomAffine(degrees, translate=None, scale=None, shear=None, resample=0, fillcolor=0)

参数 具体说明
degrees 随机旋转角度范围,0 为不旋转。
translate 水平和垂直平移因子。为 (a, b) 时,水平平移范围为 (-img_width * a, img_width * a),垂直平移范围为 (-img_height * b, img_height * b)
scale 缩放因子。为 (a, b) 时,在 (a, b) 区间随机选择一个数。
shear 随机扭曲角度范围。为 (a, b) 时,在 (a, b) 区间随机选择一个数。
resample 重采样方法。0 为不重采样,默认重采样。
fillcolor 填充色彩,可三通道填充。

代码示例:

from PIL import Image
from torchvision import transforms as tfs
img = Image.open('scenery.jpg')
img1 = tfs.RandomAffine(45)(img) # 随机旋转 45 度
img2 = tfs.RandomAffine(0, (0.7, 0))(img) # 随机平移
img3 = tfs.RandomAffine(0, None, (3, 5))(img) # 随机缩放
img4 = tfs.RandomAffine(0, None, None, (45, 90))(img) # 随机扭曲

通过以上方法,可以有效地对图像进行数据增强,提升模型的泛化能力。

转载地址:http://ykafk.baihongyu.com/

你可能感兴趣的文章
Pygame.display.togling_fulcreen()不起作用
查看>>
Pygame中的倒数计时器
查看>>
Pygame介绍以及下载
查看>>