Pytorch学习:torchvison.transforms常用包(ToTensor、Resize、Compose和RandomCrop)

news2024/12/28 9:09:18

transforms常用包

    • 1. torchvision.transforms.ToTensor
    • 2. torchvision.transforms.Resize
    • 3. torchvision.transforms.Compose
    • 4. torchvision.transforms.Normalize
    • 5. torchvision.transforms.RandomCrop

1. torchvision.transforms.ToTensor

将PIL Image或ndarray转换为张量并相应缩放值。

官方文档:torchvision.transforms.ToTensor
CLASS torchvision.transforms.ToTensor

  • 将PIL Image或ndarray转换为张量并相应缩放值
  • 此转换不支持torchscript
  • 如果PIL Image属于其中一种模式(L、LA、P、I、F、RGB、YCbCr、RGBA、CMYK、1)或numpy. ndarray的dtype = np.uint8,则将范围[0,255]的PIL Image或numpy.ndarray(H x W x C)转换为范围[0.0,1.0]的形状(C x H x W)的火炬.FloatTensor
  • 在其他情况下,张量在不缩放的情况下返回。
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms

writer = SummaryWriter("logs")
img = Image.open("image/刻晴.jpg")

# ToTensor
trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)
writer.add_image("ToTensor", img_tensor, 0)

writer.close()

在这里插入图片描述

2. torchvision.transforms.Resize

将输入图像的大小调整为给定大小。
如果图像是torch tensor,则预期其具有[…,H,W]形状,其中…表示任意数量的前导维度。

官方文档:torchvision.transforms.Resize
CLASS torchvision.transforms.Resize(size, interpolation=InterpolationMode.BILINEAR, max_size=None, antialias='warn')
主要参数:

  • size(sequence or int):所需的输出大小。
    • 如果size是一个类似(h,w)的序列,则输出size将与此匹配。
    • 如果size是一个整数,图像的较小边缘将与此数字匹配。即,如果高度>宽度,则图像将被重新缩放为(尺寸 * 高度/宽度,尺寸)。
  • interpolation(InterpolationMode):所需插值枚举。
  • max_size(int,可选):调整大小后的图像的最大长边,如果在根据 size 调整大小之后图像的较长边缘大于 max_size ,则再次调整图像的大小,使得较长边缘等于 max_size 。
  • antialias(bool,optional):是否应用抗锯齿。它只影响具有双线性或双三次模式的张量,否则将被忽略。在PIL图像上,抗锯齿始终应用于双线性或双三次模式;在其他模式下(对于PIL图像和张量),抗锯齿没有意义,并且忽略此参数。(当前默认值为 None )可能的值为:
    • True :将为双线性或双三次模式应用抗锯齿。其他模式不受影响。这可能是你想要使用的。
    • False :在任何模式下都不会对张量应用抗锯齿。PIL图像在双线性或双三次模式下仍然是抗锯齿的,因为PIL不支持抗锯齿。
    • None :相当于张量的 False 和PIL图像的 True 。这个值的存在是由于遗留的原因,除非您真正知道自己在做什么,否则您可能不想使用它。
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms

writer = SummaryWriter("logs")
img = Image.open("image/刻晴.jpg")

# Resize
trans_resize = transforms.Resize((512, 512))
# img PIL -> resize -> img_resize PIL
img_resize = trans_resize(img)
# img_resize PIL -> totensor -> img_resize tensor
img_resize = trans_totensor(img_resize)
writer.add_image("Resize", img_resize, 2)
print(img_resize)

writer.close()

在这里插入图片描述

3. torchvision.transforms.Compose

将多个变换组合在一起。

官方文档: torchvision.transforms.Compose
CLASS torchvision.transforms.Compose(transforms)

  • transforms(list of Transform objects)-要组合的变换列表

代码实现

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

writer = SummaryWriter("logs")
img = Image.open("image/刻晴.jpg")

# Compose - resize - 2
trans_resize_2 = transforms.Resize(512)
# PIL -> PIL -> tensor
trans_compose = transforms.Compose([trans_resize_2, trans_totensor])
img_resize_2 = trans_compose(img)
writer.add_image("Compose", img_resize_2, 3)

writer.close()

在这里插入图片描述

4. torchvision.transforms.Normalize

使用均值和标准差归一化张量图像。此转换不支持PIL图像。
给定平均值: (mean[1],…,mean[n]) 和标准值: (std[1],…,std[n]) 对于 n 通道,该变换将归一化输入 torch.*Tensor 的每个通道,即, output[channel] = (input[channel] - mean[channel]) / std[channel]

官方文档:torchvision.transforms.Normalize
CLASS torchvision.transforms.Normalize(mean, std, inplace=False)
主要参数:

  • mean(sequence):每个通道的均值序列。
  • std(sequence):每个通道的标准偏差序列。
  • inplace(booloptional):使用Bool使此操作就地执行。

代码实现

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

writer = SummaryWriter("logs")
img = Image.open("image/刻晴.jpg")


# Normalize
print(img_tensor[0][0][0])
trans_norm = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
img_norm = trans_norm(img_tensor)
print(img_norm[0][0][0])
writer.add_image("Normalize", img_norm, 1)

writer.close()

在这里插入图片描述

5. torchvision.transforms.RandomCrop

在随机位置裁剪给定的图像。
如果图像是torch tensor,则预计具有[…,H,W]形状,其中…表示任意数量的前导维度,但如果使用非恒定填充,则预计输入最多具有2个前导维度。

官方文档:torchvision.transforms.RandomCrop
CLASS torchvision.transforms.RandomCrop(size, padding=None, pad_if_needed=False, fill=0, padding_mode='constant')
主要参数:

  • size (sequence or int):裁剪的所需输出大小。
    • 如果size是一个int而不是像(h,w)这样的序列,则会进行方形裁剪(size,size)
    • 如果提供长度为1的序列,则将其解释为(size[0],size[0])
  • padding(int or sequence, optional) :可选填充图像的每个边框。默认值为“无”。
    • 如果只提供一个int,则用于填充所有边框。
    • 如果提供长度为2的序列,则这分别是左/右和顶/底上的填充。
    • 如果提供长度为4的序列,则这分别是用于左、上、右和下边界的填充。
  • pad_if_needed (boolean) :如果图像小于所需的大小,它将填充图像,以避免引发异常。由于裁剪是在填充之后完成的,因此填充似乎是在随机偏移处完成的。
  • fill (number or tuple):常量填充的像素填充值。默认值为0。
    • 如果是长度为3的元组,则分别用于填充R、G、B通道。
    • 此值仅在padding_mode为常量时使用。
    • torch张量仅支持数字。PIL图像仅支持int或tuple值。
  • padding_mode (str) :填充类型。应为:恒定、边缘、反射或对称。默认值为常量。
    • constant:填充一个常量值,这个值是用fill指定的
    • edge:填充图像边缘的最后一个值。如果输入一个5D火炬张量,最后3个维度将被填充,而不是最后2个维度
    • reflect:填充图像的反射,而不重复边缘上的最后一个值。例如,在反射模式下,在两侧使用2个元素填充[1,2,3,4]将导致[3,2,1,2,3,4,3,2]
    • 对称:图像反射的焊盘重复边缘上的最后一个值。例如,在对称模式下,在两侧用2个元素填充[1,2,3,4]将导致[2,1,1,2,3,4,4,3]

代码实现

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

writer = SummaryWriter("logs")
img = Image.open("image/刻晴.jpg")


# RandomCrop
trans_random = transforms.RandomCrop(512)
trans_compose_2 = transforms.Compose([trans_random, trans_totensor])
for i in range(10):
    img_crop = trans_compose_2(img)
    writer.add_image("RandomCrop", img_crop, i)

writer.close()

在这里插入图片描述

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

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

相关文章

基于React实现无限滚动的日历详细教程,附源码【手写日历教程第二篇】

前言 最常见的日历大部分都是滚动去加载更多的月份,而不是让用户手动点击按钮切换日历月份。滚动加载的交互方式对于用户而言是更加丝滑和舒适的,没有明显的操作割裂感。 那么现在需要做一个这样的无限滚动的日历,前端开发者应该如何去思考…

【数据结构】实现栈和队列

目录 一、栈1.栈的概念及结构(1)栈的概念(2)栈的结构 2.栈的实现(1)类型和函数的声明(2)初始化栈(3)销毁(4)入栈(5&#x…

在 Redis 中处理键值 | Navicat

Redis 是一个键值存储系统,允许我们将值与键相关联起来。与关系型数据库不同的是, 在Redis 中,不需要使用数据操作语言 (DML) 和查询语法,那么我们如何进行数据的写入、读取、更新和删除操作呢?…

shell 11(shell重定向输入输出)

一、标准输入输出 标准输入介绍 从键盘读取用户输入的数据,然后再把数据拿到Shell程序中使用; 标准输出介绍 Shell程序产生的数据,这些数据一般都是呈现到显示器上供用户浏览查看

go学习一之go的初体验

go语言学习笔记 一、golang初体验: 1.简单体验案例: package main{ //把这个test.go归属到main import "fmt" //引入一个包 func main(){//输出hellofmt.Println("hello world")} }2.从案例学到的知识点: (1) go文件的后缀是.…

【集合学习HashMap】HashMap集合详细分析

HashMap集合详细分析 一、HashMap简介 HashMap 主要用来存放键值对(key-value的形式),它基于哈希表的 Map 接口实现,是常用的 Java 集合之一,是非线程安全的。 HashMap 可以存储 null 的 key 和 value,但 …

nginx基本介绍(安装、常用命令、反向代理)

文章目录 引言一、nginx是什么二、nginx的下载和安装1. 下载2. windows下安装3. 运行4. 外部服务器无法访问问题 三、nginx的常用命令四、nginx.config五、FileZilla1. 什么是FileZilla2. FileZilla的下载和安装 六、反向代理1. 什么是nginx的反向代理2. 反向代理工作流程3. 如…

2023-8-23 连通块中点的数量

题目链接&#xff1a;连通块中点的数量 #include <iostream>using namespace std;const int N 100010;int n, m; int p[N], Size[N], idx;int find(int x) {if(p[x] ! x) p[x] find(p[x]);return p[x]; }int main() {cin >> n >> m;for(int i 1; i <…

七、任务优先级和Tick

1、任务与中断的优先级 (1)相同优先级任务轮流执行。 (2)高优先级任务打断低优先级任务。 (3)中断可以打断所有优先级的任务。 2、任务优先级 (1)优先级的取值范围是&#xff1a;0~(configMAX_PRIORITIES – 1)&#xff0c;数值越大优先级越高。 (2)FreeRTOS会确保最高优…

API 网关基础

目录 一、网关概述二、网关提供的功能三、常见网关系统3.1 Netflix Zuul3.2 Spring Cloud Gateway3.3 Kong3.4 APISIX3.5 Shenyu 一、网关概述 API网关是一个服务器&#xff0c;是系统的唯一入口。 从面向对象设计的角度看&#xff0c;它与外观模式类似。API网关封装了系统内部…

小白带你学习linux的LVS集群(三十六)

一、集群概述 1、负载均衡技术类型 四层负载均衡器 也称为 4 层交换机&#xff0c;主要通过分析 IP 层及 TCP/UDP 层的流量实现基于 IP 加端口的负载均衡&#xff0c;如常见的 LVS、F5 等&#xff1b; 七层负载均衡器 也称为 7 层交换机&#xff0c;位于 OSI 的最高层&#…

机器人力控入门——牛顿欧拉法动力学建模

建立机器人的动力学模型是完成力控的基础&#xff0c;常用的动力学模型建模法有拉格朗日法和牛顿-欧拉法&#xff0c;其中牛顿-欧拉采用递推形式&#xff0c;计算更为简便&#xff0c;使用也更为广泛。本文就来介绍下牛顿-欧拉的动力学建模方法&#xff0c; PS&#xff0c;网上…

C++--动态规划两个数组的dp问题

1.最长公共子序列 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串…

day 37 | ● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

1049. 最后一块石头的重量 II 与前一道分割等和子集的思路差不多&#xff0c;都是01背包问题。因为是采用滚动数组的形式&#xff0c;所以必须要倒序遍历才可以。 dp[i]代表着在i的限制下最大的承重。所以另一半就是all - dp【all / 2】 func lastStoneWeightII(stones []int…

Fabric.js 元素选中状态的事件与样式

本文简介 带尬猴&#xff01; 你是否在使用 Fabric.js 时希望能在选中元素后自定义元素样式或选框&#xff08;控制角和辅助线&#xff09;的样式&#xff1f; 如果是的话&#xff0c;可以放心往下读。 本文将手把脚和你一起过一遍 Fabric.js 在对象元素选中后常用的样式设置…

git 把项目托管到 码云出现的错误集合

分享一下我git项目时碰见的错误 1、error: could not lock config file D:/orcad/Cadence/SPB_Data/.gitconfig: No suchfile or directory 在下载git后设置用户名、邮箱时会出现的错误 需要去修改环境变量&#xff0c;这个之前写好了&#xff0c;可以跳转看看 Git配置error:…

计算机竞赛 基于Django与深度学习的股票预测系统

文章目录 0 前言1 课题背景2 实现效果3 Django框架4 数据整理5 模型准备和训练6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于Django与深度学习的股票预测系统 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff…

js将搜索的关键字加颜色

js将搜索的关键字加颜色 使用正则匹配关键字并加入span标签&#xff0c;页面渲染时使用v-html渲染即可 // 文本框内容 let searchCont 测试;const reg new RegExp((${searchCont.value}), g); let data 图片保存测试A; data data.replace(reg, <span style"color:…

【N年测试总结】测试的分类

一、概述 测试的分类一般有按照测试的内容进行划分和按照测试阶段划分两种大的方式。 按测试内容划分 1、需求测试 2、单元测试 3、接口测试 4、功能测试 5、UI自动化测试 6、性能测试 7、测试开发 按测试阶段划分 1、需求测试 2、单元测试 3、集成测试 4、系统测试 5、验…

C 连接MySQL8

Linux 安装MySQL 8 请参考文章&#xff1a;Docker 安装MySQL 8 详解 Visual Studio 2022 编写C 连接MySQL 8 C源码 #include <stdio.h> #include <mysql.h> int main(void) {MYSQL mysql; //数据库句柄MYSQL_RES* res; //查询结果集MYSQL_ROW row; //记录结…