当前位置: 代码迷 >> 综合 >> 数据预处理-transform[ToTensor,Normalizer]
  详细解决方案

数据预处理-transform[ToTensor,Normalizer]

热度:49   发布时间:2023-12-24 16:07:56.0

https://www.lizenghai.com/archives/46484.html?btwaf=28833990

常用的数据预处理方法:

torchvision.transforms:提升泛化能力

  • 包括:数据中心化、数据标准化、缩放、裁剪、旋转、翻转、填充、噪声添加、灰度变换、线性变换、仿射变换、亮度、饱和度及对比度变换等

数据标准化

  • transforms.Normalize()

  • 功能:逐channel的对图像进行标准化(均值变为0,标准差变为1),可以加快模型的收敛
    • output = (input – mean) / std
    • mean:各通道的均值
    • std:各通道的标准差
    • inplace:是否原地操作

transforms.ToTensor()

说的是ToTesnor会,而且将数据归一化到均值为0,方差为1(是将数据除以255),那么归一化后为什么还要接一个Normalize()呢?
Normalize()是对数据按通道进行标准化,即减去均值,再除以方差

数据如果分布在(0,1)之间,可能实际的bias,就是神经网络的输入b会比较大,而模型初始化时b=0的,这样会导致神经网络收敛比较慢,经过Normalize后,可以加快模型的收敛速度。
因为对RGB图片而言,数据范围是[0-255]的,需要先经过ToTensor除以255归一化到[0,1]之后,再通过Normalize计算过后,将数据归一化到[-1,1]。

那transform.Normalize()是怎么工作的呢?以上面代码为例,ToTensor()能够把灰度范围从0-255变换到0-1之间,而后面的transform.Normalize()则把0-1变换到(-1,1).具体地说,对每个通道而言,Normalize执行以下操作:

image=(image-mean)/std

其中mean和std分别通过(0.5,0.5,0.5)和(0.5,0.5,0.5)进行指定。原来的0-1最小值0则变成(0-0.5)/0.5=-1,而最大值1则变成(1-0.5)/0.5=1.

transforms——裁剪

  1. transforms.CenterCrop

    • 功能:从图像中心裁剪图片
    • size:所需裁剪图片尺寸
  2. transforms.RandomCrop

    • 功能:从图片中随机裁剪出尺寸为size的图片
    • size:所需裁剪图片尺寸
    • padding:设置填充大小。当为a时,上下左右均填充a个像素,当为(a,b)时,上下填充b个像素,左右填充a个像素。当为(a,b,c,d)时,左上右下分别填充abcd
    • pad_if_need:若图像小于设定size,则填充
    • padding_mode:填充模式:(1)constant像素值由fill设定(默认模式);(2)edge像素值由图像边缘像素决定(3)reflect镜像填充,最后一个像素不镜像,eg,[1,2,3,4]->[3,2,1,2,3,4,3,2];(4)symmetric镜像填充,最后一个像素镜像,eg,[1,2,3,4]->[2,1,1,2,3,4,4,3]
    • fill:constant时,设置填充的像素值
  3. RandomResizedCrop

    • 功能:随机大小、长宽比裁剪图片
    • size:所需裁剪图片尺寸
    • scale:随机裁剪面积比例,默认(0.08,1)
    • ratio:随机长宽比,默认(3/4,4/3)
    • interpolation:插值方法,PIL.Image.NEAREST最近邻,PIL.Image.BILINEAR双线性,PIL.Image.BICUBIC
  4. FiveCrop

    • 在图片的左上角、左下角、右上角、右下角和中心裁剪出尺寸为size的5张图片
    • size:所需裁剪图片尺寸
    • 注意:返回的数据为tuple格式,需要转换为张量形式或者PIL.Image形式
  5. TenCrop

    • 在图像的上下左右以及中心裁剪出尺寸为size的5张图片,TenCrop对着5张图片进行水平或者垂直镜像获得10张图片
    • size:所需裁剪图片尺寸
    • vertical_flip:是否垂直翻转

transforms——翻转和旋转

  1. RandomHorizontalFlip水平翻转

    • p:翻转概率
  2. RandomVerticalFlip垂直翻转

    • p:翻转概率
  3. RandomRotation

    • 功能:随机旋转图片
    • degrees:旋转角度。当为a时,在(-a, a)之间选择旋转角度;当为(a, b)时,在(a, b)之间选择旋转角度
    • resample:重采样方法,一般不需要设置,使用默认值
    • expand:是否扩大图片,以保持原图信息
    • center:旋转点设置,默认中心旋转。如果设置为(0,0),则为左上角旋转


      在这里插入图片描述

4.1 图像变换

  1. Pad

    • 功能:对图片边缘进行填充
    • padding:设置填充大小。当为a时,上下左右均填充a个像素,当为(a,b)时,上下填充b个像素,左右填充a个像素。当为(a,b,c,d)时,左上右下分别填充abcd
    • padding_mode:填充模式。(1)constant像素值由fill设定(默认模式);(2)edge像素值由图像边缘像素决定(3)reflect镜像填充,最后一个像素不镜像,eg,[1,2,3,4]->[3,2,1,2,3,4,3,2];(4)symmetric镜像填充,最后一个像素镜像,eg,[1,2,3,4]->[2,1,1,2,3,4,4,3]
    • fill:constant时,设置填充的像素值,(R, G, B)或者(Gray)
  2. ColorJitter

    • 功能:调整亮度、对比度、饱和度和色相
    • brightness:亮度调整因子。当为a时,从[max(0, 1-1), 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

    • 是RandomGrayscale的特例,概率为1。
  4. RandomGrayscale

    • 功能:依概率将图片转换为灰度图
    • num_output_channels:输出通道数,只能设1或3
    • p:概率值,图像被转换为灰度图的概率


      在这里插入图片描述

  5. RandomAffine

    • 功能:对图像进行仿射变换,仿射变换是二维的线性变换,由五种基本原子变换构成,分别是旋转、平移、缩放、错切和翻转。
    • degrees:旋转角度设置
    • translate:平移区间设置,如(a, b),a设置宽(width),b设置高(height),图像在宽维度平移的区间为-img_width * a < dx < img_width * a
    • scale:缩放比例(以面积为单位),0到1之间
    • fill_color:填充颜色设置,默认为黑色(0)
    • shear:错切角度设置,有水平错切和垂直错切。若为a,则仅在x轴错切,错切角度在(-a,a)之间;若为(a,b),则a设置x轴角度,b设置y的角度;若为(a,b,c,d),则a,b设置x轴角度,c,d设置y轴角度
    • resample:重采样方式,有NEARSET,BILINEAR,BICUBIC


      在这里插入图片描述

  6. RandomErasing

    • 功能:对图像进行随机遮挡
    • p:概率值,执行该操作的概率
    • scale:遮挡区域的面积
    • ratio:遮挡区域长宽比
    • value:设置遮挡区域的像素值,(R,G,B)或(Gray)。如果value值设置为字符串,则填充随机的像素


      在这里插入图片描述


      在这里插入图片描述

  7. transforms.Lambda

    • 功能:用户自定义lambda方法
    • lambd:lambd:lambda匿名函数 lambda [arg1 [, arg2, …, argn]] : expression


      在这里插入图片描述

4.2 transforms方法操作

  1. transforms.RandomChoice

  2. 功能:从一系列transforms方法中随机挑选一个
transforms.RandomChoice([transforms1, transforms2, transforms3])
  1. transforms.RandomApply

  2. 功能:依据概率执行一组transforms操作

transforms.RandomApply([transforms1, transforms2, transforms3], p=0.5)
  1. transforms.RandomOrder

    • 功能:对一组transforms操作打乱顺序
transforms.RandomOrder([transforms1, transforms2, transforms3])

4.3 自定义transforms方法


在这里插入图片描述

transforms方法是在Compose类的call方法中被调用的,对一组transforms方法进行for循环,每次循序的挑选并执行transforms方法

  • 自定义transforms要素:
    1. 仅接收一个参数,返回一个参数
    2. 注意上下游的输出和输入,数据类型必须匹配

通过类实现多参数传入,下图为自定义transforms的基本参数,一个init,一个call


在这里插入图片描述

  • 椒盐噪声

    • 椒盐噪声又称为又称为脉冲噪声,是一种随机出现的白点或者黑点,白点称为盐噪声,黑点称为椒噪声。
    • 信噪比(SNR):衡量噪声的比例,图像中为图像像素的占比
      下图为不同信噪比的椒盐噪声效果图:


      在这里插入图片描述

class AddPepperNoise(object):def __init__(self, snr, p):self.snr = snrself.p = pdef __call__(self, img):'''添加椒盐噪声具体实现过程'''return img

5. 数据增强策略


在这里插入图片描述

  • 原则:让训练集与测试集更接近
    • 空间位置:平移
    • 色彩:灰度图,色彩抖动
    • 形状:仿射变换
    • 上下文场景:遮挡,填充