pytorch日积月累6-pytorch数据预处理机制
1.1概述
torchvision.transforms
: 常用的图像预处理方法torchvision.datasets
: 常用数据集的dataset实现,MNIST,CIFAR-10,ImageNet等torchvision.model
: 常用的模型预训练,AlexNet,VGG, ResNet,GoogLeNet等
torchvision.transforms
: 常用的图像预处理方法:数据中心化,数据标准化,缩放,裁剪,旋转,翻转,填充,噪声添加,灰度变换,线性变换,仿射变换,亮度、饱和度及对比度变换。
示例:
1 | train_transform = transforms.Compose([ |
transforms.Normalize
- 功能:逐channel的对图像进行标准化
output = (input - mean) / std
1 | transforms.Normalize(mean, #各通道的均值 |
数据增强
数据增强又称为数据增广,数据扩增,它是对训练集进行变换,使训练集更丰富,从而让模型更具泛化能力。
1.2剪裁
1.transforms.CenterCrop
- 功能:从图像中心裁剪图片
size
:所需裁剪图片尺寸
1 | train_transform = transforms.Compose([ |
2.transforms.RandomCrop
功能:从图片中随机裁剪出尺寸为size的图片
padding_mode
:填充模式,有4种模式constant
:像素值由fill设定edge
:像素值由图像边缘像素决定reflect
:镜像填充,最后一个像素不镜像,eg:[1,2,3,4] → [3,2,1,2,3,4,3,2]symmetric
:镜像填充,最后一个像素镜像,eg:[1,2,3,4] → [2,1,1,2,3,4,4,3]
padding
:设置填充大小- 当为a时,上下左右均填充a个像素
- 当为(a,b)时,上下填充b个像素,左右填充a个像素
- 当为(a,b,c,d)时,左上右下填充abcd
fill
:constant时,设置填充的像素值,可以设置其他的RGB值pad_if_needed
:若图像小于设定size,则填充
1 | transforms.RandomCrop(size,#所需裁剪图片尺寸 |
1 | train_transform = transforms.Compose([ |
transforms.RandomResizedCrop()
功能:随机大小,长宽比裁剪图片:
size
:所需裁剪图片尺寸scale
:随机裁剪面积比例, 默认(0.08, 1)ratio
:随机长宽比,默认(3/4, 4/3)interpolation
:插值方法PIL.Image.NEAREST
PIL.Image.BILINEAR
PIL.Image.BICUBIC
1 | RandomResizedCrop(size, |
1 | train_transform = transforms.Compose([ |
4.transforms.FiveCrop
- 功能:在图像的上下左右以及中心裁剪出尺寸为size的5张图片
TenCrop
对这5张图片进行水平或者垂直镜像获得10张图片size
:所需裁剪图片尺寸vertical_flip
:是否垂直翻转
1 | transforms.FiveCrop(size) |
1 | train_transform = transforms.Compose([ |
1.3翻转
1.RandomHorizontalFlip
和RandomVerticalFlip
- 功能:依概率水平(左右)或垂直(上下)翻转图片
- p:翻转概率
1 | RandomHorizontalFlip(p=0.5) |
1 | train_transform = transforms.Compose([ |
2.RandomRotation
- 功能:随机旋转图片
degrees
:旋转角度- 当为a时,在(-a,a)之间选择旋转角度
- 当为(a, b)时,在(a, b)之间选择旋转角度
resample
:重采样方法expand
:是否扩大图片center
:默认为中心旋转,也可以设置左上角旋转
1 | RandomRotation(degrees, |
1 | train_transform = transforms.Compose([ |
1.4图像变换
1.transforms.Pad()
功能:对图片边缘进行填充
padding
:设置填充大小- 当为a时,上下左右均填充a个像素
- 当为(a, b)时,上下填充b个像素,左右填充a个像素
- 当为(a, b, c, d)时,左,上,右,下分别填充a, b, c, d
padding_mode
:填充模式,有4种模式,constant、edge、reflect和symmetricfill
:constant时,设置填充的像素值,(R, G, B) or (Gray)
1 | transforms.Pad(padding, |
1 | transforms.Pad(padding=32, fill=(255, 0, 0), padding_mode='constant'), |
2.transforms.ColorJitter
功能:调整亮度,对比度,饱和度和色相
- 功能:调整亮度、对比度、饱和度和色相
hue
:色相参数- 当为a时,从[-a, a]中选择参数,注: 0<= a <= 0.5
- 当为(a, b)时,从[a, b]中选择参数,注:-0.5 <= a <= b <= 0.5
brightness
:亮度调整因子- 当为a时,从[max(0, 1-a), 1+a]中随机选择
- 当为(a, b)时,从[a, b]中随机选择
contrast
:对比度参数,同brightnesssaturation
:饱和度参数,同brightness
1 | transforms.ColorJitter(brightness=0, |
1 | transforms.ColorJitter(brightness=0.5), |
3.Grayscale
和RandomGrayscale
- 功能:依概率将图片转换为灰度图
num_ouput_channels
:输出通道数,只能设1或3p
:概率值,图像被转换为灰度图的概率
1 | RandomGrayscale(num_output_channels, |
4.RandomAffine
功能:对图像进行仿射变换,仿射变换是二维的线性变换,由五种基本原子变换构成,分别是旋转、平移、缩放、错切和翻转。
degrees
:旋转角度设置translate
:平移区间设置,如(a, b), a设置宽(width),b设置高(height)- 图像在宽维度平移的区间为
scale
:缩放比例(以面积为单位)fill_color
:填充颜色设置shear
:错切角度设置,有水平错切和垂直错切- 若为,则仅在x轴错切,错切角度在之间
- 若为,则a设置x轴角度,b设置y的角度
- 若为,则a, b设置x轴角度,c, d设置y轴角度
resample
:重采样方式,有NEAREST
、BILINEAR
、BICUBIC
1 | RandomAffine(degrees, |
1 | transforms.RandomAffine(degrees=30), |
5.RandomErasing
功能:对图像进行随机遮挡
p
:概率值,执行该操作的概率scale
:遮挡区域的面积ratio
:遮挡区域长宽比value
:设置遮挡区域的像素值,(R, G, B) or (Gray)
1 | RandomErasing(p=0.5, |
1 | #随机遮挡是在张量上操作,而不是PIL文件 |
transforms.Lambda
功能:用户自定义lambda方法
- lambd:lambda匿名函数
transforms.Lambda(lambd)
lambda [arg1 [,arg2, … , argn]] : expression
1 | transforms.TenCrop(200, vertical_flip=True), |
1.5transform选择操作
transforms.RandomChoice
功能:从一系列transforms方法中随机挑选一个
1
transforms.RandomChoice([transforms1, transforms2, transforms3])
transforms.RandomApply
功能:依据概率执行一组transforms操作
1
transforms.RandomApply([transforms1, transforms2, transforms3], p=0.5)
transforms.RandomOrder
功能:对一组transforms操作打乱顺序
1
transforms.RandomOrder([transforms1, transforms2, transforms3])
1 | #1 RandomChoice |
1.6自定义transforms
自定义transforms要素:
- 仅接收一个参数,返回一个参数
- 注意上下游的输出与输入
1 | class Compose(object): |
通过类实现多参数输入:
1 | class YourTransforms(object): |
- 椒盐噪声椒盐噪声又称为脉冲噪声,是一种随机出现的白点或者黑点, 白点称为盐噪声,黑色为椒噪声。
- 信噪比(Signal-Noise Rate, SNR)是衡量噪声的比例,图像中为图像像素的占比。
1 | class AddPepperNoise(object): |
1 | class AddPepperNoise(object): |
1 | train_transform = transforms.Compose([ |
1.7总结
数据增强原则:让训练集与测试集更接近
• 空间位置:平移
• 色彩:灰度图,色彩抖动
• 形状:仿射变换
• 上下文场景:遮挡,填充