05.transforms图像增强


本课程来自深度之眼deepshare.net,部分截图来自课程视频。

内容概要

任务名称:学习二十二种transforms数据预处理方法;学会自定义transforms方法
任务简介:pytorch提供了大量的transforms预处理方法,在这里归纳总结为四大类共二十二种方法进行一一学习;学会自定义transforms方法以兼容实际项目;
详细说明:
本节第一部分介绍transforms方法中的裁剪、翻转和旋转,共8种方法,同时介绍如何将输入进模型的数据进行反transforms操作,变为可以可视化的图片;
本节第二部分介绍transforms中的8种图像变换,3种transforms方法的选择方法;除了pytorch提供的预处理方法,还教大家自定义transforms方法,先通过熟悉transforms的运行机制,总结自定义transforms方法的注意事项,然后制定自定义transforms方法的基本结构,最后通过椒盐噪声的transforms实例来学习自定义transforms方法

数据增强Data Augmentation

数据增强又称为数据增广,数据扩增,它是对训练集进行变换,使训练集更丰富,从而让模型更具泛化能力。
例子:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

transforms——裁剪

1.transforms.CenterCrop

功能:从图像中心裁剪图片
·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(就是黑色)
在这里插入图片描述

2.transforms.RandomCrop

功能:从图片中随机裁剪出尺寸为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)填充红色

3.RandomResizedCrop

功能:随机大小、长宽比裁剪图片
·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

4.FiveCrop

功能:在图像的上下左右以及中心裁剪出尺寸为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)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.TenCrop

功能:TenCrop对FiveCrop得到的5张图片进行水平或者垂直镜像获得10张图片
·size:所需裁剪图片尺寸
·vertical_flip:是否垂直翻转

transforms——翻转和旋转

transforms——Flip

1.RandomHorizontalFlip
2.RandomVerticalFlip
功能:依概率水平(左右)或垂直(上下)翻转图片
·p:翻转概率通常设置为0.5,如果设置为1则一定会翻转

RandomHorizontalFlip(p=0.5)
RandomVerticalFlip(p=0.5)

3.RandomRotation

功能:随机旋转图片
·degrees:旋转角度当为a时,在(-a,a)之间选择旋转角度当为(a,b)时,在(a,b)之间选择旋转角度
·resample:重采样方法
·expand:是否扩大图片,以保持原图信息,以中心旋转图片后四个角落会超出原图的范围,需要扩大才能保持原图信息。(以别的地方为中心旋转图片expand不可用)
左边是expand为false,右边为true
在这里插入图片描述
center设置为0.0(左上角为中心)来旋转。
在这里插入图片描述

transforms——图像变换

1.Pad

功能:对图片边缘进行填充
·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

功能:调整亮度、对比度、饱和度和色相
·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

3.Grayscale&4.RandomGrayscale

Grayscale是RandomGrayscale的一个特例(概率为1)
功能:依概率将图片转换为灰度图
·num_ouput_channels:输出通道数只能设1或3
·p:概率值,图像被转换为灰度图的概率

5.RandomAttine

功能:对图像进行仿射变换,仿射变换是二维的线性变换,由五种基本原子变换构成,分别是旋转、平移、缩放、错切和翻转
·degrees:旋转角度设置
·translate:平移区间设置,如(a,b),a设置宽(width),b设置高(height)
图像在宽维度平移的区间为-img_widtha<dx<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

6.RandomErasing

功能:对图像进行随机遮挡
·p:概率值,执行该操作的概率
·scale:遮挡区域的面积
·ratio:遮挡区域长宽比
·value:设置遮挡区域的像素值,(R,G,B)or(Gray)如果value设置的是任意一个字符串,那么填充就是随机的rgb噪声
参考文献:《Random Erasing Data Augmentation》
下面例子左边是原图:
在这里插入图片描述

7.transforms.Lambda

功能:用户自定义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])),

transforms—transforms方法操作

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])

自定义transforms方法

自定义transforms要素(限制):

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,12),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')
		elsereturn img

transforms方法总结

一、裁剪
·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元了。
在这里插入图片描述

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

oldmao_2000

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值