【学习笔记】【Pytorch】三、常用的Transforms

news2025/1/13 15:41:46

【学习笔记】【Pytorch】三、常用的Transforms

  • 学习地址
  • 主要内容
    • 一、Transforms模块介绍
    • 二、transforms.ToTensor类的使用
      • 1.使用说明
      • 2.代码实现
    • 三、transforms.Normalize类的使用
      • 1.使用说明
      • 2.代码实现
    • 四、transforms.Resize类的使用
      • 1.使用说明
      • 2.代码实现
    • 五、transforms.Compose类的使用
      • 1.使用说明
      • 2.代码实现
    • 六、transforms.RandomCrop类的使用
      • 1.使用说明
      • 2.代码实现
  • 总结
  • 参考

学习地址

PyTorch深度学习快速入门教程【小土堆】.

主要内容

一、Transforms模块介绍
介绍PyTorch图像处理与数据增强方法。
二、transforms.ToTensor类的使用
作用:将图片转化成Tensor数据类型。
三、transforms.Normalize类的使用
作用:逐 channel 逐像素地对图像进行标准化。
四、transforms.Resize类的使用
作用:图片尺寸缩放。
五、transforms.Compose类的使用
作用:对多个图像变换API进行打包,顺序使用多个API。
六、transforms.RandomCrop类的使用
作用:在随机位置裁剪给定图像。

一、Transforms模块介绍

from torchvision import transforms

介绍:计算机视觉任务中,对图像的变换(Image Transform)往往是必不可少的操作,例如在迁移学习中,需要对图像尺寸进行变换以使用预训练网络的输入层,又如对数据进行增强以丰富训练数据。pytorch中torchvision.transforms提供的丰富多样的图像变换API
transforms文件夹结构在这里插入图片描述

在这里插入图片描述

二、transforms.ToTensor类的使用

在这里插入图片描述
作用:将图片转化成Tensor数据类型。

1.使用说明

【__call__重载】ToTensor_object(img)

  • 作用:将图片转化成Tensor向量(Tensor类型数据),变为矩阵进行计算,为了之后的卷积做准备;
  • img:PIL Image、numpy.ndarray两种格式。
  • 返回值:Tensor格式图片。
  • 例子:
tensor_trans = transforms.ToTensor()  # 创建一个ToTensor实例
tensor_img = tensor_trans(img)  # 返回 tensor 数据类型

2.代码实现

from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms


# tensor数据类型
# 通过 transforms.ToTensor 去解决两个问题
# 1、transforms该如何使用(python)
# 2、为什么我们需要Tensor数据类型


img_path = "data/train/ants_image/0013035.jpg"
img = Image.open(img_path)  # PIL类型的图片数据

writer = SummaryWriter("logs")

# 1、transforms该如何使用(python)
tensor_trans = transforms.ToTensor()  # 创建一个ToTensor实例
tensor_img = tensor_trans(img)  # 返回 tensor 数据类型
# ToTensor类使用 __call__ 魔法方法重载了 () 运算符,
# 使得类实例对象可以像调用普通函数那样,以“对象名()”的形式使用。
# 使用“对象名()”形式可以自动调用 __call__ 方法

# 2、为什么我们需要Tensor数据类型:add_image()可以传入tensor格式的图片等
writer.add_image("Tensor_img", tensor_img)  # 输入为tensor格式的图片

writer.close()

TensorBoard输出
在这里插入图片描述
Tensor数据类型(print(tensor_img)):

tensor([[[0.3137, 0.3137, 0.3137,  ..., 0.3176, 0.3098, 0.2980],
         [0.3176, 0.3176, 0.3176,  ..., 0.3176, 0.3098, 0.2980],
         [0.3216, 0.3216, 0.3216,  ..., 0.3137, 0.3098, 0.3020],
         ...,
         [0.3412, 0.3412, 0.3373,  ..., 0.1725, 0.3725, 0.3529],
         [0.3412, 0.3412, 0.3373,  ..., 0.3294, 0.3529, 0.3294],
         [0.3412, 0.3412, 0.3373,  ..., 0.3098, 0.3059, 0.3294]],

        [[0.5922, 0.5922, 0.5922,  ..., 0.5961, 0.5882, 0.5765],
         [0.5961, 0.5961, 0.5961,  ..., 0.5961, 0.5882, 0.5765],
         [0.6000, 0.6000, 0.6000,  ..., 0.5922, 0.5882, 0.5804],
         ...,
         [0.6275, 0.6275, 0.6235,  ..., 0.3608, 0.6196, 0.6157],
         [0.6275, 0.6275, 0.6235,  ..., 0.5765, 0.6275, 0.5961],
         [0.6275, 0.6275, 0.6235,  ..., 0.6275, 0.6235, 0.6314]],

        [[0.9137, 0.9137, 0.9137,  ..., 0.9176, 0.9098, 0.8980],
         [0.9176, 0.9176, 0.9176,  ..., 0.9176, 0.9098, 0.8980],
         [0.9216, 0.9216, 0.9216,  ..., 0.9137, 0.9098, 0.9020],
         ...,
         [0.9294, 0.9294, 0.9255,  ..., 0.5529, 0.9216, 0.8941],
         [0.9294, 0.9294, 0.9255,  ..., 0.8863, 1.0000, 0.9137],
         [0.9294, 0.9294, 0.9255,  ..., 0.9490, 0.9804, 0.9137]]])

三、transforms.Normalize类的使用

在这里插入图片描述
作用:逐 channel 逐像素地对图像进行标准化。

1.使用说明

【实例化】transforms.Normalize(mean, std, inplace=False)

  • 作用:创建一个RGB图像每个通道对应的均值mean和标准差std的实例。
  • mean:列表,3个通道的均值。
  • std:列表,3个通道的标准差。
  • 例子:
trans_norm = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])

【_call_】Normalize_object(img)

  • 作用:逐 channel 逐像素地对图像进行标准化。
  • img:仅支持Tensor格式的图片。
  • 返回值:标准化后的Tensor格式图片
  • 计算公式:
    output[channel] = (input[channel] - mean[channel]) / std[channel]
  • 例子:
img_norm = trans_norm(tensor_img)  # 仅支持Tensor格式的图片

在这里插入图片描述

2.代码实现

from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms


img_path = "data/train/ants_image/0013035.jpg"
img = Image.open(img_path)  # PIL类型的图片数据
writer = SummaryWriter("logs")

# 1.ToTensor
tensor_trans = transforms.ToTensor()  # 创建一个ToTensor实例
tensor_img = tensor_trans(img)  # 返回 tensor 数据类型
writer.add_image("Tensor_img", tensor_img)  # 输入为tensor格式的图片

# 2.Normalize:逐 channel 逐像素地对图像进行标准化(验证一个像素数据的标准化计算)
print(tensor_img[0][0][0])

# RGB图像每个通道对应一个均值和标准差
trans_norm = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
img_norm = trans_norm(tensor_img)  # 仅支持Tensor格式的图片
# 0.3137 * 2 - 1 = -0.3726
print(img_norm[0][0][0])
writer.add_image("Tensor_img_norm", img_norm, 1)  # 输入为tensor格式的图片

trans_norm = transforms.Normalize([6, 3, 2], [9, 3, 5])
img_norm = trans_norm(tensor_img)  # 仅支持Tensor格式的图片
writer.add_image("Tensor_img_norm", img_norm, 2)  # 输入为tensor格式的图片

writer.close()
**控制台输出**

控制台输出

(768, 512)
torch.Size([3, 512, 512])

TensorBoard输出
在这里插入图片描述

四、transforms.Resize类的使用

在这里插入图片描述
作用:图片尺寸缩放。一般输入深度网络的特征图长宽是相等的,就不能采取等比例缩放的方式了,最好需要同时指定长宽。

1.使用说明

【实例化】transforms.Resize(size, interpolation=InterpolationMode.BILINEAR, max_size=None, antialias=None)

  • 作用:创建一个缩放图片尺寸的实例。
  • size:列表,(h, w),输出就是为该尺寸;int整数,等比例缩放,将图片短边缩放至size,长宽比保持不变,i.e,如果高度>宽度,则图像将被重新缩放为(size*高度/宽度,size)。
  • 例子:
trans_resize = transforms.Resize((512, 512)) 
trans_resize = transforms.Resize(512) 

【_call_】Resize_object(img)

  • 作用:图片尺寸缩放。
  • img:支持PIL、Tensor格式的图片。
  • 返回值:缩放后的原格式图片
  • 例子:
img_resize = trans_resize(img)  # 支持 PTL、tensor 格式的图片

2.代码实现

from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms


img_path = "data/train/ants_image/0013035.jpg"
img = Image.open(img_path)  # PIL类型的图片数据
writer = SummaryWriter("logs")

# ToTensor
tensor_trans = transforms.ToTensor()  # 创建一个ToTensor实例
tensor_img = tensor_trans(img)  # 返回 tensor 数据类型
writer.add_image("Tensor_img", tensor_img)  # 输入为tensor格式的图片

# Resize:变换图片尺寸
print(img.size)
trans_resize = transforms.Resize((512, 512))
# img PIL -> Resize -> img_resize PIL
img_resize = trans_resize(img)  # 支持 PTL、tensor 格式的图片
# img_resize PIL -> ToTensor -> img_resize tensor
img_resize = tensor_trans(img_resize)
writer.add_image("Resize", img_resize, 0)
print(img_resize.shape)

writer.close()

控制台输出

(768, 512)
torch.Size([3, 512, 512])

TensorBoard输出
在这里插入图片描述

五、transforms.Compose类的使用

作用:我们做图像变换时,一般都不会单独使用一个图像变换API,而是顺序使用多个API。对于多个API,transforms模块中提供Compose类,对多个API进行打包。

1.使用说明

【实例化】transforms.Compose(transforms)

  • 作用:创建一个由多个图像变换API组成的实例。
  • transforms:transforms列表,由多个图像变换API组成的列表。
  • 例子:
tensor_trans = transforms.ToTensor()  # 创建一个ToTensor实例
trans_resize = transforms.Resize((512, 512))  # 创建一个Resize实例
trans_compose = transforms.Compose([tensor_trans, trans_resize])  # 创建一个Compose实例

【_call_】Compose_object(img)

  • 作用:顺序使用多个图像变换API。
  • img:支持PIL、Tensor格式的图片。
  • 返回值:经过多个操作后的图片结果。
  • 例子:
img_compose = trans_compose(img)  # Tensor + Resize 的操作结合

2.代码实现

from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms


img_path = "data/train/ants_image/0013035.jpg"
img = Image.open(img_path)  # PIL类型的图片数据
print(img.size)
writer = SummaryWriter("logs")

# Compose:顺序使用多个图像变换API,例如先将PIL图片转换为tensor图片,最后变换图片尺寸
tensor_trans = transforms.ToTensor()  # 创建一个ToTensor实例
trans_resize = transforms.Resize((512, 512))  # 创建一个Resize实例
trans_compose = transforms.Compose([tensor_trans, trans_resize])  # 创建一个Compose实例
img_compose = trans_compose(img)  # Tensor + Resize 的操作结合
writer.add_image("Compose", img_compose, 0)
print(img_compose.shape)

writer.close()

控制台输出

(768, 512)
torch.Size([3, 512, 512])

TensorBoard输出
在这里插入图片描述

六、transforms.RandomCrop类的使用

作用:在随机位置裁剪给定图像。

1.使用说明

【实例化】transforms.RandomCrop(size, padding=None, pad_if_needed=False, fill=0, padding_mode=“constant”)

  • 作用:创建一个在随机位置裁剪给定图像的实例。
  • size:列表, (h, w);int整形,方形裁剪(size,size)。
  • 例子:
# 创建一个RandomCrop实例,指定值不要超过图片大小,方形裁剪
tans_random = transforms.RandomCrop(200)  
tans_random = transforms.RandomCrop((200, 300))  # 创建一个RandomCrop实例,指定值不要超过图片大小

【torch.nn.Module父类的__call__】RandomCrop_object(img)

  • 作用:调用随机位置裁剪给定图像API。
  • img:支持PIL、Tensor格式的图片。
  • 返回值:经过随机位置裁剪的原格式图片。
  • 例子:
img_crop = tans_random(img)

2.代码实现

from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms


img_path = "data/train/ants_image/0013035.jpg"
img = Image.open(img_path)  # PIL类型的图片数据
writer = SummaryWriter("logs")

# RandomCorp:在随机位置裁剪给定图像。
trans_tensor = transforms.ToTensor()  # 创建一个ToTensor实例
tans_random = transforms.RandomCrop(200)  # 创建一个RandomCrop实例,指定值不要超过图片大小
trans_compose = transforms.Compose([tans_random, trans_tensor])  # 创建一个Compose实例
for i in range(10):
    img_crop = trans_compose(img)  # 输入:PIL图片。RandomCrop + Tensor 的操作结合
    writer.add_image("RandomCrop", img_crop, i)

writer.close()

TensorBoard输出
在这里插入图片描述

总结

  • 关注输入和输出类型多看官方文档
  • 关注方法需要什么参数
  • 不知道返回值的时候
    print()
    print(type())
    Debug

参考

1.[PyTorch 学习笔记] 2.2 图片预处理 transforms 模块机制

2.transforms模块—PyTorch图像处理与数据增强方法

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

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

相关文章

IIC协议初识及OLED写入指令、数据和显示的代码实现

目录 一、IIC协议概述 二、IIC协议起始和终止信号 三、应答信号 四、数据发送的时序 五、OLED写入指令和数据 六、OLED显示一个点的思路 七、OLED显示一个点的代码 八、OLED列地址 九、OLED显示图片 一、IIC协议概述 1、IIC概述 IIC(集成电路总线&#…

UI设计师与UE设计师有什么区别?

设计在我们的生活中扮演着重要的角色,但是面对越来越多的专业术语和相近的岗位职责,人们总是困惑:明明是差不多的岗位,为什么要整那么多的词?其实,在它们神似的外表下,潜藏着巨大的差异&#xf…

虹科分享 | 实时操作系统INtime RTOS第7版功能更新介绍

INtime简介 INtime是专为基于PC的嵌入式解决方案而设计的可扩展实时操作系统,功能包括动态控制多个主机上多个节点(核心)上的进程,以及系统所有节点之间的丰富进程间通信,可应用于多核x86兼容处理器的非对称多处理(AM…

【阶段三】Python机器学习17篇:机器学习项目实战:随机森林回归模型

本篇的思维导图: 项目实战(随机森林回归模型) 项目背景 作为国家的支柱产业,房地产的稳定发展关乎国际民生。近几年,房地产价格飞速上涨,连创新高。在这种情况下研究房价的影响因素,具有重要的理论和现实意义。弄清影响房价的主要经济因素,探究我国房地产投资是…

calc()方法的使用

calc实现css中动态计算 环境 根据元素高度的变化,动态控制padding值 <marquee:name"up index"behavior"scroll"scrolldelay"30"direction"up"v-else-if"item.scrollPocition 3 ? true : false":style"{--positi…

核心乐理---五线谱基础

音符 音符的长度 音符的长度都是相对的定义 一般来说讲全音符设为一拍&#xff0c;但如果将二分音符设为一拍的话&#xff0c;全音符就是两拍 附点音符 可以在音符后跟上一个小点来改变音符的长度&#xff0c;如果一个音符后面跟了n个原点&#xff0c;它的长度就会变为原来的…

【学习记录】阿里云服务器+宝塔

环境&#xff1a;阿里云服务器&#xff0c;linux Centos系统 一、安装宝塔 参考链接&#xff1a;阿里云 ECS 服务器入门使用宝塔安装使用 1、进入云服务器控制台&#xff0c;打开远程连接 2、初次使用&#xff0c;可重置登录密码和连接密码 这是远程连接时需要输入的密码 这…

测试开发基础 | 计算机网络篇(二):物理层与数据链路层

计算机网络知识是自动化测试等技术基础&#xff0c;也是测试面试必考题目。霍格沃兹测试学院特别策划了本系列文章&#xff0c;将带大家一步步夯实计算机网络的基础知识。一、物理层由于物理层知识在互联网软件研发工作中用到的并不多&#xff0c;所以可以仅做一个简单的了解。…

Prompt: No !!!

Prompt is Not Good. Prompt 这个方法实际上并不是很好 Prompt 可以是in-context learning的一种。prompt-based learning has taken NLP by storm!! prompt-based的方法在NLP中引起风暴。但&#xff0c;Prompt-based的方法实际上不太行&#xff1a; 1. Inefficiency: The pro…

基于python的企业编码生成系统 (完整的代码+项目说明)

《企业编码生成系统》程序使用说明 在PyCharm中运行《企业编码生成系统》即可进入如图1所示的系统主界面。在该界面中可以选择要使用功能对应的菜单进行不同的操作。在选择功能菜单时&#xff0c;只需要输入对应的数字即可。 图1 系统主界面 具体的操作步骤如下&#xff1a;…

匿名内部类的理解(java + Android)

是不是有同学跟我一样学了知识&#xff0c;不使用&#xff0c;一段时间就忘了&#xff1f; 今天说说java的匿名内部类这个东西&#xff0c;今天就因为这个东西被程序媛欺负了&#xff0c;我心里难受啊。 匿名内部类的官方说法特别不容易理解&#xff0c;是从"有没有名字…

全网惟一面向软件测试人员的Python基础教程-在Python中如何把列表当成队列来进行使用?

全网惟一面向软件测试人员的Python基础教程 起点&#xff1a;《python软件测试实战宝典》介绍 第一章 为什么软件测试人员要学习Python 第二章 学Python之前要搞懂的道理 第三章 你知道Python代码是怎样运行的吗&#xff1f; 第四章 Python数据类型中有那些故事呢&#xff1f;…

Linux的SOCKET编程详解(转载)

Linux的SOCKET编程详解1. 网络中进程之间如何通信进 程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行&#xff0c;为保证两个相互通信的进程之间既互不干扰又协调一致工作&#xff0c;操作系统为进程通信提供了相应设施&#xff0c;如UNIX BSD有&#x…

大漠插件最新版7.2302

工具名称:大漠插件最新版7.2302工具简介:/大漠插件v7.2302更新时间2023年1月9日更新内容1. 驱动支持win10(19045)和win11(22621)2. 综合工具增加功能,在定义文字输入框激活时,按下alt会输入最后一次输入的文字/【插件特色】1. 文字识别 领域&#xff0c;目前插件界&#xff0c;…

B. Gardener and the Array(贪心)

传送门题意&#xff1a;给你n个数&#xff0c;问你是否存在不同的两个子区间&#xff0c;使这两个子区间的或结果相同。注&#xff1a;因为数据范围太大&#xff0c;所以每个数都由他的二进制数表示&#xff1a;每一行第一个数m表示有几个二进制数&#xff0c;后面m个数代表2的…

陪诊小程序开发,谁更需要陪诊服务

我们去过医院的都很清楚&#xff0c;医院的看病流程是很繁琐&#xff0c;医院不仅大&#xff0c;科室还划分的又细又多。对于一些在外打拼整天忙的顾不得看病就医的打工人&#xff0c;还有一些跟随子女去异地生活养老就医的老年人&#xff0c;还有一些没人陪伴独居生活的年轻人…

89、【栈与队列】leetcode ——101. 对称二叉树:先序递归与非递归+层次遍历(C++版本)

题目描述 原题链接&#xff1a;101. 对称二叉树 解题思路 一、先序遍历 1、递归 设置两个指针进行遍历对比&#xff0c;分别指向互相对称位置&#xff1a;左子树的左孩子与右子树的右孩子互对称&#xff0c;左子树的右孩子与右子树的左孩子互对称。 每次遍历前先判定对称位…

【源码解析】Springboot整合ElasticSearch客户端的源码解析

Springboot整合ElasticSearch客户端的源码解析 ElasticSearch版本 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId><version>2.2.5.RELEASE</version>&…

[蓝桥杯 2022 国 A] 环境治理(C++,Floyd,二分法)

题目描述 LQ 国拥有 nnn 个城市&#xff0c;从 000 到 n−1n - 1n−1 编号&#xff0c;这 nnn 个城市两两之间都有且仅有一条双向道路连接&#xff0c;这意味着任意两个城市之间都是可达的。每条道路都有一个属性 DDD&#xff0c;表示这条道路的灰尘度。当从一个城市 A 前往另…

linux 中用rancher k8s 部署springboot项目

前期条件: linux--》ECS服务器: rancher集群: 操作流程: 1、制作简单springboot项目使用docker生成镜像项目端口:8080并写一个测试controller