11.常见的Transforms(二)

news2024/12/29 9:11:41

常见的Transforms(二)

1.Resize() 的使用

1.1 作用

resize可以把输入的图片按照输入的参数值重新设定大小。

1.2 所需参数

需要输入想要重新设定的图片大小。

输入的参数类型可以为包含长和宽数值的一个序列(h,w)或者一个整数x。

  • 如果输入的参数是一个序列,即长和宽两个整数,则图像会按该长和宽进行resize。
  • 如果输入的参数是一个整数x,将图片短边缩放至x,长宽比保持不变。
  • 序列:(h,w)高度,宽度
  • **一个整数:**不改变高和宽的比例,只单纯改变最小边和最长边之间的大小关系。之前图里最小的边将会匹配这个数(等比缩放)

新版的resize的输入图形类型可以是PIL型或者tensor型

注意:

输出图像可能根据其类型不同而不同:当下采样时,PIL图像的插值和张量略有不同,因为PIL应用了抗锯齿。这可能会导致显著的差异在网络的性能中。因此,最好是训练和服务一个具有相同输入的模型类型。

PyCharm小技巧设置:忽略大小写,进行提示匹配

一般情况下,你需要输入R,才能提示出Resize
我们想设置,即便你输入的是r,也能提示出Resize,也就是忽略了大小写进行匹配提示
File—> Settings—> 搜索case—> Editor-General-Code Completion-去掉Match case前的√—>Apply—>OK

返回值还是 PIL Image

1.3 具体使用

下面给出输入图片类型为PIL和tensor的两张类型的图片resize,使用的图片为狗狗图片,原大小为960*600,resize的输入参数为一个序列(512,512),即经过resize后图片会被缩放成长和宽均为512的正方形大小。

第一种方法
  1. 将PIL型图片resize
  2. 将resize后的PIL型图片转换为tensor进行输出
# Resize的使用
print(img.size)  # 直接用上面的PIL.Image格式的img,先查看一下原本的size

trans_resize = transforms.Resize((512, 512)) #resize图形为512*512
# img:PIL --> resize --> img_resize:PIL
img_resize = trans_resize(img)  # 输出还是PIL Image

# img_resize:PIL --> totensor --> img_resize:tensor(同名,覆盖)
img_resize = trans_totensor(img_resize)

writer.add_image("Resize", img_resize, 0)
print(img_resize)

image-20240627041051139

运行后,在 Terminal 里输入:

tensorboard --logdir=logs

打开tensorboard查看,图片resize后进行了缩放

image-20240627040705680

第二种方法
  1. 将PIL型图片先转换为tensor型
  2. 将tensor型图片进行resize
#法二,先将PIL型图片先转换为tensor型,再将tensor型图片进行resize
#把PIL转换为tensor类型
trans_totensor_tool = transforms.ToTensor()
img_tensor = trans_totensor_tool(img)
#resize
trans_resize_tool = transforms.Resize((512,512))
img_tensor_resized = trans_resize_tool(img_tensor)
#输出
writer.add_image("resize2",img_tensor_resized)

刷新tensorboard,可以看到图片经过resize后进行了缩放

image-20240627041512687

1.4输出结果

原始图像:889*500大小,为长方形。

resize后:可以看到两次操作都把图像缩放成了512*512的正方形大小。

2.Compose() 的使用

2.1 作用

可以把几个tranforms组合在一起使用,相当于一个组合器,可以对输入图片一次进行多个transforms的操作。

2.2 参数介绍

Compose() 中的参数需要是一个列表,Python中列表的表示形式为[数据1,数据2,…]

在Compose中,数据需要是transforms类型,所以得到Compose([transforms参数1,transforms参数2,…])

参数1的输出类型必须与参数2的输入类型匹配。 因为compose的工作顺序是从左到右的,第一个参数transform介绍之后再进行第二个transform的操作,所以需要前一个的输出和后一个的输入匹配。

2.3 Compose和Resize的结合使用

我们结合上面resize的学习进行一个compose的使用,这次resize的参数只输入一个数字,512,即会等比例缩放为短边为512大小的图片。

compose负责把ToTensor和resize组合起来,一步到位实现PIL图形到resize后的tensor图形的转换。

# Compose的使用(结合上面resize的学习进行一个compose的使用)
#创建resize工具trans_resize_2,totensor工具直接用上面创建好的trans_totensor即可
trans_resize_2 = transforms.Resize(512)  # 将图片短边缩放至512,长宽比保持不变

# PIL --> resize --> PIL --> totensor --> tensor
# compose()就是把两个参数功能整合,第一个参数是改变图像大小,第二个参数是转换类型,前者的输出类型与后者的输入类型必须匹配
trans_compose1 = transforms.Compose([trans_resize_2, trans_totensor])
#为测试参数顺序对compose的影响,写了第2个compose,调换了ToTensor和resize的顺序
trans_compose2 = transforms.Compose([trans_totensor,trans_resize_2,])
# 分别用两个cmpose进行图形转换
img_resize_2 = trans_compose1(img)  # 输入需要是PIL Image,第一个compose
img_resize_3 = trans_compose2(img) #第二个compose
writer.add_image("compose",img_resize_2)
writer.add_image("compose", img_resize_3, 1)

image-20240627044247429

注:

为了测试参数顺序对compose的影响,代码中我写了2个compose,分别调换了ToTensor和resize的顺序,结果完全一致,这是因为ToTensor的输出tensor可以作为resize的输入,而resize的输出PIL也可以作为ToTensor的输入,因此无影响。

2.4 结果

运行后,刷新tensorboard,对比step0,step1,图像没有差别,如期进行了缩放

image-20240627044620874

image-20240627044510769

3.RandomCrop() 的使用

3.1 作用

输入PIL Image,把图像按照随机位置进行裁剪。

3.2 参数介绍

参数需要输入想要裁剪成的图片大小。

  • sequence:如果输入的是序列(h,w),会按照该长和宽进行裁剪。
  • int:如果输入的是一个整数x,则会按照(x,x)的大小裁剪,注意x不能超过待处理图片的短边大小。

(1)以 int 为例:

#RandomCrop()的使用
trans_random = transforms.RandomCrop(500)
trans_compose3 = transforms.Compose([trans_random,trans_totensor])
for i in range(10):  #裁剪10个
    img_crop = trans_compose3(img)  # 输入需要是PIL Image
    writer.add_image("RandomCrop",img_crop,i)

image-20240627044952598

输出结果:

image-20240627045347594

(2)以 sequence 为例:

#RandomCrop()的使用,以 sequence 为例
trans_random = transforms.RandomCrop((200,500))
trans_compose_4 = transforms.Compose([trans_random,trans_totensor])
for i in range(10):  #裁剪10个
    img_crop = trans_compose_4(img)
    writer.add_image("RandomCropHW",img_crop,i)

输出结果:

image-20240627045904378

总结

1.关注输入和输出类型

2.多看官方文档

3.关注方法需要什么参数:参数如果设置了默认值,保留默认值即可,没有默认值的需要指定(看一下要求传入什么类型的参数)

4.不知道变量的输出类型可以

直接print该变量
print(type()),看结果里显示什么类型
断点调试 dubug

最后要 totensor,在 tensorboard 看一下结果(tensorboard需要tensor数据类型进行显示)

UsefulTransforms.py完整代码

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

writer = SummaryWriter("logs")
img = Image.open("image/pytorch.png") #创建PIL类型图片
print(img)  # 可以看到类型是PIL

# ToTensor的使用
trans_totensor = transforms.ToTensor()  # 将类型转换为tensor
img_tensor = trans_totensor(img)  # img变为tensor类型后,就可以放入TensorBoard当中
writer.add_image("ToTensor", img_tensor)

# ToPILImage的使用
imagePIL = ToPILImage()(img_tensor)
print(imagePIL)
print(img_tensor)

#Normalize的使用,,需要输入均值mean和标准差std
print(img_tensor[0][0][0])  # 第0层第0行第0列
trans_norm = transforms.Normalize([6,3,2],[9,3,5])  # mean,std,因为图片是RGB三信道,故传入三个数
img_norm = trans_norm(img_tensor)  # 参数输入的类型要是tensor
print(img_norm[0][0][0])
writer.add_image("Normalize",img_norm,2)#第二步

# Resize的使用
#法一,先将PIL型图片resize,再将resize后的PIL型图片转换为tensor进行输出
print(img.size)  # 直接用上面的PIL.Image格式的img,先查看一下原本的size

trans_resize = transforms.Resize((512, 512)) #resize图形为512*512
# img:PIL --> resize --> img_resize:PIL
img_resize = trans_resize(img)  # 输出还是PIL Image

# img_resize:PIL --> totensor --> img_resize:tensor(同名,覆盖)
img_resize = trans_totensor(img_resize)

writer.add_image("Resize", img_resize, 0)
print(img_resize)

#法二,先将PIL型图片先转换为tensor型,再将tensor型图片进行resize
#把PIL转换为tensor类型
trans_totensor_tool = transforms.ToTensor()
img_tensor = trans_totensor_tool(img)
#resize
trans_resize_tool = transforms.Resize((512,512))
img_tensor_resized = trans_resize_tool(img_tensor)
#输出
writer.add_image("resize2",img_tensor_resized)

# Compose的使用(结合上面resize的学习进行一个compose的使用)
#创建resize工具trans_resize_2,totensor工具直接用上面创建好的trans_totensor即可
trans_resize_2 = transforms.Resize(512)  # 将图片短边缩放至512,长宽比保持不变

# PIL --> resize --> PIL --> totensor --> tensor
# compose()就是把两个参数功能整合,第一个参数是改变图像大小,第二个参数是转换类型,前者的输出类型与后者的输入类型必须匹配
trans_compose1 = transforms.Compose([trans_resize_2, trans_totensor])
#为测试参数顺序对compose的影响,写了第2个compose,调换了ToTensor和resize的顺序
trans_compose2 = transforms.Compose([trans_totensor,trans_resize_2,])
# 分别用两个cmpose进行图形转换
img_resize_2 = trans_compose1(img)  # 输入需要是PIL Image,第一个compose
img_resize_3 = trans_compose2(img) #第二个compose
writer.add_image("compose",img_resize_2)
writer.add_image("compose", img_resize_3, 1)

#RandomCrop()的使用,以 int 为例
trans_random = transforms.RandomCrop(500)
trans_compose3 = transforms.Compose([trans_random,trans_totensor])
for i in range(10):  #裁剪10个
    img_crop = trans_compose3(img)  # 输入需要是PIL Image
    writer.add_image("RandomCrop",img_crop,i)

#RandomCrop()的使用,以 sequence 为例
trans_random = transforms.RandomCrop((200,500))
trans_compose_4 = transforms.Compose([trans_random,trans_totensor])
for i in range(10):  #裁剪10个
    img_crop = trans_compose_4(img)
    writer.add_image("RandomCropHW",img_crop,i)

writer.close()

)

#RandomCrop()的使用,以 sequence 为例
trans_random = transforms.RandomCrop((200,500))
trans_compose_4 = transforms.Compose([trans_random,trans_totensor])
for i in range(10): #裁剪10个
img_crop = trans_compose_4(img)
writer.add_image(“RandomCropHW”,img_crop,i)

writer.close()


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

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

相关文章

grpc学习golang版( 八、双向流示例 )

系列文章目录 第一章 grpc基本概念与安装 第二章 grpc入门示例 第三章 proto文件数据类型 第四章 多服务示例 第五章 多proto文件示例 第六章 服务器流式传输 第七章 客户端流式传输 第八章 双向流示例 文章目录 一、前言二、定义proto文件三、编写server服务端四、编写client客…

远程监控在工业机械安全操作中的应用——以汽车起重机为例

远程监控技术,作为现代信息技术的重要分支,正逐渐在各个领域展现其独特的价值。从字面上理解,远程监控可以分为“监”和“控”两部分:其中,“监”指的是通过网络进行信息的获取与传递,实现远程状态的实时感…

Dominate_一个用于生成和操作 HTML 文档的 Python 库

目录 01初识 Dominate 什么是 Dominate? 为什么选择 Dominate? 安装与配置 02Dominate 的基本使用 创建简单的 HTML 文档 添加表格 嵌套结构 03Dominate 的高级功能 动态内容生成 使用…

第十九课,编写并调用自定义函数

一,函数五大组成部分 因为其重要性故再此强调,参数列表可以为任意个数,返回值只能有一个(请初学者暂时这样认为) 特殊的,如果不需要返回结果,用None替代! 二,编写自定义…

JDK线程池ThreadPoolExecutor运行原理详解

jdk线程池,是java后端处理异步任务的主要解决方案,使用广泛。jdk线程池相关的面经,网上很多,但是鱼龙混杂,很多瞎写的。要想真正了解原理,还是要看源码。所以,写一篇文章,深入的了解一下 文章目…

web项目打包成可以离线跑的exe软件

目录 引言打开PyCharm安装依赖创建 Web 应用运行应用程序打包成可执行文件结语注意事项 引言 在开发桌面应用程序时,我们经常需要将网页集成到应用程序中。Python 提供了多种方法来实现这一目标,其中 pywebview 是一个轻量级的库,它允许我们…

【渗透工具】内网多级代理工具Venom详细使用教程

免责申明 本公众号的技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息…

SecureBoost:一种无损的联邦学习框架

SecureBoost:一种无损的联邦学习框架 文章目录 SecureBoost:一种无损的联邦学习框架1 引言2 预备知识与相关工作3 问题描述4 联邦学习与SecureBoost5 联邦推理6 无损属性的理论分析7 安全讨论8 实验9 结论 摘要——用户隐私保护是机器学习中的一个重要问…

MySQL高级-SQL优化- limit优化(覆盖索引加子查询)

文章目录 0、limit 优化0.1、从表 tb_sku 中按照 id 列进行排序,然后跳过前 9000000 条记录0.2、通过子查询获取按照 id 排序后的第 9000000 条开始的 10 条记录的 id 值,然后在原表中根据这些 id 值获取对应的完整记录 1、上传5个sql文件到 /root2、查看…

AV Foundation学习笔记二 - 播放器

ASSets AVFoundation框架的最核心的类是AVAsset,该类是整个AVFoundation框架设计的中心。AVAsset是一个抽象的(意味着你不能调用AVAsset的alloc或者new方法来创建一个AVAsset实例对象,而是通过该类的静态方法来创建实例对象)、不…

Python:探索高效、智能的指纹识别技术(简单易懂)

目录 概括 导入库 函数一 参数: 函数二 函数三 主函数 运行结果 src: model_base 7.bmp ​编辑 总结 概括 指纹识别是一种基于人体生物特征的身份验证技术。它通过捕捉和分析手指上的独特纹路和细节特征,实现高准确度的身份识别。…

多地高温持续“热力”爆表 约克VRF中央空调带你清凉舒爽一夏

“出门5分钟,流汗2小时”,夏季高温天气,怎一个“热”字了得?6月以来,我国多地迎来高温“炙烤”,全国出现40℃以上高温的范围持续增加,随着中央气象台高温预警持续拉响,人们都很纳闷:…

springboot + Vue前后端项目(第二十一记)

项目实战第二十一记 写在前面1. springboot文件默认传输限制2. 安装视频插件包命令3. 前台Video.vue4. 创建视频播放组件videoDetail.vue5. 路由6. 效果图总结写在最后 写在前面 本篇主要讲解系统集成视频播放插件 1. springboot文件默认传输限制 在application.yml文件中添…

5. Spring IoCDI ★ ✔

5. Spring IoC&DI 1. IoC & DI ⼊⻔1.1 Spring 是什么?★ (Spring 是包含了众多⼯具⽅法的 IoC 容器)1.1.1 什么是容器?1.1.2 什么是 IoC?★ (IoC: Inversion of Control (控制反转))总…

2.用BGP对等体发送路由

2.用BGP对等体发送路由 实验拓扑: 实验要求:用BGP对等体发送路由信息 实验步骤: 1.完成基本配置(略) 2.建立BGP对等体(略) 3.创建路由信息(用创建一个loop back接口就能产生一个直连…

毅速丨金属3D打印是制造业转型升级的重要技术

随着科技的进步,金属3D打印技术已成为制造业升级的重要驱动力。它以其独特的优势,正引领着制造业迈向新的未来。 金属3D打印技术的突破: 设计自由。金属3D打印能制造任意形状和结构的零件,为设计师提供了无限的创意空间。 快速制…

AI数据分析003:用kimi生成一个正弦波数学动画

文章目录 一、正弦波公式二、输入内容三、输出内容一、正弦波公式 ƒ(x) = a * sin(x + x0) + b 公式中: a: 决定正弦函数振动幅度的大小; x0:表示x开始比0拖后的弧度值; b:表示函数偏离X轴的距离; 对于难以理解的学生来说,可以用动画把这个公式直观的展现出来。 二…

深入理解 XML 和 HTML 之间的区别

在现代网络技术的世界中,XML(可扩展标记语言)和 HTML(超文本标记语言) 是两个非常重要的技术。尽管它们都使用标签和属性的格式来描述数据,但它们在形式和用途上有显著的区别。 概述 什么是 XML&#xff…

【51单片机入门】数码管原理

文章目录 前言共阴极与共阳极数码管多个数码管显示原理 总结 前言 在我们的日常生活中,数码管被广泛应用于各种电子设备中,如电子表、计时器、电子钟等。数码管的主要功能是显示数字和一些特殊字符。在这篇文章中,我们将探讨数码管的工作原理…

搭建ASPP:多尺度信息提取网络

文章目录 介绍代码实现 介绍 ASPP(Atrous Spatial Pyramid Pooling),空洞空间卷积池化金字塔。简单理解就是个至尊版池化层,其目的与普通的池化层一致,尽可能地去提取特征。ASPP 的结构如下: 如图所示&…