Transforms的常见用法

2024-09-05 18:20
文章标签 常见 用法 transforms

本文主要是介绍Transforms的常见用法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 一、封装函数与普通函数的用法区别
    • 二、Image.open()打开图片的格式
    • 三、ToTensor打开图片格式
    • 四、ToTensor使用
    • 五、Normalize归一化使用
    • 六、Resize的使用
    • 七、Compose - Resize 使用
    • 八、RandomCrop() 随机裁剪用法

一、封装函数与普通函数的用法区别

class Person:def __call__(self, name):print("__call__" + "Hello" + name)def hello(self,name):print("hello" + name)person = Person()
person("周杰伦")
person.hello("林俊杰")

运行结果:
在这里插入图片描述
注释:

  • 双斜杠"__"封装的函数【 def __call__(self, name):】,在调用的时候直接加参数就可以使用了
    person("周杰伦")
  • 而直接定义的函数,则需要通过 “.” +函数名来进行使用,如person.hello("林俊杰")

二、Image.open()打开图片的格式

from PIL import Image
from torch.utils.tensorboard import SummaryWriterwriter = SummaryWriter("logs")
img = Image.open('Dataset/train/ants/0013035.jpg')
print(img)

运行结果:

在这里插入图片描述
因此可以知道 Image.open()打开图片的格式为PIL形

三、ToTensor打开图片格式

from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision.transforms import transformswriter = SummaryWriter("logs")
img = Image.open('Dataset/train/ants/0013035.jpg')trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)
print(img_tensor)

运行结果:
在这里插入图片描述
注:可以看到最终得到的是 tensor 形

四、ToTensor使用

from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision.transforms import transformswriter = SummaryWriter("logs")
img = Image.open('Dataset/train/ants/0013035.jpg')trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)
writer.add_image("ToTensor",img_tensor)
writer.close()

在终端输入 tensorboard --logdir=logs

得到链接
在这里插入图片描述
点开即可查看照片
在这里插入图片描述

五、Normalize归一化使用

归一化的计算方式:output[channel] = (input[channel] - mean[channel]) / std[channel]

from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision.transforms import transformswriter = SummaryWriter("logs")
img = Image.open('Dataset/train/ants/0013035.jpg')trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)
writer.add_image("ToTensor",img_tensor)
writer.close()#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.close()

运行结果:
在这里插入图片描述
注:最开始是 0.31 ,经过变换之后就变成了 -0.37

将上面的代码进行输出一下

writer.add_image("Normalize",img_norm)

在这里插入图片描述
可以看出图片的改变

六、Resize的使用

先观察Resize的输出类型

from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision.transforms import transformswriter = SummaryWriter("logs")
img = Image.open('Dataset/train/ants/0013035.jpg')trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)
writer.add_image("ToTensor",img_tensor)
writer.close()#Resize
print(img.size)
trans_resize = transforms.Resize((512,512))
img_resize = trans_resize(img)
print(img_resize)writer.close()

运行结果:
在这里插入图片描述
可以知道Resize的输出结果是 PIL形,并且尺寸从(768,512) 变成了现在的 size = 512 x 512

观察图片

from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision.transforms import transformswriter = SummaryWriter("logs")
img = Image.open('Dataset/train/ants/0013035.jpg')trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)
writer.add_image("ToTensor",img_tensor)
writer.close()#Resize
print(img.size)
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,0)print(img_resize)writer.close()

运行结果:
在这里插入图片描述
注:可以看出图片经过了裁剪

七、Compose - Resize 使用

如果给Resize()括号中写一个整数形int,那么图片不会改变高和宽,而是整体进行一个等比缩放
如:trans_resize_2 = transforms.Resize(512)

from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision.transforms import transformswriter = SummaryWriter("logs")
img = Image.open('Dataset/train/ants/0013035.jpg')trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)
writer.add_image("ToTensor",img_tensor)
writer.close()#Resize
print(img.size)
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,0)print(img_resize)writer.close()#Compose - Resize
trans_resize_2 = transforms.Resize(512)# 创建一个transforms.Compose对象,它将多个图像变换操作组合成一个序列
tran_compose = transforms.Compose([trans_resize_2,trans_totensor])img_resize_2 = tran_compose(img)# "Resize"是图像的标签,img_resize_2是经过变换的图像,1是图像在TensorBoard中的步数(step)
writer.add_image("Resize",img_resize_2,1)

注:Compose方法要求前面的输出做后面的输入,比方说tran_compose = transforms.Compose([trans_resize_2,trans_totensor]),前面的输出类型是PIL形,故要求后面的输入也要是PIL形,所以可以直接使用compose
但是如果tran_compose = transforms.Compose([trans_totensor,trans_resize_2]),也就是前面的输出是totensor形,但是后面的输入要求PIL形,这样子进行compose的话就会产生报错。

运行结果:
在这里插入图片描述

八、RandomCrop() 随机裁剪用法

from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision.transforms import transformswriter = SummaryWriter("logs")
img = Image.open('Dataset/train/ants/0013035.jpg')trans_totensor = transforms.ToTensor()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()

运行结果:
在这里插入图片描述
在这里插入图片描述

自己设置高和宽:

**from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision.transforms import transformswriter = SummaryWriter("logs")
img = Image.open('Dataset/train/ants/0013035.jpg')trans_totensor = transforms.ToTensor()
#设置高为50,宽为100
trans_random = transforms.RandomCrop((50, 100))
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()**

运行结果:
在这里插入图片描述

这篇关于Transforms的常见用法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1139712

相关文章

bytes.split的用法和注意事项

当然,我很乐意详细介绍 bytes.Split 的用法和注意事项。这个函数是 Go 标准库中 bytes 包的一个重要组成部分,用于分割字节切片。 基本用法 bytes.Split 的函数签名如下: func Split(s, sep []byte) [][]byte s 是要分割的字节切片sep 是用作分隔符的字节切片返回值是一个二维字节切片,包含分割后的结果 基本使用示例: pa

JVM 常见异常及内存诊断

栈内存溢出 栈内存大小设置:-Xss size 默认除了window以外的所有操作系统默认情况大小为 1MB,window 的默认大小依赖于虚拟机内存。 栈帧过多导致栈内存溢出 下述示例代码,由于递归深度没有限制且没有设置出口,每次方法的调用都会产生一个栈帧导致了创建的栈帧过多,而导致内存溢出(StackOverflowError)。 示例代码: 运行结果: 栈帧过大导致栈内存

UVM:callback机制的意义和用法

1. 作用         Callback机制在UVM验证平台,最大用处就是为了提高验证平台的可重用性。在不创建复杂的OOP层次结构前提下,针对组件中的某些行为,在其之前后之后,内置一些函数,增加或者修改UVM组件的操作,增加新的功能,从而实现一个环境多个用例。此外还可以通过Callback机制构建异常的测试用例。 2. 使用步骤         (1)在UVM组件中内嵌callback函

这些ES6用法你都会吗?

一 关于取值 取值在程序中非常常见,比如从对象obj中取值 const obj = {a:1b:2c:3d:4} 吐槽: const a = obj.a;const b = obj.b;const c = obj.c;//或者const f = obj.a + obj.b;const g = obj.c + obj.d; 改进:用ES6解构赋值

模拟实现vector中的常见接口

insert void insert(iterator pos, const T& x){if (_finish == _endofstorage){int n = pos - _start;size_t newcapacity = capacity() == 0 ? 2 : capacity() * 2;reserve(newcapacity);pos = _start + n;//防止迭代

【Kubernetes】常见面试题汇总(三)

目录 9.简述 Kubernetes 的缺点或当前的不足之处? 10.简述 Kubernetes 相关基础概念? 9.简述 Kubernetes 的缺点或当前的不足之处? Kubernetes 当前存在的缺点(不足)如下: ① 安装过程和配置相对困难复杂; ② 管理服务相对繁琐; ③ 运行和编译需要很多时间; ④ 它比其他替代品更昂贵; ⑤ 对于简单的应用程序来说,可能不

【附答案】C/C++ 最常见50道面试题

文章目录 面试题 1:深入探讨变量的声明与定义的区别面试题 2:编写比较“零值”的`if`语句面试题 3:深入理解`sizeof`与`strlen`的差异面试题 4:解析C与C++中`static`关键字的不同用途面试题 5:比较C语言的`malloc`与C++的`new`面试题 6:实现一个“标准”的`MIN`宏面试题 7:指针是否可以是`volatile`面试题 8:探讨`a`和`&a`

常见的服务器

常见的Web服务器 1、Tomcat:Tomcat和Java结合得最好,是Oracle官方推荐的JSP服务器。Tomcat是开源的Web服务器,经过长时间的发展,性能、稳定性等方面都非常优秀。 2、Jetty:另一个优秀的Web服务器。Jetty有个更大的优点是,Jetty可作为一个嵌入式服务器,即:如果在应用中加入Jetty的JAR文件,应用可在代码中对外提供Web服务。 3、Resin:

【Kubernetes】常见面试题汇总(一)

目录 1.简述 etcd 及其特点? 2.简述 etcd 适应的场景? 3.简述什么是Kubernetes? 4.简述 Kubernetes和 Docker的关系? 1.简述 etcd 及其特点? (1)etcd 是Core0s 团队发起的开源项目,是一个管理配置信息和服务发现(service discovery)的项目,它的目标是构建一个高可用的分布式键值(keyvalue)数据

2021-8-14 react笔记-2 创建组件 基本用法

1、目录解析 public中的index.html为入口文件 src目录中文件很乱,先整理文件夹。 新建components 放组件 新建assets放资源   ->/images      ->/css 把乱的文件放进去  修改App.js 根组件和index.js入口文件中的引入路径 2、新建组件 在components文件夹中新建[Name].js文件 //组件名首字母大写