PyTorch框架学习五——图像预处理transforms(一)

  • 一、transforms运行机制
  • 二、transforms的具体方法
    • 1.裁剪
      • (1)随机裁剪:transforms.RandomCrop()
      • (2)中心裁剪:transforms.CenterCrop()
      • (3)随机长宽比裁剪:transforms.RandomCrop()
      • (4)上下左右中心裁剪:transforms.FiveCrop()
      • (5)上下左右中心裁剪后翻转:transforms.TenCrop()
    • 2.翻转、旋转
      • (1)依概率p水平翻转:transforms.RandomHorizontalFlip()
      • (2)依概率p垂直翻转:transforms.RandomVerticalFlip()
      • (3)随机旋转:transforms.RandomRotation()

一、transforms运行机制

介绍transforms之前先简单介绍一下torchvision。

torchvision是PyTorch的计算机视觉工具包,包含了一些与CV相关的处理。有三个需要重要介绍:

  1. torchvision.transforms:包含了常用的图像预处理方法,如数据中心化、标准化、缩放、裁剪等。
  2. torchvision.datasets:包含了常用数据集的dataset实现,如MNIST、CIFAR-10、ImageNet等。
  3. torchvision.model:包含了常用的预训练模型,如AlexNet、VGG、ResNet、GoogleNet等。

在transforms中除了具体的预处理方法之外,有一个Compose操作,这里提前介绍,它可以将一系列transforms操作有序地组合包装,以此按顺序执行每一项操作。

torchvision.transforms.Compose(transforms)

参数:

如:

>>> transforms.Compose([
>>>     transforms.CenterCrop(10),
>>>     transforms.ToTensor(),
>>> ])

二、transforms的具体方法

transforms的操作一般的目的是为了图像预处理和数据增强,所谓数据增强,又称数据增广、数据扩增,它是对训练集进行变换,使训练集更丰富,从而让模型更具泛化能力。下面将介绍二十多种具体的transforms的方法。

1.裁剪

(1)随机裁剪:transforms.RandomCrop()

功能:从图片中随机裁剪出尺寸为size的部分,图像可以是PIL格式或者是张量。

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

参数如下:

  1. size:(序列或int)若为int,则是(size,size)的大小,若为序列如(h,w),则大小为(h,w)。
  2. padding:(序列或int,可选)默认为None,当为整数a时,上下左右的边均要填充a个像素;当为(a, b)时,上下两边填充b个像素,左右两边填充a个;当为(a, b, c, d)时,左、上、右、下分别填充a、b、c、d个像素。
  3. pad_if_need:(布尔型)如果输入的图像尺寸小于要裁剪的尺寸size,则填充,以防报错。
  4. fill:padding_mode中constant模式时设置填充的像素值,默认为0。
  5. padding_mode:填充模式,有四种,constant、edge、reflect和symmetric,默认为constant,而且目前symmetric模式不支持输入为张量(Tensor)。constant模式:像素值由fill设定;edge模式:由图像边缘像素决定;reflect模式:镜像填充,最后一个像素不镜像,如[1, 2, 3, 4]→[3, 2, 1, 2, 3, 4, 3, 2];symmetric模式:镜像填充,最后一个像素也镜像,如[1, 2, 3, 4]→[2, 1, 1, 2, 3, 4, 4, 3]。

下面看一下随机裁剪的几个例子及其效果,变换前图片的原始尺寸为224×224,如下图所示:

(1)随机裁剪尺寸为224,padding=16,即四边都填充16个像素,就是在256×256的范围随机裁剪224×224的大小,效果如下图所示:

transforms.RandomCrop(224, padding=16)


(2)随机裁剪尺寸为224,padding=(16, 64),即左右填充16个像素,上下填充64个像素,就是在256×352 的范围随机裁剪224×224的大小,效果如下图所示:

transforms.RandomCrop(224, padding=(16, 64))


(3)与(1)不同之处就在于像素的填充,这里设定了填充的像素值为(255, 0, 0),效果如下图所示:

transforms.RandomCrop(224, padding=16, fill=(255, 0, 0))


(4)随机裁剪的尺寸为512,大于原始图像的尺寸224,所以pad_if_needed必须设置为True来进行自动填充,扩大尺寸(填充是随机的),效果如下图所示:

transforms.RandomCrop(512, pad_if_needed=True)


(5)与(1)或(3)不同的是,填充模式设定为‘edge’,效果如下图所示:

transforms.RandomCrop(224, padding=64, padding_mode='edge')


(6)与(1)或(3)或(5)不同的是,填充模式设定为 ‘reflect’ ,效果如下图所示:

transforms.RandomCrop(224, padding=64, padding_mode='reflect')


(7)最后看一个综合一点的:

transforms.RandomCrop(1024, padding=1024, padding_mode='symmetric')

(2)中心裁剪:transforms.CenterCrop()

功能:从图像中心裁剪图片,图片可以是PIL格式或是张量。

torchvision.transforms.CenterCrop(size)


例子如下:

transforms.CenterCrop(128)

transforms.CenterCrop(512)

(3)随机长宽比裁剪:transforms.RandomCrop()

功能:随机大小、长宽比裁剪图片,图片可以是PIL格式或是张量。

torchvision.transforms.RandomResizedCrop(size, scale=(0.08, 1.0), ratio=(0.75, 1.3333333333333333), interpolation=2)

参数如下:

  1. size:同上。
  2. scale:随机裁剪的大小区间,如scale=(0.08, 1.0),即随机裁剪出的图片面积会在原始面积的0.08倍至1.0倍之间。
  3. ratio:随机长宽比的范围,默认为(3/4,4/3)。
  4. interpolation:插值方法,有三种,分别为PIL.Image.NEAREST、PIL.Image.BILINEAR、PIL.Image.BICUBIC,默认为PIL.Image.BILINEAR。

例子如下:裁剪出来的部分是原来部分面积的0.5倍,但是大小又必须为224不变,所以用了默认了插值方法PIL.Image.BILINEAR。

transforms.RandomResizedCrop(size=224, scale=(0.5, 0.5))

(4)上下左右中心裁剪:transforms.FiveCrop()

功能:对给定图像的四个角以及中心进行裁剪,图片可以是PIL格式或是张量,返回一个包含五个元素的元组(tuple),一般都要紧跟一个将元组转变为张量的操作,而且还要注意前后代码尺寸上的匹配

torchvision.transforms.FiveCrop(size)

参数size同上。

例子如下,紧跟了一个将元组变换为张量的操作:

transforms.FiveCrop(112)
transforms.Lambda(lambda crops: torch.stack([(transforms.ToTensor()(crop)) for crop in crops])),

(5)上下左右中心裁剪后翻转:transforms.TenCrop()

功能:在图像(PIL格式或者是张量)的上下左右四个角以及中心裁剪出尺寸为size的5张图片,TenCrop对这5张图片进行水平或垂直镜像从而获得10张图片。

torchvision.transforms.TenCrop(size, vertical_flip=False)

参数如下:

  1. size:同上。
  2. vertical_flip:设置为True时,会垂直翻转,为False时,会水平翻转,默认为False。
transforms.TenCrop(112, vertical_flip=False)
transforms.Lambda(lambda crops: torch.stack([(transforms.ToTensor()(crop)) for crop in crops])),

2.翻转、旋转

(1)依概率p水平翻转:transforms.RandomHorizontalFlip()

功能:依概率水平翻转,输入图像为PIL格式或是张量。

torchvision.transforms.RandomHorizontalFlip(p=0.5)

参数:

例子如下:

transforms.RandomHorizontalFlip(p=1)

(2)依概率p垂直翻转:transforms.RandomVerticalFlip()

功能:依概率垂直翻转,输入图像为PIL格式或是张量。

torchvision.transforms.RandomVerticalFlip(p=0.5)


例子如下:

transforms.RandomVerticalFlip(p=1)

(3)随机旋转:transforms.RandomRotation()

功能:随机旋转图片。

torchvision.transforms.RandomRotation(degrees, resample=False, expand=False, center=None, fill=None)

参数如下:

  1. degrees:旋转的角度,当为a时,在(-a, a)之间选择旋转角度;当为(a, b)时,在(a, b)之间选择角度。
  2. resample:(可选)重采样方法(以后细学)。
  3. expand:(布尔,可选)若为True,则会自动扩大输出尺寸,以保证原图信息不丢失;若为False或省略,输出尺寸保持和输入一致。
  4. center:(可选)旋转中心,以左上角为原点(0,0),默认旋转中心为图像中心点。
  5. fill:像素填充值,默认为0,只支持pillow>=5.2.0版本。

注意:expand的计算公式是针对中心点旋转的,若设置为左上角旋转或者其他点为旋转中心,则不能保证保持原图信息。

下面看几个例子:
(1)中心点旋转,范围(-90度,90度):

transforms.RandomRotation(90)


(2)设置expand保持原图信息,图像尺寸自动扩大:

transforms.RandomRotation((90), expand=True)


(3)旋转中心改为左上角:

transforms.RandomRotation(30, center=(0, 0))

(4)旋转中心为左上角并进行expand:

transforms.RandomRotation(30, center=(0, 0), expand=True)

结果不能保证保持原图信息:

PyTorch框架学习五——图像预处理transforms(一)相关推荐

  1. PyTorch框架学习六——图像预处理transforms(二)

    PyTorch框架学习六--图像预处理transforms(二) (续)二.transforms的具体方法 4.图像变换 (1)尺寸变换:transforms.Resize() (2)标准化:tran ...

  2. PyTorch框架学习十五——可视化工具TensorBoard

    PyTorch框架学习十五--可视化工具TensorBoard 一.TensorBoard简介 二.TensorBoard安装及测试 三.TensorBoard的使用 1.add_scalar() 2 ...

  3. PyTorch框架学习七——自定义transforms方法

    PyTorch框架学习七--自定义transforms方法 一.自定义transforms注意要素 二.自定义transforms步骤 三.自定义transforms实例:椒盐噪声 虽然前面的笔记介绍 ...

  4. PyTorch系列入门到精通——图像预处理transforms

    PyTorch系列入门到精通--图像预处理transforms

  5. PyTorch框架学习八——PyTorch数据读取机制(简述)

    PyTorch框架学习八--PyTorch数据读取机制(简述) 一.数据 二.DataLoader与Dataset 1.torch.utils.data.DataLoader 2.torch.util ...

  6. PyTorch框架学习十——基础网络层(卷积、转置卷积、池化、反池化、线性、激活函数)

    PyTorch框架学习十--基础网络层(卷积.转置卷积.池化.反池化.线性.激活函数) 一.卷积层 二.转置卷积层 三.池化层 1.最大池化nn.MaxPool2d 2.平均池化nn.AvgPool2 ...

  7. PyTorch框架学习十八——Layer Normalization、Instance Normalization、Group Normalization

    PyTorch框架学习十八--Layer Normalization.Instance Normalization.Group Normalization 一.为什么要标准化? 二.BN.LN.IN. ...

  8. PyTorch框架学习二十——模型微调(Finetune)

    PyTorch框架学习二十--模型微调(Finetune) 一.Transfer Learning:迁移学习 二.Model Finetune:模型的迁移学习 三.看个例子:用ResNet18预训练模 ...

  9. PyTorch框架学习十九——模型加载与保存

    PyTorch框架学习十九--模型加载与保存 一.序列化与反序列化 二.PyTorch中的序列化与反序列化 1.torch.save 2.torch.load 三.模型的保存 1.方法一:保存整个Mo ...

最新文章

  1. 详解:操作符的优先级
  2. 新书上市 | C程序员! 这可能是你搞定指针最轻松的方式
  3. python编程入门经典教程-2020年5个经典python编程入门视频教程推荐学习
  4. 有一段时间没来这里了,
  5. Sophos将AI技术用于预防恶意IP的安全解决方案中
  6. java 变成题_Java 习题8 参考答案及解析
  7. mysql 事务 返回插入的值_深入理解mysql事务:事务机制的实现原理
  8. MySQL innoDB数据插入性能优化
  9. [转]在C#中使用MSHTML的高级支持接口
  10. 反编译获取任何微信小程序源码——看这篇就够了
  11. 计算机监理培训计划,监理人员培训计划
  12. 优化 | 线性化:0-1变量乘以连续变量的线性化
  13. 金融工程学(六):互换的定价与风险分析
  14. 俗理解T检验与F检验的区别
  15. 【虚拟仿真】Unity3D中如何实现让3D模型显示在UI前面
  16. 红米note3android耗电,红米Note3全网 flyme6 完美精简 省电优化 DPI设置 流畅实用-刷机之家...
  17. gt、lt、ge、le、eq、ne的含义
  18. UNITY NGUI IPHONEX完美适配
  19. 计算机专业必看!10天用Flutter撸了个高仿携程App,好文推荐
  20. 温度报警器 c语言,红外遥控温度报警器

热门文章

  1. MoCoV3:何恺明团队新作!解决Transformer自监督训练不稳定问题!
  2. HDFS Federation在美团点评的应用与改进
  3. ARKit:增强现实技术在美团到餐业务的实践
  4. 牛逼!支付宝高级Java三面题目:线程锁+事务+雪崩+Docker等
  5. 开源开放 | 中国近代历史人物知识图谱
  6. 论文浅尝 | 基于用户反馈的交互式自然语言回答系统提升机制
  7. RNN循环神经网络(吴恩达《序列模型》笔记一)
  8. 中文实体、关系抽取工具
  9. 8 计算机组成原理第五章 中央处理器 控制器 硬布线控制器 微程序控制器
  10. 【译】索引进阶(四):页和区