本文共 5633 字,大约阅读时间需要 18 分钟。
在处理图像数据时,数据增强是一种非常有效的方法。尤其是在数据量较少或类别不平衡的情况下,数据增强可以帮助模型更好地泛化能力。以下是一些常用的数据增强方法及其实现方式。
中心裁剪是一种常见的图像预处理方法。通过将图像的中心部分裁剪成指定尺寸,可以保留图像的主要内容,同时减少边缘失真。
transforms.CenterCrop(size)size 参数为 int,表示裁剪后的图像尺寸。如果参数为 (h, w),则裁剪后的尺寸为 (h, w)。from PIL import Imagefrom torchvision import transforms as tfsimg = Image.open('scenery.jpg') # 原图尺寸为474 * 379img1 = tfs.CenterCrop(300)(img) # 裁剪成300 * 300 随机裁剪可以根据需要随机选择裁剪区域,增加图像的多样性。
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),左、上、右、下分别填充 a、b、c、d 个像素。 |
| pad_if_needed | 默认为 False,超出尺寸不会填充。为 True 时,超出尺寸进行填充。 |
| fill | 填充值,默认为 0(黑色)。 |
| padding_mode | 1. constant,像素值由 fill 填充。2. edge,图像边缘像素值填充。3. reflect,镜像填充,最后一个像素不镜像。4. symmetric,镜像填充,最后一个像素镜像。 |
from PIL import Imagefrom torchvision import transforms as tfsimg = Image.open('scenery.jpg') # 原图尺寸为474 * 379img1 = 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) # 超出尺寸填充 翻转可以增加图像的多样性,常用于数据增强。
transforms.RandomHorizontalFlip(p=0.5)p 为概率值。如果为 1,图像会被水平翻转。为 0.5 时,有 50% 的概率翻转。from PIL import Imagefrom torchvision import transforms as tfsimg = Image.open('scenery.jpg')img1 = tfs.RandomHorizontalFlip(p=1)(img) # 确保翻转 transforms.RandomVerticalFlip(p=0.5)p 为概率值。如果为 1,图像会被垂直翻转。为 0.5 时,50% 的概率翻转。from PIL import Imagefrom torchvision import transforms as tfsimg = Image.open('scenery.jpg')img1 = tfs.RandomVerticalFlip(p=1)(img) # 确保翻转 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.NEAREST、PIL.Image.BILINEAR、PIL.Image.BICUBIC。from PIL import Imagefrom torchvision import transforms as tfsimg = 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) # 填充颜色 灰度变换可以将图像转换为单通道灰度。
transforms.Grayscale(num_output_channels=1)3。from PIL import Imagefrom torchvision import transforms as tfsimg = Image.open('scenery.jpg')img1 = tfs.Grayscale()(img) # 灰度变换 色彩抖动可以随机调整图像的亮度、对比度、饱和度和色调。
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 Imagefrom torchvision import transforms as tfsimg = 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) # 饱和度调整 随机翻转颜色可以增加图像的多样性。
transforms.RandomInvert(p=0.5)p 为概率值。如果为 1,颜色会被翻转。为 0.5 时,50% 的概率翻转。from PIL import Imagefrom torchvision import transforms as tfsimg = Image.open('scenery.jpg')img1 = tfs.RandomInvert(p=0.5)(img) # 随机翻转颜色 随机调整锐度可以增加图像的多样性。
transforms.RandomAdjustSharpness(sharpness_factor, p=0.5)sharpness_factor 为调整锐度的因子。0 为模糊,1 为原图。随着数字越大,锐度越高。p 为概率值。如果为 1,锐度会被调整。为 0.5 时,有 50% 的概率调整。from PIL import Imagefrom torchvision import transforms as tfsimg = Image.open('scenery.jpg')img1 = tfs.RandomAdjustSharpness(200)(img) # 随机调转图片锐度 高斯模糊可以模糊图像的一部分,增加数据多样性。
transforms.GaussianBlur(kernel_size, sigma=(0.1, 2.0))| 参数 | 具体说明 |
|---|---|
| kernel_size | 模糊半径(奇数)。 |
| sigma | 正态分布标准差。1. 为元组 (min, max),在该区间随机取一个数。2. 为浮点数,则为该数。 |
from PIL import Imagefrom torchvision import transforms as tfsimg = Image.open('scenery.jpg')img1 = tfs.GaussianBlur(11, 10)(img) # size 为 11,标准差为 10img2 = tfs.GaussianBlur(51, 10)(img) # size 为 51,标准差为 10img3 = tfs.GaussianBlur(101, 100)(img) # size 为 101,标准差为 100 边缘填充可以增加图像的尺寸,用于数据增强。
transforms.Pad(padding, fill=0, padding_mode=‘constant’)| 参数 | 具体说明 |
|---|---|
| padding | 1. 为 a,上下左右填充 a 个像素。2. 为 (a, b),左右填充 a 个像素,上下填充 b 个像素。3. 为 (a, b, c, d),左、上、右、下分别填充 a、b、c、d 个像素。 |
| fill | 填充值,默认为 0(黑色)。 |
| padding_mode | 1. constant,像素值由 fill 填充。2. edge,图像边缘像素值填充。3. reflect,镜像填充,最后一个像素不镜像。4. symmetric,镜像填充,最后一个像素镜像。 |
from PIL import Imagefrom torchvision import transforms as tfsimg = Image.open('scenery.jpg')img1 = tfs.Pad(100, fill=(0, 0, 255))(img) # 填充颜色为蓝色 仿射变换是一种旋转、平移、缩放、扭曲等组合的变换。
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 Imagefrom torchvision import transforms as tfsimg = 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/