任务名称:学习二十二种transforms数据预处理方法;学会自定义transforms方法
任务简介:pytorch提供了大量的transforms预处理方法,在这里归纳总结为四大类共二十二种方法进行一一学习;学会自定义transforms方法以兼容实际项目;
详细说明:
本节第一部分介绍transforms方法中的裁剪、翻转和旋转,共8种方法,同时介绍如何将输入进模型的数据进行反transforms操作,变为可以可视化的图片;
本节第二部分介绍transforms中的8种图像变换,3种transforms方法的选择方法;除了pytorch提供的预处理方法,还教大家自定义transforms方法,先通过熟悉transforms的运行机制,总结自定义transforms方法的注意事项,然后制定自定义transforms方法的基本结构,最后通过椒盐噪声的transforms实例来学习自定义transforms方法
数据增强又称为数据增广,数据扩增,它是对训练集进行变换,使训练集更丰富,从而让模型更具泛化能力。
例子:
功能:从图像中心裁剪图片
·size:所需裁剪图片尺寸
下面是将一张224224的图片CenterCrop为196196的例子
下面是把transform的结果转回图片并显示的代码:
img_tensor=inputs[e,..]# CHW
img=transform_invert(img tensor, train_transform)
plt. imshow(img)
主要是要反向normlize(乘均值加上方差),然后变换通道:CHW–HWC,然后将0~1范围的数据映射到0 ~ 255范围(就是直接乘255),然后根据通道数量分别转化为RGB图像或者灰度图像。
下面是将一张224224的图片CenterCrop为512512的时候就会自动padding 0(就是黑色)
功能:从图片中随机裁剪出尺寸为size的图片(不是从中心计算)
·size:所需裁剪图片尺寸
·padding:设置填充大小
当为a时,上下左右均填充a个像素
当为(a,b)时,上下填充b个像素,左右填充a个像素
当为(a,b,c,d)时,左,上,右,下分别填充a,b,c,d
·pad_if_need:若图像小于设定size,则填充,此时pad_if_need要设置为true,否则会报错。
·padding_mode:填充模式,有4种模式
1、constant:像素值由fill设定(第五个参数)
2、edge:像素值由图像边缘像素决定
3、reflect:镜像填充,最后一个像素不镜像,eg:[1,2,3,4]>[3,2,1,2,3,4,3,2]这里填充两个像素,可以看到左边的32是镜像的中间23,右边32是镜像中间的23,分别省略了1和4
4、symmetric:镜像填充,最后一个像素镜像,eg:[1,2,3,4]→[2,1,1,2,3,4,4,3],这里不省略1和4
·fill:constant时,设置填充的像素值,还可以设置填充颜色。例如:fill=(255,0,0)填充红色
功能:随机大小、长宽比裁剪图片
·size:所需裁剪图片尺寸
·scale:随机裁剪面积比例,默认(0.08,1)
·ratio:随机长宽比,默认(3/4,4/3),超过这个比例会出现失真
·interpolation:插值方法
PIL.Image.NEAREST 最近邻
PIL.Image.BILINEAR 双线性
PlL.Image.BICUBIC 双三值
transforms.RandomResizedcrop(size=224,scale=(0.5,e.5)),
随机裁剪一半的面积,然后缩放到224
功能:在图像的上下左右以及中心裁剪出尺寸为size的5张图片
返回值是tulpe,不能直接用,要做转化为张量或者PIL image形式。
下面的代码将FiveCrop得到的tulpe做for循环,每次得到的结果进行ToTensor转化,然后把转化后的结果放到一个list当中,然后把list按默认维度堆叠stack起来变成一个张量。
transforms. Fivecrop(112),
transforms. Lambda(lambda crops: torch.stack([(transforms.ToTensor()(crop)) for crop in crops])),
最后得到五维的张量,然后用for循环的显示图片
bs, ncrops,c,h,w=inputs.shape
for n in range(ncrops):
img_tensor=inputs[0,n,.…]# CHW
img=transform_invert(img tensor, train_transform)
plt. imshow(img)
plt. show()
plt. pause(1)
功能:TenCrop对FiveCrop得到的5张图片进行水平或者垂直镜像获得10张图片
·size:所需裁剪图片尺寸
·vertical_flip:是否垂直翻转
1.RandomHorizontalFlip
2.RandomVerticalFlip
功能:依概率水平(左右)或垂直(上下)翻转图片
·p:翻转概率通常设置为0.5,如果设置为1则一定会翻转
RandomHorizontalFlip(p=0.5)
RandomVerticalFlip(p=0.5)
功能:随机旋转图片
·degrees:旋转角度当为a时,在(-a,a)之间选择旋转角度当为(a,b)时,在(a,b)之间选择旋转角度
·resample:重采样方法
·expand:是否扩大图片,以保持原图信息,以中心旋转图片后四个角落会超出原图的范围,需要扩大才能保持原图信息。(以别的地方为中心旋转图片expand不可用)
左边是expand为false,右边为true
center设置为0.0(左上角为中心)来旋转。
功能:对图片边缘进行填充
·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)
功能:调整亮度、对比度、饱和度和色相
·brightness:亮度调整因子
当为a时,从[max(0,1-a),1+a]中随机选择
当为(a,b)时,从[a,b]中
·contrast:对比度参数,同brightness
·saturation:饱和度参数,同brightness
·hue:色相参数,当为a时,从[-a,a]中选择参数,注:0<=a<=0.5
当为(a,b)时,从[a,b]中选择参数,注:-0.5<=a<=b<=0.5
Grayscale是RandomGrayscale的一个特例(概率为1)
功能:依概率将图片转换为灰度图
·num_ouput_channels:输出通道数只能设1或3
·p:概率值,图像被转换为灰度图的概率
功能:对图像进行仿射变换,仿射变换是二维的线性变换,由五种基本原子变换构成,分别是旋转、平移、缩放、错切和翻转
·degrees:旋转角度设置
·translate:平移区间设置,如(a,b),a设置宽(width),b设置高(height)
图像在宽维度平移的区间为-img_widtha
·scale:缩放比例(以面积为单位)
·fill_color:填充颜色设置
·shear:错切角度设置,有水平错切和垂直错切
若为a,则仅在x轴错切,错切角度在(-a,a)之间
若为(a,b),则。设置x轴角度,b设置y的角度
若为(a,b,c,d),则a,b设置x轴角度,c,d设置y轴角度
x轴错切,x轴是平行x轴的
·resample:重采样方式,有NEAREST、BILINEAR、BICUBIC
功能:对图像进行随机遮挡
·p:概率值,执行该操作的概率
·scale:遮挡区域的面积
·ratio:遮挡区域长宽比
·value:设置遮挡区域的像素值,(R,G,B)or(Gray)如果value设置的是任意一个字符串,那么填充就是随机的rgb噪声
参考文献:《Random Erasing Data Augmentation》
下面例子左边是原图:
功能:用户自定义lambda方法
·lambd:lambda匿名函数
lambda[arg1 [,arg2,……,argn]]:expression
例子:
transforms. Tencrop(200, vertical_flip=True),
transforms. Lambda(lambda crops: torch. stack([ transforms. Totensor()(crop) for crop in crops])),
1.transforms.RandomChoice
功能:从一系列transforms方法中随机挑选一个,这里是一个操作
transforms.RandomChoice([transforms1,transforms2,transforms3])
2.transforms.RandomApply
功能:依据概率执行一组transforms操作,这里是一组多个操作
transforms.RandomApply(Ptransforms1,transforms2,transforms3],p=0.5)
3.transforms.RandomOrder
功能:对一组transforms操作打乱顺序,这里是一组多个操作
transforms.RandomOrder([transforms1,transforms2,transforms3])
1.仅接收一个参数,返回一个参数
2.注意上下游的输出与输入
class Compose(object):
def __call__(self, img):
for t in self. transforms:
img=t(img)
return img
椒盐噪声又称为脉冲噪声,是一种随机出现的白点或者黑点,白点称为盐噪声,黑色为椒噪声
信噪比(Signal-Noise Rate,SNR)是衡量噪声的比例,图像中为图像像素的占比
class AddPepperNoise (object):
def __init__ (self,snr,p):
self.snr=snr
self.p=p
def __call__(self,img):
if random.uniform(0,1)<self.p:
img_=np.array(img).copy()
h,w,c=img_.shape
signal_pct=self.snr
noilse_pct=(1-self.snr)#噪声出现概率
mask=np.random.choice((e,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
一、裁剪
·1.transforms.CenterCrop
·2.transforms.RandomCrop
·3.transforms.RandomResizedCrop
·4.transforms.FiveCrop
·5.transforms.TenCrop
二、翻转和旋转
·1.transforms.RandomHorizontalFlip
·2.transforms.RandomVerticalFlip
·3.transforms.RandomRotation
三、图像变换
·1.transforms.Pad
·2.transforms.ColorJitter
·3.transforms.Grayscale
·4.transforms.RandomGrayscale
·5.transforms.RandomAffine
·6.transforms.LinearTransformation
·7.transforms.RandomErasing
·8.transforms.Lambda
·9.transforms.Resize
·10.transforms.Totensor
·11.transforms.Normalize
四、transforms的操作
·1.transforms.RandomChoice
·2.transforms.RandomApply
·3.transforms.RandomOrder
数据增强实战
原则:让训练集与测试集更接近
·空间位置:平移
·色彩:灰度图,色彩抖动
·形状:仿射变换
·上下文场景:遮挡,填充
…
在人民币分类例子中,用第四套人民币进行常规训练后,然后用第五套的100元进行测试,模型会认为第五套的100元是1元,然后在训练模型的时候加入灰度设置,使得模型不再将色彩作为分类的主要依据,再次测试就能够准确的识别第五套100元了。