【单点知识】基于实例讲解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 PIL

img = 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 PIL

img = PIL.Image.open('car.png')
transform = torchvision.transforms.Resize((100,200))

transform(img).show()
  • 输出:
    在这里插入图片描述

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

1.3 随机裁剪
  • RandomCrop(size): 随机裁剪图像为给定尺寸。
import torchvision
import PIL

img = PIL.Image.open('car.png')
transform = torchvision.transforms.RandomCrop((200,300))

transform(img).show()
  • 输出:
    在这里插入图片描述
    会有多种随机输出,数据增强的主要手段之一。
1.4 中心裁剪
  • CenterCrop(size): 从图像中心裁剪出指定尺寸的区域。
import torchvision
import PIL

img = 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 PIL

img = PIL.Image.open('car.png')
transform = torchvision.transforms.RandomHorizontalFlip(p=1)

transform(img).show()
  • 输出:
    在这里插入图片描述
1.6 随机旋转
  • RandomRotation(degrees): 随机旋转图像。
import torchvision
import PIL

img = PIL.Image.open('car.png')
transform = torchvision.transforms.RandomRotation(90)

transform(img).show()
  • 输出:
    在这里插入图片描述
1.7 填充
  • Pad(padding, fill, padding_mode): 在图像周围添加指定宽度的填充。
import torchvision
import PIL

img = 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 PIL

img = 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,ToTensor

img = 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, ToPILImage

img = 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 torchvision

img = PIL.Image.open('car.png')
transform = torchvision.transforms.Grayscale()
transform(img).show()
  • 输出:
    在这里插入图片描述
2.3 颜色抖动
  • ColorJitter(brightness, contrast, saturation, hue) :用于对图像的颜色属性进行随机抖动,具体包括亮度、对比度、饱和度以及色调(hue)的变化。
import PIL
import torchvision

img = 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 torchvision

img = 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 torchvision

img = 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的各种应用方法,实际使用时应根据具体问题的需求灵活选择和组合这些变换方法。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux 常用操作命令大全

目录 一、命令大集合 1.1 whereis 1.2 which 1.3 sudo 1.4 grep 1.5 free 1.6 top 动态显示进程的状态 1.7 ps 静态显示进程信息 1.8 df 1.9 iostat 看IO性能状态 1.10 yum安装插件命令 1.11 rpm 1.12 scp远程拷贝 1.13 uname 二、linux网络命令 2.1 centos7 防火…

数据库只追求性能是不够的!

那些成功的数据库公司没有一家是通过性能比竞争对手更快而成功的。 作者&#xff1a;JORDAN TIGANI&#xff0c;DuckDB 公司 MotherDuck 联合创始人&CEO 本文和封面来源&#xff1a;https://motherduck.com/&#xff0c;爱可生开源社区翻译。 本文约 4500 字&#xff0c;预…

autojsx使用

工具&#xff1a; 投屏软件&#xff1a;https://www.sigma-rt.com/tc/download/ autojsx&#xff1a;https://github.com/kkevsekk1/AutoX/releases 开发文档&#xff1a;http://doc.autoxjs.com/#/ 开发工具&#xff1a;https://code.visualstudio.com/ vscode插件&#xff1a…

《世界之外》玩家闹上315,乙游打响维权大战

315维权微博的评论区&#xff0c;竟然被举报网易的玩家占领了。 玩家举报网易乙游《世界之外》虚假宣传侵害消费者权益&#xff0c;在游戏中设置排行榜和专属商店将玩家分为三六九等&#xff0c;诱导玩家消费氪金&#xff0c;强烈要求网易打开退款通道。 目前大批玩家举报的举…

【Leetcode】1793. 好子数组的最大分数

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接&#x1f517; 给你一个整数数组 n u m s nums nums &#xff08;下标从 0 0 0 开始&#xff09;和一个整数 k k k 。 一个子数组 ( i , j ) (i, j) (i,j) 的 分数 定义为 m i n ( n u m s …

YOLOv5目标检测学习(6):源码解析之:训练部分train.py

文章目录 前言一、导入相关包与配置二、主函数main2.1 checks&#xff1a;检查rank值来判断是否打印参数、检查git仓库、检查包的安装2.2 判断是否恢复上一次模型训练提问&#xff1a;opt.data, opt.cfg, opt.hyp, opt.weights, opt.project各是什么&#xff1f; 2.3 DDP mode&…

HarmonyOS NEXT应用开发之swiper指示器导航点位于swiper下方

介绍 本示例介绍通过分割swiper区域&#xff0c;实现指示器导航点位于swiper下方的效果。 效果预览图 使用说明 加载完成后swiper指示器导航点&#xff0c;位于显示内容下方。 实现思路 将swiper区域分割为两块区域&#xff0c;上方为内容区域&#xff0c;下方为空白区域。…

Linux权限维持后门及应急响应

本次应急响应实验用kali和centos7来充当攻击机和靶机 kali&#xff1a;192.168.10.130 centos7&#xff1a;192.168.10.155 前提&#xff1a; 用kali连接到centos7上面ssh root192.168.10.155 一、SSH软链接 任意密码登录即可发现程度&#xff1a;|||||| ln -sf /usr/sbi…

Learn OpenGL 17 立方体贴图

立方体贴图 我们已经使用2D纹理很长时间了&#xff0c;但除此之外仍有更多的纹理类型等着我们探索。在本节中&#xff0c;我们将讨论的是将多个纹理组合起来映射到一张纹理上的一种纹理类型&#xff1a;立方体贴图(Cube Map)。 简单来说&#xff0c;立方体贴图就是一个包含了…

【论文阅读】Improved Denoising Diffusion Probabilistic Models

Improved Denoising Diffusion Probabilistic Models 文章目录 Improved Denoising Diffusion Probabilistic Models概述Improving the Log-likelihoodLearning ∑ θ ( x t , t ) \sum_{\theta}(x_{t}, t) ∑θ​(xt​,t)Improving the Noise ScheduleReducing Gradient Nois…

AV1:帧内预测(一)

​VP9支持10种帧内预测模式&#xff0c;包括8种角度模式和非角度模式DC、TM(True Motion)模式&#xff0c;AV1在其基础上进一步扩展&#xff0c;AV1帧内预测角度模式更细化&#xff0c;同时新增了部分非角度模式。 扩展的角度模式 AV1在VP9角度模式的基础上进一步扩展&#xf…

Linux系统学习总结(上)

B站大学地址&#xff1a;第二章-04-ls命令的参数和选项_哔哩哔哩_bilibili 操作系统概述 1、计算机是由硬件和软件两部分组成的 2、操作系统是软件的一类&#xff0c;主要作用是协助用户调度硬件工作&#xff0c;充当用户和计算机硬件之间的桥梁 3、常见的操作系统分为两类…

C++ Primer Plus第十七章笔记

目录 1. C输入和输出概述 1.1 流、缓冲区和iostream 1.2 重定向 2. 使用cout进行输出 2.1 修改显示时使用的计数系统 2.2 调整字段宽度 2.3 填充字符 2.4 设置浮点数的显示精度 2.5 打印末尾的0或小数点 2.6 setf() 2.7 头文件iomanip 3. 使用cin进行输入 3.1 cin…

什么是组态软件?Web组态软件又是什么?

从事相关工作的对“组态软件”应该都不陌生&#xff0c;那Web组态软件又是什么呢?本文将对Web组态可视化软件&#xff08;下称“Web组态软件”&#xff09;做简单介绍&#xff0c;可视化编辑器是Web组态软件中的一个重要功能模块。除了编辑器&#xff0c;还有哪些功能模块?又…

嵌入式汇编语言简介

嵌入式汇编语言是一种在嵌入式系统开发中广泛使用的编程语言&#xff0c;它直接操作底层硬件资源&#xff0c;具有高效性和灵活性。本文将介绍嵌入式汇编语言的基本概念、特点以及应用场景。 以下是我整理的关于嵌入式开发的一些入门级资料&#xff0c;免费分享给大家&#xf…

Spring之@Value注解

前言 Value注解在Spring的依赖注入中占据重要地位,这里对Value注解的作用进行演示以及扩展 作用 注入字符串注入属性注入bean其他 代码准备 创建两个普通的bean Component public class ValueComponent { } Component public class Foo {private String sign;public Foo…

Linux编译器--gcc/g++的使用

1. gcc与g gcc与g分别是c语言与c代码的编译器&#xff0c;但同时g也兼容c语言。 我们知道在Linux中&#xff0c;系统并不以文件后缀来区分文件类别。但对于gcc与g等编译器而言却是需要的。Linux中c代码文件的后缀是.c&#xff0c;c代码文件的后缀是.cpp(.cc)(.cxx)。 在Linu…

linux安装Redis且搭建主从、哨兵、集群以及使用(超详细)

一.Redis简介 1.NoSQL简介 ​ 目前市场主流数据存储都是使用关系型数据库。每次操作关系型数据库时都是I/O操作&#xff0c;I/O操作是主要影响程序执行性能原因之一&#xff0c;连接数据库关闭数据库都是消耗性能的过程。尽量减少对数据库的操作&#xff0c;能够明显的提升程…

Nodejs 第五十八章(大文件上传)

在现代网站中&#xff0c;越来越多的个性化图片&#xff0c;视频&#xff0c;去展示&#xff0c;因此我们的网站一般都会支持文件上传。 文件上传的方案 大文件上传&#xff1a;将大文件切分成较小的片段&#xff08;通常称为分片或块&#xff09;&#xff0c;然后逐个上传这…

体育运动直播中的智能运动跟踪和动作识别系统 - 视频分析如何协助流媒体做出实时决策

AI-Powered Streaming Vision: Transforming Real-Time Decisions with Video Analytics 原著&#xff1a;弗朗西斯科冈萨雷斯&#xff5c;斯特朗&#xff08;STRONG&#xff09;公司首席ML科学家 翻译&#xff1a;数字化营销工兵 实时视频分析通过即时处理实时视频数据&…