【单点知识】基于实例讲解PyTorch中的Transforms类

文章目录

      • 0. 前言
      • 1. 基本用法
        • 1.1 转换为Tensor
        • 1.2 图像大小调整
        • 1.3 随机裁剪
        • 1.4 中心裁剪
        • 1.5 随机翻转
        • 1.6 随机旋转
        • 1.7 填充
        • 1.8 组合变换
      • 2. 进阶用法
        • 2.1 归一化
        • 2.2 色彩空间转换
        • 2.3 颜色抖动
        • 2.4 随机仿射
        • 2.5 透视变换
        • 2.6 自定义变换

0. 前言

按照国际惯例,首先声明:本文只是我自己学习的理解,虽然参考了他人的宝贵见解及成果,但是内容可能存在不准确的地方。如果发现文中错误,希望批评指正,共同进步。

在PyTorch框架中,torchvision.transforms 模块提供了一系列用于图像预处理数据增强的方法。这个模块主要用于对计算机视觉任务中的图像数据进行标准化、转换和增强操作,以满足深度学习模型训练和验证的需求。

本文将基于实例详细介绍torchvision.transforms 模块,实例介绍均使用下面400×300图像。

在这里插入图片描述

1. 基本用法

1.1 转换为Tensor
  • ToTensor(): 最基本的、也是必用的方法,将PIL Image或者numpy数组转换为Tensor,并将数据类型转换为float且范围调整至[0, 1]。
import torchvision
import PILimg = PIL.Image.open('car.png')
transform = torchvision.transforms.ToTensor()print(transform(img))
  • 输出:
tensor([[[0.1647, 0.1647, 0.1647,  ..., 0.2824, 0.2824, 0.2824],[0.1647, 0.1647, 0.1647,  ..., 0.2824, 0.2824, 0.2824],[0.1686, 0.1686, 0.1647,  ..., 0.2824, 0.2824, 0.2824],...,[0.1647, 0.1647, 0.1647,  ..., 0.2039, 0.2000, 0.1961],[0.1608, 0.1608, 0.1608,  ..., 0.2000, 0.1961, 0.1961],[0.1569, 0.1569, 0.1569,  ..., 0.1961, 0.1922, 0.1922]],[[0.2078, 0.2078, 0.2078,  ..., 0.2627, 0.2627, 0.2627],[0.2078, 0.2078, 0.2078,  ..., 0.2627, 0.2627, 0.2627],[0.2078, 0.2078, 0.2078,  ..., 0.2627, 0.2627, 0.2627],...,[0.2039, 0.2078, 0.2078,  ..., 0.2235, 0.2235, 0.2235],[0.2000, 0.2039, 0.2000,  ..., 0.2196, 0.2196, 0.2196],[0.2000, 0.1961, 0.1961,  ..., 0.2196, 0.2196, 0.2196]],[[0.2431, 0.2431, 0.2431,  ..., 0.2510, 0.2510, 0.2510],[0.2431, 0.2431, 0.2431,  ..., 0.2510, 0.2510, 0.2471],[0.2431, 0.2431, 0.2431,  ..., 0.2510, 0.2510, 0.2510],...,[0.2392, 0.2392, 0.2392,  ..., 0.2392, 0.2392, 0.2392],[0.2353, 0.2353, 0.2353,  ..., 0.2353, 0.2392, 0.2392],[0.2314, 0.2314, 0.2314,  ..., 0.2353, 0.2353, 0.2353]],[[1.0000, 1.0000, 1.0000,  ..., 1.0000, 1.0000, 1.0000],[1.0000, 1.0000, 1.0000,  ..., 1.0000, 1.0000, 1.0000],[1.0000, 1.0000, 1.0000,  ..., 1.0000, 1.0000, 1.0000],...,[1.0000, 1.0000, 1.0000,  ..., 1.0000, 1.0000, 1.0000],[1.0000, 1.0000, 1.0000,  ..., 1.0000, 1.0000, 1.0000],[1.0000, 1.0000, 1.0000,  ..., 1.0000, 1.0000, 1.0000]]])

这里可能有人会疑惑,为什么输出的tensor有4个通道?这是因为原图格式为RGBA:<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=400x300 at 0x25BC96CA950>,最后一个通道为透明度(全为1.0000的那个通道)。

1.2 图像大小调整
  • Resize(size): 调整图像到指定尺寸。
import torchvision
import PILimg = PIL.Image.open('car.png')
transform = torchvision.transforms.Resize((100,200))transform(img).show()
  • 输出:
    在这里插入图片描述

这里需要注意.Resize()输入元组为(height, width)。

1.3 随机裁剪
  • RandomCrop(size): 随机裁剪图像为给定尺寸。
import torchvision
import PILimg = PIL.Image.open('car.png')
transform = torchvision.transforms.RandomCrop((200,300))transform(img).show()
  • 输出:
    在这里插入图片描述
    会有多种随机输出,数据增强的主要手段之一。
1.4 中心裁剪
  • CenterCrop(size): 从图像中心裁剪出指定尺寸的区域。
import torchvision
import PILimg = PIL.Image.open('car.png')
transform = torchvision.transforms.CenterCrop((200,200)) #也可以简写为transform = torchvision.transforms.CenterCrop(200)transform(img).show()
  • 输出:
    在这里插入图片描述
    不同于随机裁剪,中心裁剪只有一个确定的输出。
1.5 随机翻转
  • RandomHorizontalFlip(p): 水平方向上以概率p进行随机翻转。
import torchvision
import PILimg = PIL.Image.open('car.png')
transform = torchvision.transforms.RandomHorizontalFlip(p=1)transform(img).show()
  • 输出:
    在这里插入图片描述
1.6 随机旋转
  • RandomRotation(degrees): 随机旋转图像。
import torchvision
import PILimg = PIL.Image.open('car.png')
transform = torchvision.transforms.RandomRotation(90)transform(img).show()
  • 输出:
    在这里插入图片描述
1.7 填充
  • Pad(padding, fill, padding_mode): 在图像周围添加指定宽度的填充。
import torchvision
import PILimg = PIL.Image.open('car.png')
transform = torchvision.transforms.Pad((100,100,200,200),padding_mode='edge')transform(img).show()

Pad的参数说明:

  • padding:这是一个表示填充大小的元组。它可以是单个整数值(在所有边都应用相同的填充)或者一个包含四个整数的元组 (padding_left, padding_right, padding_top, padding_bottom)分别表示左、右、上、下的填充大小。
  • fill:填充像素的颜色值,默认为0,即黑色(对于灰度图和RGB图,分别代表灰度值和RGB三通道颜色)。这个值可以是整数(如0-255之间的数字)、浮点数(在归一化到[0, 1]范围的图像中使用)或者是元组(在RGB图像中,每个元素分别代表R、G、B通道的填充颜色)。
  • padding_mode:定义填充的方式,可选选项包括:
    - constant:用给定的常数值填充。
    - edge:复制图像边缘的像素值进行填充。
    - reflect:以镜像的方式从图像边缘反射像素来填充。
    - replicate:与’edge’类似,但是不考虑镜像对称,简单地重复最接近边界的像素值。
  • 输出:
    在这里插入图片描述
1.8 组合变换
  • Compose(transforms): 将多个transform操作有序地组合在一起执行。
import torchvision
from torchvision.transforms import CenterCrop, RandomRotation, RandomHorizontalFlip
import PILimg = PIL.Image.open('car.png')
transform = torchvision.transforms.Compose([CenterCrop(200),RandomRotation(90), RandomHorizontalFlip(p=1)])transform(img).show()
  • 输出:
    在这里插入图片描述

2. 进阶用法

2.1 归一化
  • Normalize(mean, std): 将图像按照指定均值和标准差进行归一化。具体的处理方法为normalized_image = (original_image - mean) / std
import PIL
from torchvision.transforms import Compose,Normalize,ToTensorimg = PIL.Image.open('car.png')
transform = Compose([ToTensor(),Normalize(mean=[0.1,0.1,0.1,0],std=[0.3,0.3,0.3,1])])
print(transform(img))
  • 输出:
tensor([[[0.2157, 0.2157, 0.2157,  ..., 0.6078, 0.6078, 0.6078],[0.2157, 0.2157, 0.2157,  ..., 0.6078, 0.6078, 0.6078],[0.2288, 0.2288, 0.2157,  ..., 0.6078, 0.6078, 0.6078],...,[0.2157, 0.2157, 0.2157,  ..., 0.3464, 0.3333, 0.3203],[0.2026, 0.2026, 0.2026,  ..., 0.3333, 0.3203, 0.3203],[0.1895, 0.1895, 0.1895,  ..., 0.3203, 0.3072, 0.3072]],[[0.3595, 0.3595, 0.3595,  ..., 0.5425, 0.5425, 0.5425],[0.3595, 0.3595, 0.3595,  ..., 0.5425, 0.5425, 0.5425],[0.3595, 0.3595, 0.3595,  ..., 0.5425, 0.5425, 0.5425],...,[0.3464, 0.3595, 0.3595,  ..., 0.4118, 0.4118, 0.4118],[0.3333, 0.3464, 0.3333,  ..., 0.3987, 0.3987, 0.3987],[0.3333, 0.3203, 0.3203,  ..., 0.3987, 0.3987, 0.3987]],[[0.4771, 0.4771, 0.4771,  ..., 0.5033, 0.5033, 0.5033],[0.4771, 0.4771, 0.4771,  ..., 0.5033, 0.5033, 0.4902],[0.4771, 0.4771, 0.4771,  ..., 0.5033, 0.5033, 0.5033],...,[0.4641, 0.4641, 0.4641,  ..., 0.4641, 0.4641, 0.4641],[0.4510, 0.4510, 0.4510,  ..., 0.4510, 0.4641, 0.4641],[0.4379, 0.4379, 0.4379,  ..., 0.4510, 0.4510, 0.4510]],[[1.0000, 1.0000, 1.0000,  ..., 1.0000, 1.0000, 1.0000],[1.0000, 1.0000, 1.0000,  ..., 1.0000, 1.0000, 1.0000],[1.0000, 1.0000, 1.0000,  ..., 1.0000, 1.0000, 1.0000],...,[1.0000, 1.0000, 1.0000,  ..., 1.0000, 1.0000, 1.0000],[1.0000, 1.0000, 1.0000,  ..., 1.0000, 1.0000, 1.0000],[1.0000, 1.0000, 1.0000,  ..., 1.0000, 1.0000, 1.0000]]])

然后我们再把它重新转换回图像:

import PIL
from torchvision.transforms import Compose,Normalize,ToTensor, ToPILImageimg = PIL.Image.open('car.png')
transform = Compose([ToTensor(),Normalize(mean=[0.1,0.1,0.1,0],std=[0.3,0.3,0.3,1])])
tensor = transform(img)
pil_image = ToPILImage()
pil_image(tensor).show()
  • 输出图像为:
    在这里插入图片描述
2.2 色彩空间转换
  • Grayscale(num_output_channels=1): 将图像转换为灰度图。
import PIL
import torchvisionimg = PIL.Image.open('car.png')
transform = torchvision.transforms.Grayscale()
transform(img).show()
  • 输出:
    在这里插入图片描述
2.3 颜色抖动
  • ColorJitter(brightness, contrast, saturation, hue) :用于对图像的颜色属性进行随机抖动,具体包括亮度、对比度、饱和度以及色调(hue)的变化。
import PIL
import torchvisionimg = PIL.Image.open('car.png')
transform = torchvision.transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.6, hue=0.4)
transform(img).show()

ColorJitter的参数说明:

  • brightness: 亮度调整因子,默认值为0(不改变)。给定一个浮点数(例如0.2),会在 [max(1 - brightness, 0), 1 + brightness] 范围内随机选择一个比例来调整图像整体的亮度。
  • contrast: 对比度调整因子,默认值也为0(不改变)。给定一个浮点数(例如0.2),会在相应范围内随机选择一个比例来调整图像的整体对比度。对比度的变化会影响图像中所有像素的相对亮度差异。
  • saturation: 饱和度调整因子,同样默认0。例如0.6,意味着饱和度将在原图的基础上乘以一个范围在 [1 - saturation, 1 + saturation] 内的随机系数。饱和度越高,颜色越鲜艳;反之则趋向于灰色调。
  • hue: 色调调整因子,默认也是0(即不改变色调)。当设置为非零值如0.4时,会随机改变图像的色调(色彩的色相角度)。这对于模拟光照条件变化或色彩偏移非常有用。
  • 因为ColorJitter的调整参数是根据输入随机选择,因此输出也不唯一:
    在这里插入图片描述
    在这里插入图片描述
2.4 随机仿射
  • RandomAffine(degrees, translate, scale, shear) :它实现了对输入图像进行随机的仿射变换,包括旋转、缩放、剪切和平移等操作。与前面介绍的方法有部分重复,不再详细说明。这里仅说明其参数:
    • degrees: 表示图像随机旋转的角度范围,可以是单个数值表示固定角度或者一个元组来指定随机选择的角度区间。
    • translate: 指定水平和垂直方向上的随机平移幅度,以图像宽度或高度的百分比形式给出。
    • scale: 指定随机缩放的比例范围,输入的是一个包含最小和最大缩放因子的元组。
    • shear: 控制图像在两个坐标轴之间的随机剪切角度范围。
2.5 透视变换
  • RandomPerspective(distortion_scale, p, interpolation, fill): 透视变换能够模拟相机位置、视角或物体距离变化导致的三维空间到二维图像投影的变化,从而增加模型对这类几何变换的鲁棒性。
import PIL
import torchvisionimg = PIL.Image.open('car.png')
transform = torchvision.transforms.RandomPerspective(distortion_scale=0.5, p=1.0, interpolation=2, fill=0)
transform(img).show()

RandomPerspective参数说明:

  • distortion_scale:控制透视变换的强度,数值越大,图像扭曲程度越强。
  • p:概率参数,表示该变换应用于每个样本的概率,默认值是1.0,即总会应用透视变换。
  • interpolation:插值方式,用于确定如何从原始像素生成新像素。默认是2,对应于 PIL.Image.BILINEAR 双线性插值。
  • fill:当图像边界因变换而扩大时填充的颜色,默认是0。

透视变换的具体效果会随机产生,并且不会改变图像的尺寸大小,但可能会造成图像某些部分的拉伸、压缩或者移位。输出为:
在这里插入图片描述

2.6 自定义变换
  • transforms.Lambda():允许用户直接传入一个函数作为变换操作。
import torchvisionimg = PIL.Image.open('car.png')def image_operation(image):return torchvision.transforms.ToTensor()(image)**0.5  #对像素值进行0.5次方transform = torchvision.transforms.Lambda(image_operation)
torchvision.transforms.ToPILImage()(transform(img)).show()
  • 输出:
    在这里插入图片描述

以上罗列了torchvision.transforms的各种应用方法,实际使用时应根据具体问题的需求灵活选择和组合这些变换方法。

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

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

相关文章

Day51-Nginx多实例知识与大厂企业级实战

Day51-Nginx多实例知识与大厂企业级实战 1. 什么是nginx多实例&#xff1f;2. 为什么要用多实例&#xff1f;3. 大厂数百个业务项目&#xff0c;如何来管理&#xff1f;4. 大厂上百项目web分用户解决方案4.1 编译nginx环境实践&#xff1a;4.2 zuma实例(利用普通用户权限将不同…

前端项目,个人笔记(二)【Vue-cli - 引入阿里矢量库图标 + 吸顶交互 + setup语法糖】

目录 1、项目中引入阿里矢量库图标 2、实现吸顶交互 3、语法糖--<script setup> 3.1、无需return 3.2、子组件接收父组件的值-props的使用 3.3、注册组件 1、项目中引入阿里矢量库图标 步骤一&#xff1a;进入阿里矢量库官网中&#xff1a;iconfont-阿里巴巴矢量…

教务管理系统(java+mysql+jdbc+Druid+三层架构)

1、项目要求 1.1数据库表描述 设计一个教务管理系统&#xff0c;要求如下&#xff1a; 系统涉及的表有 account表&#xff08;账号表&#xff09; teacher表&#xff08;教师表&#xff09; student表&#xff08;学生表&#xff09; course表 (课程表) score表&#xff08;成…

Python内置对象

Python是一种强大的、动态类型的高级编程语言&#xff0c;其内置对象是构成程序的基础元素。Python的内置对象包括数字、字符串、列表、元组、字典、集合、布尔值和None等&#xff0c;每种对象都有特定的类型和用途。 01 什么是内置对象 这些对象是编程语言的基础构建块&…

STP环路避免实验(思科)

华为设备参考&#xff1a;STP环路避免实验&#xff08;华为&#xff09; 一&#xff0c;技术简介 Spanning Tree Protocol&#xff08;STP&#xff09;&#xff0c;即生成树协议&#xff0c;是一种数据链路层协议。主要作用是防止二层环路&#xff0c;并自适应网络变化和故障…

Unity2D实现鼠标拖动物体移动(简单好抄)

1.新建脚本&#xff0c;并将脚本拖到你想要拖动的物体上即可 using System.Collections; using System.Collections.Generic; using Unity.VisualScripting; using UnityEngine;public class text : MonoBehaviour {private Vector3 offset;public int x 1;void OnMouseDown(…

SAP前台处理:物料主数据创建<MM01>之销售视图

一、背景&#xff1a; 终于来到了物料主数据&#xff0c;我觉得物料账是SAP最重要的一项发明&#xff0c;也一直是SAP的一项重要优势&#xff0c;物料账记录了一个个物料的生生不息&#xff1b; 本章主要讲解物料主数据和财务相关的主要内容&#xff1a;这里特别提示由于作者…

matlab软件基础

第1讲 MATLAB初步 MATLAB是矩阵实验室&#xff08;Matrix Laboratory&#xff09;的简称&#xff0c;是美国MathWorks公司出品的商业数学软件&#xff0c;用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境。MATLAB和Mathematica、Maple并称为三…

Linux 发布项目到OpenEuler虚拟机

后端&#xff1a;SpringBoot 前端&#xff1a;VUE3 操作系统&#xff1a;Linux 虚拟机&#xff1a;OpenEuler 发布项目是需要先关闭虚拟机上的防火墙 systemctl stop firewalld 一、运行后端项目到虚拟机 1、安装JDK软件包 查询Jdk是否已安装 dnf list installed | grep jd…

Redis数据结构对象中的类型检查与命令多态、内存回收

类型检查与命令多态 概述 redis中用于操作键的命令基本上可以分为两种类型。其中一种命令可以对任何类型的键执行&#xff0c;比如说DEL命令、EXPIRE命令、RENAME命令、TYPE命令、OBJECT命令等. 而另一种命令只能对特定类型的键执行&#xff0c;比如说 1.SET、GET、APPEND、…

OPTEE v3.20.0 FVP环境搭建

目录 一、前提条件 二、下载fvp代码 三、下载工具链 四、下载Foundation_Platform FVP平台 五、编译及运行 一、前提条件 1、安装如下的依赖工具 sudo apt-get install android-tools-adb android-tools-fastboot autoconf \ automake bc bison build-essential ccache c…

windows管理github代码

资料 windows SSH下载github

51单片机—AD/DA

目录 1.AD/DA元件介绍 2.运算放大器 3.原理分析 4.性能指标 5.内部芯片时序 6.程序实操 7.原理图 1.AD/DA元件介绍 一般传感器的值会随参数的值变化&#xff0c;AD一般对电压进行转换&#xff0c;AD有多个通道&#xff0c;但是DA只有一个通道&#xff0c;且AD的运用较为广…

路由器怎么做端口映射

路由器在网络中起到了连接不同设备和提供网络服务的重要作用。端口映射是一项常见的操作&#xff0c;它允许外部网络中的设备通过路由器访问内部网络中的设备。我们将介绍如何在路由器上进行端口映射的设置。 理解端口映射 在开始操作之前&#xff0c;我们需要了解一些基本概念…

反射 Reflection

反射 反射的概念 反射机制允许程序在执行期借助于ReflectionAPI取得任何类的内部信息(比如成员变量&#xff0c;构造器&#xff0c;成员方法等等)&#xff0c;并能操作对象的属性及方法。反射在设计模式和框架底层都会用到加载完类之后&#xff0c;在堆中就产生了一个Class类型…

Flutter 在 Windows 下的开发环境搭建(Flutter SDK 3.19.2)【图文详细教程】

Git 下载与安装 对于 Flutter 3.19&#xff0c;Git 版本需要 2.27 及以上 Git 下载&#xff1a; Git 官网&#xff1a;https://git-scm.com/Git 下载淘宝镜像&#xff1a;https://registry.npmmirror.com/binary.html?pathgit-for-windows/ 对于 Git 的安装教程&#xff0c;…

Python分析无人驾驶汽车在桂林市文旅行业推广的问卷

【项目背景】 通过市场调研、文本分析、访谈和问卷调查等方法&#xff0c;探讨&#xff1a; 网民对无人驾驶汽车出行服务的态度。无人驾驶安全员的行业背景。不同人群在旅游时的交通选择偏好。游客及当地居民对桂林市文旅路线的交通满意度。乘客对无人驾驶汽车的满意度。桂林…

超快速排序(蓝桥杯,归并排序,acwing)

题目描述&#xff1a; 在这个问题中&#xff0c;您必须分析特定的排序算法----超快速排序。 该算法通过交换两个相邻的序列元素来处理 n 个不同整数的序列&#xff0c;直到序列按升序排序。 对于输入序列 9 1 0 5 4&#xff0c;超快速排序生成输出 0 1 4 5 9。 您的任务是确…

Selenium不同版本配置自动下载驱动及打包细节

Selenium配置浏览器驱动 自动下载浏览器驱动的方法 selenium4.7.0自动下载浏览器驱动的方法 selenium4.11.0 或4.11.1手动设置浏览器驱动路径的方法pyinstaller打包程序时同时打包ChromeDriverchromedriver路径需要sys._MEIPASS的路径进行引用方法一&#xff1a;通过–add-data…

【Linux】从零开始认识进程 — 前篇

我从来不相信什么懒洋洋的自由。我向往的自由是通过勤奋和努力实现的更广阔的人生。。——山本耀司 从零开始认识进程 1 认识冯诺依曼体系2 操作系统3 进程3.1 什么是进程&#xff1f;&#xff1f;&#xff1f;3.2 进程管理PCB 3.3 Linux中的进程深入理解 3.4 进程创建总结 送给…