首页 > 其他分享 >数据增强之裁剪、翻转与旋转

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

时间:2023-07-09 13:32:00浏览次数:36  
标签:tensor 翻转 裁剪 旋转 像素 transforms 图片 size

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

数据增强 Data Augmentation

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

技巧:

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

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

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

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

由于图片经过 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: 随机长宽比,默认随机选取 (数据增强之裁剪、翻转与旋转_数据_03, 数据增强之裁剪、翻转与旋转_数据_04 ) 之间的数。在这个范围内失真不明显,可以自行修改范围。
  • 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)

标签:tensor,翻转,裁剪,旋转,像素,transforms,图片,size
From: https://blog.51cto.com/u_15736437/6667858

相关文章

  • 【验证码逆向专栏】某度滑块、点选、旋转验证码 v1、v2 逆向分析
    声明本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作......
  • 旋转Treap树
    #include<bits/stdc++.h>usingnamespacestd;constintM=1e6+10;intcnt=0;//cnt记录当前节点个数,最新一个节点即t[cnt]introot=0;//root是整棵树的树根,初始为空树所以root初始化=0intn;//n表示操作次数structNode{ intls,rs;//左右儿子 intval,pr......
  • 【高斯消元】 HDOJ 5257 翻转游戏
    如果第一行的状态确定了,那么矩阵的所有状态也会随之确定。。。那么我们就将第一行写成变量,这样能够推出矩阵的m个方程。。。然后对于k,可以写出k个限制方程。。因此我们总共列出m+k个方程,高斯消元,bitset优化即可。。。#include<iostream>#include<queue>#include<stack>#inclu......
  • 坚固型3DMAG™A31315LOLATR-XZ-S-AR-10、A31315LOLATR-XY-S-SE-10霍尔效应 线性,旋转位
    A313153D磁性位置传感器IC是完全集成的坚固型3DMAG™霍尔效应磁性位置传感器IC,主要用于支持汽车、工业和消费类应用中的各种非接触式旋转和线性位置测量。此传感器IC符合AEC-Q1000级的要求,并根据ISO26262进行开发。这些标准使A31315成为了要求严格的汽车安全系统的理想选择,适......
  • 怎么旋转图片?在线旋转图片(批量)
    功能地址在线图片旋转,翻转照片,设置照片旋转角度,批量免费|TOFORU在线工具软件定制地址:https://tool.toforu.com/f/img_roate.html功能说明在线图片旋转,翻转照片,设置照片旋转角度,批量免费。支持参数:旋转角度功能使用相关知识图片旋转是一种常见的图像处理操作,它可......
  • Tina_Linux_系统裁剪_开发指南
    文章目录Tina_Linux_系统裁剪_开发指南1概述2Tina系统裁剪简介2.1boot0裁剪2.2uboot裁剪2.3内核裁剪2.3.1删除不使用的功能2.3.2删除不使用的驱动2.3.3修改内核源代码2.3.3.1size工具.2.3.3.2ksize.py脚本2.3.3.3nm命令2.3.3.4kernel压缩方式.2.4文件系统裁剪.2.4.1......
  • LeetCoe-25-K个一组翻转链表
    25题:K个一组翻转链表题目给你链表的头节点head,每 k 个节点一组进行翻转,请你返回修改后的链表。k是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换......
  • Java使用joml计算机图形学库,将3D坐标旋转正交投影转为2D坐标
    最近遇到了一个困扰我许久的难题,现将解决方案分享出来由于我们的项目侧重点在前端绘图,导致了前后端工作量不协调,我后端接口很快就能写完,而前端一个图要画好久,领导见状将前端的任务分到后端一部分用Java代码来实现,然后给前端提供接口而我接到的任务就是将Echarts中绘制三维图形的......
  • 剑指 Offer 58 - I. 翻转单词顺序
    输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"Iamastudent.",则输出"student.aamI"。示例1:输入:"theskyisblue"输出: "blueisskythe"示例2:输入:" helloworld! "输出: "worl......
  • C#图片旋转
    这里以Bitmap为例说明问题。可以看到,旋转方法需要传入一个参数,而这个参数是一个枚举类型,RotateFlipType。系统提供了两大类型的旋转,1.旋转后不翻转。2.旋转后接着翻转。翻转的轴可以为X和Y,对应为水平和垂直。经测试,它们的这样分的,如图所示,3代表水平的轴,2代表垂直的轴。 ......