1、基本概念
数据增强,又称数据增广、数据扩增,是对训练集进行变换,使训练集更丰富,从而让模型更具泛化能力
2、裁剪 — — Crop
2.1 transforms.CenterCrop
功能:从图像中心裁剪图片
size
:所需裁剪图片尺寸
2.2 transforms.RandomCrop
# transforms.RandomCrop(
# size,
# padding=None,
# pad_if_needed=False,
# fill=0,
# padding_mode='constant',
# )
功能:从图片中随机裁剪出尺寸为 size 的图片
-
size
:所需裁剪图片尺寸 -
padding
:设置填充大小- 为 a 时,上下左右均填充 a 个像素
- 为 (a, b) 时,上下填充 b 个像素,左右填充 a 个像素
- 为 (a, b, c, d) 时,左、上、右、下分别填充 a,b,c,d 个像素
-
pad_if_need
:若图像小于设定的 size,则填充 -
padding_mode
:填充模式,有4种模式constant
:像素值由 fill 设定edge
:像素值由图像边缘像素决定reflect
:镜像填充,最后一个像素不镜像symmetric
:镜像填充,最后一个像素要镜像
-
fill
:为constant
时,设置填充的像素值
2.3 RandomResizedCrop
# transforms.RandomResizedCrop(
# size,
# scale=(0.08, 1.0),
# ratio=(3/4, 3/4),
# interpolation
# )
功能:随机大小、长宽比裁剪图片
-
size
:所需裁剪图片尺寸 -
scale
:随机裁剪面积比例,默认为(0.08, 1.0) -
ratio
:随机长宽比,默认为(3/4, 4/3) -
interpolation
:插值方式,默认为PIL.Image.BILINEAR
- PIL.Image.NEAREST:最近邻近插值
- PIL.Image,BILINEAR:双线性插值
- PIL.Image.BICUBIC:三次样条插值
- PIL.Image.LANCZOS:兰索斯插值
- PIL.Image.HAMMING:汉明码插值
- PIL.Image.BOX:盒插值
2.4 FiveCrop
# transforms.FiveCrop(
# size
# )
2.5 TenCrop
# transforms.TenCrop(
# size,
# vertical_flip=False,
# )
功能:在图像的上下左右以及中心裁剪出尺寸为 size 的图片,TenCrop 对5张图片进行水平或垂直镜像获得10张图片
size
:所需裁剪图片的尺寸vertical_flip
:是否进行垂直镜像
3、翻转 — — Flip
3.1 RandomHorizontalFlip
# transforms.RandomHorizontalFlip(
# p=0.5
# )
3.2 RandomVerticalFlip
# transforms.RandomVerticalFlip(
# p=0.5
# )
功能:依概率水平(左右)或垂直(上下)翻转图片
p
:翻转概率,默认为0.5
3.3 RandomRotation
# transforms.RandomRotation(
# degrees,
# resample=False,
# expand=False,
# center=None
# )
功能:随机翻转图片
-
degree
:旋转角度- 为 a 时,在 (-a, a) 之间选择旋转角度
- 为 (a, b) 时,在 (a, b) 之间选择旋转角度
-
resample
:重采样方法 -
expand
:是否扩大图片,以保持原图信息 -
center
:旋转点设置,默认为图像中心
4、图像变换
4.1 Pad
# transforms.Pad(
# padding,
# fill=0,
# padding_mode='constant'
# )
功能:对图片边缘进行填充
-
padding
:设置填充大小- 为 a 时,上下左右均填充 a 个像素
- 为 (a, b) 时,上下填充 a 个像素,左右填充 b 个像素
- 为 (a, b, c, d) 时,分别填充上、下、左、右的 a,b,c,d 个像素
-
padding_mode
:填充模式constant
:常数填充edge
:边缘填充,即边缘像素会被重复reflect
:镜像填充,即边缘像素会被镜像到对称位置symmetric
:对称填充,即边缘像素会被镜像到对称位置,最后一个镜像也会镜像
-
fill
:为constant
时,设置填充像素值,(R, G, B) 或 (Gray)
4.2 ColorJitter
# transforms.ColorJitter(
# brightness=0,
# contrast=0,
# saturation=0,
# hue=0
# )
功能:调整亮度、对比度、饱和度和色相
-
brightness
:亮度调整因子- 为 a 时,从 [max(0, 1-a), 1+a] 中随机选择
- 为 (a, b) 时,从 [a, b] 中随机选择
-
constrast
:对比度参数,同brightness
-
saturation
:饱和度参数,同brightness
-
hue
:色相参数- 为 a 时,从 [-a, a] 中随机选择,且 a 的取值范围为 [0, 0.5]
- 为 (a, b) 时,从 [a, b] 中随机选择,且 a、b 的取值范围为 [0, 0.5]
4.3 GrayScale
# transforms.Grayscale(
# num_output_channels=1
# )
4.4 RandomGradeCrop
# transforms.RandomGrayscale(
# num_output_channels=1,
# p=0.1
# )
功能:依概率将图片转换为灰度图
num_outpuut_channels
:输出通道数,1表示灰度图,3表示 RGB 彩色图p
:概率,0.5表示将图片转换为灰度图的概率为 50%
4.5 RandomAffine
# transforms.RandomAffine(
# degrees,
# translate=None,
# scale=None,
# shear=None,
# resample=False,
# fillcolor=0
# )
功能:对图像进行仿射变换,仿射变换是二维的线性变换,由五种基本原子变换构成,分别是旋转、平移、缩放、错切、剪切
-
degrees
:旋转角度设置 -
translate
:平移区间设置- 为 (a, b) 时,表示 x 轴和 y 轴的平移范围均为 [-a, b]
- 为 (a, b, c, d) 时,表示 x 轴平移范围为 [-a, b],y 轴平移范围为 [-c, d]
-
scale
:缩放比例(以面积为单位) -
fillcolor
:填充色设置
4.6 RandomErasing
# 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),默认为0
4.7 Lamdba
# transforms.Lambda(
# lambda
# )
功能:用户自定义 lamdba 方法
lambda
:匿名函数,可以把函数作为参数传递给另一个函数
5、方法选择
5.1 transforms.RandomChoice
# transforms.RandomChoice(
# [transforms1, transforms2, transforms3]
# )
功能:从一系列 transforms 方法中随机挑选一个
5.2 transforms.RandomApply
# transforms.RandomApply(
# [transforms1, transforms2, transforms3],
# p=0.5
# )
功能:依概率执行一组 transforms 操作
5.3 transforms.RandomOrder
# transforms.RandomOrder(
# [transforms1, transforms2, transforms3]
# )
功能:对一组 transforms 操作打乱顺序
6、自定义
# class Compose(object):
# def __call__(self, img):
# for t in self.transforms:
# img = t(img)
# return img
二要素:
- 仅接受一个参数,返回一个参数
- 注意上下游的输出和输入
# 通过继承类,实现多参数传入
# class YourTransform(object):
# def __init__(self, ...):
# ...# def __call__(self, img):
# ...
# return img
示例 — — 椒盐噪声:
- 概念:椒盐噪声,又称脉冲噪声,是一种随机出现的白点或者黑点,白点称为盐噪声,黑点称为椒噪声。
- 产生原因:椒盐噪声的产生是由于光照不均匀导致的。光线经过物体时,某些部分会被吸收,而另一些部分会被反射,产生了椒噪声和盐噪声。椒噪声的大小与光照强度成正比,盐噪声的大小与物体表面粗糙度成正比。椒盐噪声的产生是随机的,并不是均匀分布的。
- 解决方法:椒盐噪声的解决方法有两种:一是采用白盒处理,即对图像进行预处理,去除椒盐噪声;二是采用白盒处理,采用数据增强的方法,对图像进行数据增强,增加椒盐噪声。
- 信噪比:信噪比(SNR)是指信号与噪声的比值,即信噪比越高,则噪声的影响越小,信号的影响越大。信噪比越高,图像的质量越好。
class AddPepperNoise(object):"""增加椒盐噪声Args:snr (float): Signal Noise Ratep (float): 概率值,依概率执行该操作"""def __init__(self, snr, p=0.9):assert isinstance(snr, float) or (isinstance(p, float))self.snr = snrself.p = pdef __call__(self, img):"""Args:img (PIL Image): PIL ImageReturns:PIL Image: PIL image."""if random.uniform(0, 1) < self.p:img_ = np.array(img).copy()h, w, c = img_.shapesignal_pct = self.snrnoise_pct = (1 - self.snr)mask = np.random.choice((0, 1, 2), size=(h, w, 1), p=[signal_pct, noise_pct/2., noise_pct/2.])mask = np.repeat(mask, c, axis=2)img_[mask == 1] = 255 # 盐噪声img_[mask == 2] = 0 # 椒噪声return Image.fromarray(img_.astype('uint8')).convert('RGB')else:return img
微语录:自己有了光芒才配得上自己追逐的星星。