Pytorch:transforms二十二种数据预处理方法及自定义transforms方法

摘要:
数据增强转换是Pytorch中用于数据增强的模块。首先,简要描述数据增强的概念:数据增强也称为数据增强、数据放大,是对训练集进行转换以丰富训练集,使模型能够基于泛化能力给出非常生动的示例。相信大家都知道,五年高考和三年模拟其实是一种学习模式,其中三年模拟试题是关于数据增强的。使用各种特定方法裁剪croptransforms.CenterCrop。功能是从图像中心裁剪图像大小

数据增强

transforms是pytorch中用于数据增强的模块,首先再简单描述下数据增强的概念:

数据增强又称为数据增广,数据扩增,它是对训练集进行变换,使训练集更丰富,从而让模型根据泛化能力

举个非常生动形象的例子,五年高考三年模拟相信大家都知道,其实这就是一个学习模型,其中的三年模拟试题就是数据增强

Pytorch:transforms二十二种数据预处理方法及自定义transforms方法第1张

具体的各类方法

裁剪 crop

transforms.CenterCrop

功能:从图像中心裁剪图片

size:所需裁剪的图片尺寸(如果size比原来的图尺寸大,则会在原图周围填充黑色带至此size)

Pytorch:transforms二十二种数据预处理方法及自定义transforms方法第2张    或者   Pytorch:transforms二十二种数据预处理方法及自定义transforms方法第3张

transforms.RandomCrop

功能:从图片中随机裁剪出尺寸为size的图片

size:所需裁剪图片尺寸

padding:设置填充大小

  • 当为a时,上下左右均填充a个像素
  • 当为(a,b)时,上下填充b个像素,左右填充a个像素
  • 当为(a,b,c,d)时,左上右下各填充a、b、c、d个像素

pad_if_need:若图像小于设定size,则填充

padding_mode:填充模式,有4种模式

  1. constant:像素值由fill设定
  2. edge:像素值由图像边缘像素决定
  3. reflect:镜像填充,最后一个像素不镜像
  4. symmetric:镜像填充,最后一个像素镜像

fill:constant时,设置填充的像素值

transforms.RandomResizedCrop

功能:随机大小、长宽比裁剪图片

size:所需裁剪图片

scale:随机裁剪面积比例,默认(0.08, 1)

ratio:随机长宽比,默认(3/4, 4/3)

interpolation:插值方法

  • PIL.Image.NERAREST
  • PIL.Image.BILINEAR
  • PIL.Image.BICUBIC

transforms.FiveCrop

transforms.TenCrop

功能:在图像的上下左右以及中心裁剪出尺寸为size的5张图片,

           TenCrop对这5张图片进行水平或者垂直镜像获得10张图片

size:所需裁剪图片尺寸

vertical_filp:是否垂直翻转(TenCrop)

翻转和旋转  flip and rotation

transforms.RandomHorizontalFlip

transforms.RandomVerticalFlip

功能:依概率水平(左右)或垂直(上下)翻转图片

p:翻转概率

transforms.RandomRotation

功能:随机旋转图片

degrees:旋转角度

  • 当为a时,在(-a, a)之间选择旋转角度
  • 当为(a, b)时,在(-a, b)之间选择旋转角度

resample:重采样方法

expand:是否扩大图片,以保持原来所有的图片信息(注意:如果使用expand,会扩大原来的图片size,当处理的batch_size不为1时,无法将之后图片统一形成batch,所以使用后,需要resize成原来的大小

center:旋转点设置,默认中心旋转

图像变换 image transforms

transforms.Pad

功能:对图像边缘进行填充

padding:设置填充大小

  • 当为a时,上下左右均填充a个像素
  • 当为(a,b)时,上下填充b个像素,左右填充a个像素
  • 当为(a,b,c,d)时,左上右下各填充a、b、c、d个像素

padding_mode:填充模式,有4种模式

  1. constant:像素值由fill设定
  2. edge:像素值由图像边缘像素决定
  3. reflect:镜像填充,最后一个像素不镜像
  4. symmetric:镜像填充,最后一个像素镜像

fill:constant时,设置填充的像素值,(R,G,B)or (Gray)【可以理解为用具体数值表示的color】

transforms.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

transforms.Grayscale

transforms.RandomGrayscale

功能:依概率将图像转换为灰度图

num_output_channels:输出通道数,只能设1或3

p:图像转为灰度图的概率,Grayscale即为RandomGrayscale的p为1时

transforms.RandomAffine

功能:对图像进行仿射变换。仿射变换是二维的线性变换,由五种基本原子构成,分别是旋转、平移、缩放、错切翻转

degrees:旋转角度设置

translate:平移区间设置,如(a, b),a设置宽(width),b设置高(height),图像在宽维度平移的区间为±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:重采样方式,即三类插值方式

transforms.Erasing

功能:对图像进行随机的遮挡,注意:输入对象为Tensor而不是PIL,需先使用ToTensor()

p:执行该操作的概率

scale:遮挡区域的面积

ratio:遮挡区域的长宽比

value:设置遮挡区域的像素值(颜色),(R,G,B)或(Gray)而且此时对象为tensor,所以应该设置归一化值;如果设置value的值为字符串,则遮挡区域的颜色会变成彩色(雪花屏)

(具体算法可见论文《Data Augmentation Random Erasing》)

transforms.Lambda

功能:用户自定义lambda方法,用于简单实现函数功能

lambd:填写lambda匿名函数表达式

格式:lambda [arg1 arg2... argn] :expression   (arg为input,expression为进行的处理)

对transform方法的操作

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方法

从compose源码中可以得到,transforms有一些固定的收参与格式:

Pytorch:transforms二十二种数据预处理方法及自定义transforms方法第4张

1.仅接受一个参数,返回一个参数

2.注意上下游的输出和输入

通过类实现多参数传入,下为自定义方法的基本结构:

Pytorch:transforms二十二种数据预处理方法及自定义transforms方法第5张

其中init函数指定需要的参数,如概率、信噪比等等,call函数就是调用时,所执行的具体操作

下面以椒盐噪声的transforms方法自定义实现来为例:

椒盐噪声又称脉冲噪声,是一种随机出现的白点或黑点,白点称为盐噪声,黑点称为椒噪声

其主要参数有信噪比(signal-noise rate,SNR),用以衡量噪声的比例,在图像中为图像像素的占比

Pytorch:transforms二十二种数据预处理方法及自定义transforms方法第6张

由上述模板可以构建函数思路:

Pytorch:transforms二十二种数据预处理方法及自定义transforms方法第7张

附上代码可进一步理解

class AddPepperNoise(object):
    """增加椒盐噪声
    Args:
        snr (float): Signal Noise Rate
        p (float): 概率值,依概率执行该操作
    """

    def __init__(self, snr, p=0.9):
        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.array(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=[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

总之,数据增强是为了使得训练集更好的接近测试集,针对测试集的一些特点或是易混点来选择有效的transforms方法加以突出或是消除,以达到更好的结果。

一个简单例子,原模型的训练数据为第四套一元和一百元RMB,而现在测试的是第五套一百元人民币,如果不加变换,大概率会识别成一元,因为第四套一元和第五套一百元颜色很接近。这时如果做一个灰度变换,测试结果就会识别正确,判定为100元。

免责声明:文章转载自《Pytorch:transforms二十二种数据预处理方法及自定义transforms方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇PHP 之sha256 sha512封装流程图中的图形的含义下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

爬虫和数据

一为什么要做爬虫? 首先请问:都说现在是"大数据时代",那数据从何而来? 企业产生的用户数据:百度指数:http://index.baidu.com/阿里指数:https://alizs.taobao.com/TBI腾讯浏览指数:http://tbi.tencent.com/新浪微博指数:http://data.weibo.com/index 数...

【转】使用Apache Kylin搭建企业级开源大数据分析平台

http://www.thebigdata.cn/JieJueFangAn/30143.html  本篇文章整理自史少锋4月23日在『1024大数据技术峰会』上的分享实录:使用Apache Kylin搭建企业级开源大数据分析平台。   正文如下   我先做一个简单介绍我叫史少锋,我曾经在IBM、eBay做过大数据、云架构的开发,现在是Kyligence的技...

谁说菜鸟不会数据分析

谁说菜鸟不会数据分析 张文霖, 刘夏璐, 狄松编著 ISBN 978-7-121-13587-3 2011年7月出版 定价:59.00元 16开 308页 像小说一样通俗易懂的数据分析教程 15位业内专家的鼎力推荐 您的职场加油站 内容简介 很多人看到数据分析就望而却步,担心门槛高,无法迈入数据分析的门槛。本书在降低学习难度方面做了大量的尝试:基于通用...

pymysql模块:执行数据操作,pymysql.err.InternalError: (1054, "Unknown column '' in 'field list'")

sql语句出错 sql = "INSERT INTO table1(word) VALUES (%s)" % (str) 改为 "INSERT INTO table1(word) VALUES ('%s')" % (str) 只要是values里面的值,都需要加“”...

数据类型后面加问号是什么意思?

在做.net开发的时候,我就看到这么个类型的一段代码: public double? AskLeave  {    get;   set;  }    ,总是想不通,为什么要加上问号,现在我知道了,原因是: double 类型的属性默认是不能赋值null,如果加上了问号 那么就是可以赋值为null了,其实是实现了 nullabl 接口,以此类推,那么其他数...

初识大数据(三. Hadoop与MPP数据仓库)

  MPP代表大规模并行处理,这是网格计算中所有单独节点参与协调计算的方法。 是将任务并行的分散到多个服务器和节点上,在每个节点上计算完成后,将各自部分的结果汇总在一起得到最终的结果。 MPP DBMS是建立在这种方法之上的数据库管理系统。在这些系统中的每个查询都会被分解为由MPP网格的节点并行执行的一组协调进程,它们的运行时间比传统的SMP RDBMS系...