文章目录

  • 一、数据预处理transforms模块机制
  • 二、二十二种transforms数据预处理方法
    • 2.裁剪
    • 3. 翻转与旋转
    • 4.图像变换
    • 5.transforms方法的选择操作
    • 6.自定义transfroms方法

一、数据预处理transforms模块机制

  torchvision.transforms模块包含了很多图像预处理方法:

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

这个模块可以进行数据增强与数据预处理,增强模型的泛化能力。数据预处理transforms在数据读取过程中,最后生成数据预处理完的batch data。

class RMBDataset(Dataset):def __init__(self, data_dir, transform=None):"""rmb面额分类任务的Dataset:param data_dir: str, 数据集所在路径:param transform: torch.transform,数据预处理"""self.label_name = {"1": 0, "100": 1}self.data_info = self.get_img_info(data_dir)  # data_info存储所有图片路径和标签,在DataLoader中通过index读取样本self.transform = transformdef __getitem__(self, index):path_img, label = self.data_info[index]img = Image.open(path_img).convert('RGB')     # 0~255# 在数据读取的这个节点开始调用transform,迭代使用多种tansform方法if self.transform is not None:img = self.transform(img)   # 在这里做transform,转为tensor等等return img, labeldef __len__(self):return len(self.data_info)@staticmethoddef get_img_info(data_dir):data_info = list()for root, dirs, _ in os.walk(data_dir):# 遍历类别for sub_dir in dirs:img_names = os.listdir(os.path.join(root, sub_dir))img_names = list(filter(lambda x: x.endswith('.jpg'), img_names))# 遍历图片for i in range(len(img_names)):img_name = img_names[i]path_img = os.path.join(root, sub_dir, img_name)label = rmb_label[sub_dir]data_info.append((path_img, int(label)))return data_info

二、二十二种transforms数据预处理方法

2.裁剪

  transforms.CenterCrop
功能:从图像中心裁剪图片

  • size:所需裁剪图片尺寸

  transforms.RandomCrop

transforms.RandomCrop(size,padding=None,pad_if_needed=False,fill=6,padding_mode= 'constant ' )

功能:从图片中随机裁剪出尺寸为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:像素值由filI设定
    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时,设置填充的像素值

  transforms.RandomResizedCrop

RandomResizedCrop(size,scale=(0.08,1.0),ratio=(3/4,4/3),interpolation)

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

  • size:所需裁剪图片尺寸
  • scale :随机裁剪面积比例,默认(0.08,1)
  • ratio:随机长宽比,默认(3/4,4/3)
  • interpolation:插值方法
    PIL.lmage.NEAREST
    PIL.lmage.BILINEAR
    PIL.lmage.BICUBIC

  transforms.FiveCrop

transforms .FiveCrop(size)

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

# 将tuple格式转换为Tensor格式
transforms.FiveCrop(112),
transforms.Lambda(lambda crops: torch.stack([(transforms.ToTensor()(crop)) for crop in crops]))

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

  • size :所需裁剪图片尺寸
  • vertical_flip :是否垂直翻转
transforms.TenCrop(112, vertical_flip=False),
transforms.Lambda(lambda crops: torch.stack([(transforms.ToTensor()(crop)) for crop in crops]))

3. 翻转与旋转

  transforms.RandomHorizontalFlip

transforms.RandomHorizontalFlip(p=0.5)

功能:依概率水平(左右)翻转图片

  • p:翻转概率

  transforms.RandomVerticalFlip

transforms.RandomVerticalFlip(p=0.5)

功能:依概率垂直(上下)翻转图片

  • p:翻转概率

  transforms.RandomRotation

RandomRotation(degrees,resample=False,expand=False,center=None)

功能:随机旋转图片

  • degrees :旋转角度
    当为a时,在(-a,a)之间选择旋转角度
    当为(a,b)时,在(a,b)之间选择旋转角度
  • resample :重采样方法
  • expand :是否扩大图片,以保持原图信息

4.图像变换

  transforms.Pad

transforms.Pad(padding,fill=0,padding_mode= ' constant ' )

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

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

  transforms.colorjitter

transforms.colorJitter(brightness=0,contrast=0,saturation=0,hue=0)

功能:调整亮度、对比度、饱和度和色相

  • 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

Grayscale(num_output_channels)

功能:将图片转换为灰度图

  • num_ouput_channels:输出通道数 只能设1或3

  transforms.RandomGrayscale
功能:依概率将图片转换为灰度图

  • num_ouput_channels:输出通道数 只能设1或3
  • p︰概率值,图像被转换为灰度图的概率

  transforms.RandomAffine

transforms.RandomAffine(degrees,translate=None,scale=None,shear=None ,resample=False,fillcolor=)

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

  • degrees:旋转角度设置
  • translate:平移区间设置
    如(a,b),a设置宽(width),b设置高(height)图像在宽维度平移的区间为
    -img_width * a < dx < 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:重采样方式,有NEAREST 、BILINEAR、BICUBIC

  transforms.RandomErasing

transforms.RandomErasing(p=0.5,scale=(0.02,0.33),ratio=(0.3,3.3),value=0,inplace=False)

功能:对图像进行随机遮挡

  • p:概率值,执行该操作的概率
  • scale:遮挡区域的面积
  • ratio:遮挡区域长宽比
  • value:设置遮挡区域的像素值,(R,G,B) or (Gray)

  transforms.Lambda(lambd)
功能:用户自定义lambda方法

  • lambd : lambda匿名函数
    lambda [arg1 [,arg2, … , argn]] : expression

eg:

transforms. Lambda(lambda crops: torch.stack([transforms. Totensor()(crop) for crop in crops]))

5.transforms方法的选择操作

  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.Resize
功能:调整图片的大小
  transforms.Totensor
功能:将之前的数据结构转换为张量
  transforms.Normalize

transforms.Normalize(mean,std,inplace=False)

功能:逐channel的对图像进行标准化(变换后的数据均值为0,标准差为1),标准化的优点是加快模型的收敛。
output=(input−mean)/stdoutput = (input - mean) / stdoutput=(input−mean)/std

  • mean :各通道的均值
  • std:各通道的标准差
  • inplace :是否原地操作

源码如下:

def normalize(tensor, mean, std, inplace=False):"""Normalize a tensor image with mean and standard deviation... note::This transform acts out of place by default, i.e., it does not mutates the input tensor.See :class:`~torchvision.transforms.Normalize` for more details.Args:tensor (Tensor): Tensor image of size (C, H, W) to be normalized.mean (sequence): Sequence of means for each channel.std (sequence): Sequence of standard deviations for each channel.inplace(bool,optional): Bool to make this operation inplace.Returns:Tensor: Normalized Tensor image."""# 输入的合法性判断-是否为Tensorif not _is_tensor_image(tensor):raise TypeError('tensor is not a torch image.')# 是否原地操作,如果不是原地操作,需要将张量克隆一份if not inplace:tensor = tensor.clone()dtype = tensor.dtype# 将均值与方差转化为张量mean = torch.as_tensor(mean, dtype=dtype, device=tensor.device)std = torch.as_tensor(std, dtype=dtype, device=tensor.device)# sub_:下划线表示原地操作;(input - mean) / stdtensor.sub_(mean[:, None, None]).div_(std[:, None, None])# 返回变换后的张量return tensor

6.自定义transfroms方法

  transforms方法是在Compose类中通过__call__方法调用的。

class Compose(object):"""Composes several transforms together.Args:transforms (list of ``Transform`` objects): list of transforms to compose.Example:>>> transforms.Compose([>>>     transforms.CenterCrop(10),>>>     transforms.ToTensor(),>>> ])"""def __init__(self, transforms):self.transforms = transformsdef __call__(self, img):# 循环执行transforms方法for t in self.transforms:img = t(img)return imgdef __repr__(self):format_string = self.__class__.__name__ + '('for t in self.transforms:format_string += '\n'format_string += '    {0}'.format(t)format_string += '\n)'return format_string

我们可以发现调用transforms时有如下特点:

  1. 仅接收一个参数,返回一个参数
  2. 注意上下游的输出与输入

  下面我们自定义transforms,它的基本结构为:

class YourTransforms(object) :def __init_(self, ...):...def __cal1__(self, img):...return img

  椒盐噪声又称为脉冲噪声,是一种随机出现的白点或者黑点,白点称为盐噪声,黑色为椒噪声。信噪比(Signal-Noise Rate,SNR)是衡量噪声的比例,图像中为图像像素的占比。我们以椒盐噪声为例来自定义transforms方法。

class AddPepperNoise(object):"""增加椒盐噪声Args:snr (float): Signal Noise Ratep (float): 概率值,依概率执行该操作"""def __init__(self, snr, p=0.9):assert isinstance(snr, float) and (isinstance(p, float))    # 2020 07 26 or --> and# 信号百分比self.snr = snr# 概率self.p = pdef __call__(self, img):"""Args:img (PIL Image): PIL ImageReturns:PIL Image: PIL image."""# 概率的判断if random.uniform(0, 1) < self.p:# 数据格式转换到ndarrayimg_ = np.array(img).copy()# 高,宽,通道数h, w, c = img_.shape# 获取信号百分比signal_pct = self.snr# 噪声百分比noise_pct = (1 - self.snr)# 依概率选取3个maskmask = 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

如果对您有帮助,麻烦点赞关注,这真的对我很重要!!!如果需要互关,请评论或者私信!


PyTorch学习—7.数据预处理模块—transforms相关推荐

  1. 深度学习算法 数据预处理之数据增强基础

    数据增强也叫做数据扩增,就是在不实质上增加原始数据量的情况下,通过裁剪.旋转.缩放.对称等操作,在原有数据上产生更多的等价数据量作为深度学习的数据集.比如裁剪:对于一张256*256的图,裁剪成224 ...

  2. 【sklearn学习】数据预处理和特征工程

    主成分分析 sklearn.PCA 特征选择 sklearn.feature_selection 特征处理 sklearn.preprocessing 特征提取 sklearn.feature_ext ...

  3. 【python学习】数据预处理-如何归一化?

    作者:代码律动 链接:数据预处理的归一化手段应该如何应用到训练集,测试集和验证集中? - 知乎 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作者:Orginal ...

  4. 数据挖掘学习笔记-数据预处理部分(一)

    数据挖掘笔记-数据预处理部分(一) 数据预处理-年数据部分 设置索引与标记 异常值与缺失值处理 股票行为标记 归一化 onehot特征编码 数据预处理-日数据部分 导入数据与标记 缺失数据处理 数据简 ...

  5. 系统学习Pytorch笔记三:Pytorch数据读取机制(DataLoader)与图像预处理模块(transforms)

    Pytorch官方英文文档:https://pytorch.org/docs/stable/torch.html? Pytorch中文文档:https://pytorch-cn.readthedocs ...

  6. 4.3 pytorch数据预处理:transforms图像增强方法

    一.数据增强概述 二.数据增强方法:裁剪 三.数据增强方法:翻转和旋转 四.数据增强方法:变换 五.transforms方法的选择操作 一.数据增强概述 我们来看图片中的数据增强是怎么样的. 左边的图 ...

  7. Pytorch学习(二)—— nn模块

    torch.nn nn.Module 常用的神经网络相关层 损失函数 优化器 模型初始化策略 nn和autograd nn.functional nn和autograd的关系 hooks简介 模型保存 ...

  8. PyTorch主要组成模块 | 数据读入 | 数据预处理 | 模型构建 | 模型初始化 | 损失函数 | 优化器 | 训练与评估

    文章目录 一.深度学习任务框架 二.数据读入 三.数据预处理模块-transforms 1.数据预处理transforms模块机制 2.二十二种transforms数据预处理方法 1.裁剪 2. 翻转 ...

  9. PyTorch 入坑六 数据处理模块Dataloader、Dataset、Transforms

    深度学习中的数据处理概述 深度学习三要素:数据.算力和算法 在工程实践中,数据的重要性越来越引起人们的关注.在数据科学界流传着一种说法,"数据决定了模型的上限,算法决定了模型的下限" ...

  10. torchvision.transforms 数据预处理:ToTensor()

    文章目录 1.ToTensor() 函数的作用 2.读取图像时 PIL 和 opencv 的选择 2.1 使用 PIL 2.2 使用 opencv 3.ToTensor() 的使用 3.1 关键知识点 ...

最新文章

  1. C++虚继承(四) --- /d1 reportSingleClassLayout插入看类内存布局
  2. 《集体智慧编程》笔记(1 / 12):集体智慧导言
  3. linux下mysql解压包安装
  4. HttpClient post 请求实例
  5. 检查radio/checkbox是否至少选择一项
  6. fuzzy仿真 MATLAB,基于Matlab的Fuzzy-PID控制器的设计与仿真
  7. JAVA项目开发之文档篇
  8. mysql pxc集群 原理 (图解+秒懂+史上最全)
  9. Unity3d trial version 水印
  10. O2O模式是什么意思 O2O运作模式有哪些?
  11. ACEL计算机证书,FSHW:酪蛋白水解物衍生的双功能肽的体外和计算机分析
  12. 计算机技术对高分子的意义,计算机技术在高分子材料工程中的应用.docx
  13. 正则表达式——常用量词
  14. 碳足迹PCF国内外标准和碳标签应用
  15. 高中数学学习技巧,这几步你都做到了吗?
  16. AI 金融行业案例清单
  17. kubevirt(一)虚拟化技术
  18. 高速信号完整性——EMI的分析及其抑制方法
  19. java 音频倍速播放_如何让视频加速播放
  20. JS:变量提升与临时性死区TDZ

热门文章

  1. js系列七:生命周期
  2. 表单的js验证框架,只提供提示信息及正则表达式即可自动验证及提示
  3. C++学习历程及感受
  4. uniapp遇到后台返回base64码格式图片没有显示出来
  5. win8.1产品安装临时密钥
  6. Battle接口测试训练系统的1分钟快速说明
  7. python list切片_python list切片
  8. iOS-图片可以自适应屏幕大小吗,应该会失真吧?
  9. 女性电子商务服装评论
  10. PMP新考纲 敏捷题目 (一)