数据增强之裁剪、翻转与旋转

文章和代码已经归档至【Github仓库:https://github.com/timerring/dive-into-AI 】或者公众号【AIShareLab】回复 pytorch教程 也可获取。

文章目录

    • 数据增强 Data Augmentation
      • 裁剪Crop
        • transforms.CenterCrop
        • transforms.RandomCrop
        • transforms.RandomResizedCrop
        • transforms.FiveCrop(TenCrop)
      • 翻转Flip
        • transforms.RandomHorizontalFlip(RandomVerticalFlip)
        • transforms.RandomVerticalFlip(p=1)
      • 旋转Rotation
        • transforms.RandomRotation

数据增强 Data Augmentation

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

技巧:

debug console:命令输入窗的环境与当前代码调试的环境完全一致,可以对变量进行更改或者查看。

例如这里对于输入变量的shape进行了查看。

由于图片经过 transform 操作之后是 tensor,像素值在 0~1 之间,并且标准差和方差不是正常图片的。所以定义了transform_invert()方法。功能是对 tensor 进行反标准化操作,并且把 tensor 转换为 image,方便可视化。

主要修改的是transforms.Compose代码块中的内容,其中transforms.Resize((224, 224))是把图片缩放到 (224, 224) 大小,然后再进行其他 transform 操作。

裁剪Crop

transforms.CenterCrop

torchvision.transforms.CenterCrop(size)

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

  • size :所需裁剪图片尺寸

CenterCrop:以中心裁剪,如果裁剪尺寸小于原尺寸,则显示裁剪后的部分,否则对于多出的部分填充为0的像素(即黑色)。

transforms.RandomCrop

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

功能:从图片中随机裁剪出尺寸为size 的图片,若有 padding,那么先进行 padding,再随机裁剪 size 大小的图片。

  • size: 裁剪大小

  • padding: 设置填充大小

    • 当为 a 时,上下左右均填充 a 个像素
    • 当为 (a, b) 时,左右填充 a 个像素,上下填充 b 个像素
    • 当为 (a, b, c, d) 时,左上右下分别填充 a,b,c,d
  • pad_if_need: 当图片小于设置的 size,是否填充

  • padding_mode:

    • constant: 像素值由 fill 设定

    • edge: 用图像边缘的像素值进行填充

    • reflect: 镜像填充,最后一个像素不镜像。([1,2,3,4] -> [3,2,1,2,3,4,3,2])

      可见,1和4均没有镜像。

    • symmetric: 镜像填充,最后一个像素也镜像。([1,2,3,4] -> [2,1,1,2,3,4,4,4,3])

  • fill: 当 padding_mode 为 constant 时,设置填充的像素值,如果不设置,则默认填充为0。

transforms.RandomResizedCrop

torchvision.transforms.RandomResizedCrop(size, scale=(0.08, 1.0), ratio=(3 / 4, 4 / 3), interpolation=2)

功能:随机大小、随机宽高比裁剪图片。首先根据 scale 的比例裁剪原图,然后根据 ratio 的长宽比再裁剪,最后使用插值法把图片变换为 size 大小。

  • size: 裁剪的图片尺寸
  • scale: 随机缩放面积比例,默认随机选取 (0.08, 1) 之间的一个数,可以自行修改范围。
  • ratio: 随机长宽比,默认随机选取 ( 3 4 \displaystyle\frac{3}{4} 43, 4 3 \displaystyle\frac{4}{3} 34 ) 之间的数。在这个范围内失真不明显,可以自行修改范围。
  • interpolation: 当裁剪出来的图片小于 size 时,就要使用插值方法 resize,主要有三种插值方法,如下:
    • PIL.Image.NEAREST
    • PIL.Image.BILINEAR
    • PIL.Image.BICUBIC

transforms.FiveCrop(TenCrop)

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

功能:FiveCrop在图像的上下左右以及中心裁剪出尺寸为 size 的 5 张图片。Tencrop对这 5 张图片进行水平(默认)或者垂直镜像获得 10 张图片。

  • size: 裁剪的图片尺寸
  • vertical_flip: 是否垂直翻转

由于这两个方法返回的是 tuple,每个元素表示一个图片,我们还需要把这个 tuple 转换为一张图片的tensor。代码如下:

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

这里采用Lambda匿名函数,:前crops为函数的输入,之后的为函数的返回值。其中stack是在张量的某一个维度上进行拼接,默认的为第0维度,[(transforms.ToTensor()(crop)) for crop in crops]) 中对crops进行for循环,然后取出的crop进行totensor的操作转换为张量的形式,得到长度为5的list,然后stack将长度为5的list拼接为一个张量。

并且把transforms.Compose中最后两行注释:

# transforms.ToTensor(), # toTensor()接收的参数是 Image,由于上面已经进行了 toTensor()
# transforms.Normalize(norm_mean, norm_std), # 由于是 4 维的 Tensor,因此不能执行 Normalize() 方法
  • transforms.Normalize()方法接收的是 3 维的 tensor (在 _is_tensor_image()方法 里检查是否满足这一条件,不满足则报错),而经过transforms.FiveCrop返回的是 4 维张量,因此注释这一行。

最后的 tensor 形状是 [ncrops, c, h, w],图片可视化的代码也需要做修改:

## 展示 FiveCrop 和 TenCrop 的图片
ncrops, c, h, w = img_tensor.shape
columns=2 # 两列
rows= math.ceil(ncrops/2) # 计算多少行
# 把每个 tensor ([c,h,w]) 转换为 image
for i in range(ncrops):img = transform_invert(img_tensor[i], train_transform)plt.subplot(rows, columns, i+1)plt.imshow(img)
plt.show()

5 张图片分别是左上角,右上角,左下角,右下角,中心。

翻转Flip

transforms.RandomHorizontalFlip(RandomVerticalFlip)

transforms.RandomVerticalFlip(p=1)

功能:根据概率,在水平或者垂直方向翻转图片。

  • p: 翻转概率

transforms.RandomHorizontalFlip(p=0.5),那么一半的图片会被水平翻转。

transforms.RandomVerticalFlip(p=1),那么所有图片会被垂直翻转。

旋转Rotation

transforms.RandomRotation

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

功能:随机旋转图片

  • degree: 旋转角度

    • 当为 a 时,在 (-a, a) 之间随机选择旋转角度
    • 当为 (a, b) 时,在 (a, b) 之间随机选择旋转角度
  • resample: 重采样方法,通常默认就好

  • expand: 是否扩大矩形框,以保持原图信息。根据中心旋转点计算扩大后的图片。如果旋转点不是中心,即使设置 expand = True,还是会有部分信息丢失。因为expand主要是针对center旋转设计的,如果更换了旋转点,会丢失旋转信息。

    如果设置 expand=True, batch size 大于 1,那么在一个 Batch 中,每张图片的 shape 都不一样了,会报错 Sizes of tensors must match except in dimension 0所以如果 expand=True,那么还需要进行 resize 操作。

  • center: 旋转点设置,是坐标,默认中心旋转。如设置左上角为:(0, 0)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/14464.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库的备份与恢复(超详细讲解)

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于MySQL数据库的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.数据库的备份与恢复是什么 二. …

stable diffusion 调试天坑 (setup.py)

第一次下载V1的stable diffusion (https://github.com/CompVis/stable-diffusion) 到本地调试,根据其要求创建了虚拟环境,自动运行了setup.py文件,长这样 from setuptools import setup, find_packagessetup(namelatent-diffusion,version0.…

Android Studio实现内容丰富的安卓博客发布平台

如需源码可以添加q-------3290510686,也有演示视频演示具体功能,源码不免费,尊重创作,尊重劳动。 项目编号078 1.开发环境 android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端: 1.注册登录 2.查看博客列表…

RabbitMQ系列(8)--实现RabbitMQ队列持久化及消息持久化

概念:在上一章文章中我们演示了消费者宕机的情况下消息没有被消费成功后会重新入队,然后再被消费,但如何保障RabbitMQ服务停掉的情况下,生产者发过来的消息不会丢失,这时候我们为了消息不会丢失就需要将队列和消息都标…

MAYA传送带上放石头(新旧粒子系统)

播放试试 使用老的粒子系统 particleShape1.shuliangrand(0,5); particleShape1.daxiao<<rand(0.2,0.5),rand(0.2,0.5),rand(0.2,0.5)>>; particleShape1.xuanzhuan<<rand(360),rand(360),rand(360)>>; 使用新的粒子系统 粒子向后滑落 新粒子系统能进行…

33.RocketMQ之Broker启动源码

highlight: arduino-light Broker启动流程:BrokerStartup#main java public static void main(String[] args) { //手动指定了 nameServer start(createBrokerController(args)); } java public static BrokerController start(BrokerController controller)…

计算机网络 - http协议 与 https协议(2)

前言 本篇介绍了构造http请求的的五种方式&#xff0c;简单的使用postman构造http请求&#xff0c;进一步了解https, 学习https的加密过程&#xff0c;了解对称密钥与非对称密钥对于加密是如何进行的&#xff0c;如有错误&#xff0c;请在评论区指正&#xff0c;让我们一起交流…

数据结构算法题——链表

leetcode-2.两数之和 leetcode-2.两数之和 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数…

Linux调优–I/O 调度器

Linux 的 I/O 调度器是一个以块式 I/O 访问存储卷的进程&#xff0c;有时也叫磁盘调度器。Linux I/O 调度器的工作机制是控制块设备的请求队列&#xff1a;确定队列中哪些 I/O 的优先级更高以及何时下发 I/O 到块设备&#xff0c;以此来减少磁盘寻道时间&#xff0c;从而提高系…

【PCIE】hot-reset和link disable

Hot reset 规则 如果上游伪端口&#xff08;Pseudo Port&#xff09;的任何一个通道连续接收到两个带有热复位位设置为1b、禁用链路位和回环位设置为0b的TS1有序集合&#xff0c;并且两个伪端口上的任何一个通道&#xff08;接收到TS1有序集合&#xff09;要么收到EIOS&#xf…

通俗易懂生成对抗网络GAN原理(二)

生成对抗网络&#xff08;Generative Adversarial Network, GAN&#xff09;的原理 学习李宏毅机器学习课程总结。 前面学习了GAN的直观的介绍&#xff0c;现在学习GAN的基本理论。现在我们来学习GAN背后的理论。 引言 假设x是一张图片&#xff08;一个高维向量&#xff09;…

DevOps系列文章 之 SnakeYAML解析与序列化YAML

1、简述 如何使用SnakeYAML库将YAML文档转换为Java对象&#xff0c;以及JAVA对象如何序列化为YAML文档。 在DevOps平台系统中是基础的能力支持&#xff0c;不管是spring boot 的配置还是K8S 资源清单yaml 2、项目设置 要在项目中使用SnakeYAML&#xff0c;需要添加Maven依赖…