transforms——图像变换
1、Pad
transforms.Pad(padding, fill=0, padding_mode='constant')
功能:对图像边缘进行填充
- padding:设置填充大小
- 当为a时,上下左右均填充a个像素
- 当为(a,b)时,上下填充b个像素,左右填充a个像素
- 当为(a,b,c,d)时,左上右下分别填充a,b,c,d
- padding_mode:填充模式,有4种模式,constant、edge、reflect和symmetric
- fill:constant时,设置填充的像素值,(R,G,B)or(Gray)
2、ColorJitter
transforms.ColorJitter(brightness=0, contrast=0,saturation=0, hue=0)
功能:调整亮度、对比度、饱和度和色相
- brightness: 亮度调整因子
当为a时,从[max(0, 1-a), 1+a]中随机选择
当为(a,b)时,从[a,b]中随机选择 - contrast:对比度参数,同brightness
- saturation:饱和度参数,同brightnes
- hue:色相参数,当为a时,从[-a, a]中选择参数,注:0<=a<=0.5
当为(a, b)时,从[a,b]中选择参数,注:-0.5<=a<=b<=0.5
3、Grayscale
4、RandomGrayscale
RandomGrayscale(num_output_channels, p=0.1)
Grayscale:(num_output_channels)
功能:依概率将图片转换为灰度图
- num_output_channels:输出通道数只能设1或3
- p:概率值,图像被转换为灰度图的概率
5、RandomAffine
RandomAffine(degrees, translate=None, scale=None, shear=None, resample=False, fillcolor=0)
功能:对图像进行仿射变换,仿射变换是二维的线性变换,由五种基本原子变换构成,分别是旋转、平移、缩放、错切和翻转
- degrees:旋转角度设置
- translate:平移区间设置,如(a,b),a设置宽(width),b设置高(height)图像在宽维度平移的区间为 -img_width * a < dx <img_width * a
- scale:缩放比例(以面积为单位)
- fill_color: 填充颜色设置
- shear: 错切角度设置,有水平错切和垂直错切。若为a,则仅在x轴错切,错切角度在(-a,a)之间,若为(a,b)则a设置x轴角度,b设置y轴的角度,若为(a,b,c,d),则a,b设置x轴角度,c,d设置y轴角度
- resample: 重采样方式,有NEAREST,BILINEAR,BICUBIC
6、RandomErasing
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)or(Gray)
transforms.Lambda
transforms.Lambda(lambd)
功能:用户自定义lambda方法
- lambd:lambda匿名函数
lambda[arg1[, arg2, …, argn]]:expression
transforms——transforms方法操作
transforms.RandomChoice
功能:从一系列transforms方法中随机挑选一个
transforms.RandomChoice([transforms1, transforms2, transforms3])
transforms.RandomApply
功能:依据概率执行一组transforms操作
transforms.RandomApply([transforms1, transforms2, transforms3], p=0.5)
transforms.RandomOrder
功能:对一组transforms操作打乱顺序
transforms.RandomOrder([transforms1, transforms2, transforms3])
自定义transforms方法
自定义transforms要素:
class Compose(object):
def __call__(self, img):
for t in self.transforms:
img = t(img)
return img
1、仅接收一个参数,返回一个参数
2、注意上下游的输出与输入,当前transforms的输入是上一个transforms的输出,所以要注意数据类型的匹配
通过类实现多参数传入:
class YourTransforms(object):
def __init__(self, ...):
...
def __call__(self, img):
...
return img
椒盐噪声
椒盐噪声又称为脉冲噪声,是一种随机出现的白点或者黑点,白点称为盐噪声,黑色为椒噪声
信噪比(Signal-Noise Rate, SNR)是衡量噪声的比例,图像中为图像像素的占比
class AddPepperNoise(object):
def __init__(self, snr, p):
assert isinstance(snr, float) or (isinstance(p, float))
self.snr = snr
self.p = p
def __call__(self, img):
'''
Args:
img(PIL Image):PIL Image
Returns:
PIL Image: PIL Image
'''
if random.uniform(0, 1) < self.p:
img_ = np.arrayZ(img).copy()
h, w, c = img.shape
signal_pct = self.snr
noise_pct = (1 - self.snr)
mask = np.random.choice((0, 1, 2), size=(h, w, 1), p=[sigmal_pct, noise_pct])
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
return img
数据增强实战
原则: 让训练集与测试集更接近
- 空间位置:平移
- 色彩:灰度图,色彩抖动
- 形状:仿射变换
- 上下文场景:遮挡,填充