11.常见的Transforms(二)

常见的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.mfbz.cn/a/753825.html

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

相关文章

css做旋转星球可举一反三

<!DOCTYPE html> <html lang"en"><head> <meta charset"UTF-8" /> <title>旋转的星球</title> <style type"text/css">.box {/*position: relative;*/position: absolute;width: 139px;height: 139p…

ASUS/华硕幻13 2022 GV301R系列 原厂Windows11系统

安装后恢复到您开箱的体验界面&#xff0c;带原机所有驱动和软件&#xff0c;包括myasus mcafee office 奥创等。 最适合您电脑的系统&#xff0c;经厂家手调试最佳状态&#xff0c;性能与功耗直接拉满&#xff0c;体验最原汁原味的系统。 原厂系统下载网址&#xff1a;http:…

pdf合并,这三种方法学会了吗?

在信息爆炸的时代&#xff0c;PDF文档凭借其跨平台、不易修改的特性&#xff0c;成为了我们工作和学习中不可或缺的一部分。然而&#xff0c;当面对多个PDF文件需要合并成一个完整的文档时&#xff0c;许多人可能会感到头疼。今天&#xff0c;就让我们一起来探讨三种高效的PDF合…

【python】socket通信代码解析

目录 一、socket通信原理 1.1 服务器端 1.2 客户端 二、socket通信主要应用场景 2.1 简单的服务器和客户端通信 2.2 并发服务器 2.3 UDP通信 2.4 文件传输 2.5 HTTP服务器 2.6 邮件发送与接收 2.7 FTP客户端 2.8 P2P文件共享 2.9 网络游戏 三、python中Socket编…

戴尔md3400存储控制器脱机故障 电池故障处理

看了一下网上关于DELL MD系列存储故障处理的文档还是比较少的&#xff0c;最近处理了一些关于MD系列存储的问题&#xff0c;稍微整理整理就分享一下&#xff0c;各位喜欢摸索的朋友可以稍稍做些参考&#xff0c;当然如果想寻求外援的也可以快速的找到合适的人。以便安全又快捷的…

SBTI(科学碳目标)认证是什么?

SBTI认证&#xff0c;全称为“科学基础目标设置倡议”&#xff08;Science-Based Targets initiative&#xff09;认证&#xff0c;是一种广泛认可的企业可持续发展标准。以下是关于SBTI认证的详细解释&#xff1a; 一、认证目标 SBTI认证旨在推动企业采取可持续的经营实践&a…

Android进阶之路 - DialogFragment有没有了解的必要?

几个月前写到了弹框业务&#xff0c;以前经常用Dialog、ButtomDialog 、popupWindow 组件&#xff0c;为了契合项目结构参考了原有的 DialogFragment 组件&#xff0c;特此予以记录 我一般在项目中写弹框组件的话&#xff0c;主要用到 alertDialog、popupWindow 组件&#xff0…

S32K3 工具篇2:如何在S32DS中使用Segger JLINK下载

S32K3 工具篇2&#xff1a;如何在S32DS中使用Segger JLINK下载 一&#xff0c; S32DS中JLINK下载1.1 Segger JLINK 驱动1.2 S32DS JLINK驱动路径配置1.3 S32DS JLINK debug configuration1.4 S32DS JLINK debug S32K3板子结果 二&#xff0c; JLINK驱动实现S32K344代码下载2.1 …

【Sublime】Sublime Text 中运行终端

Sublime Text 本身并不是一个终端仿真器&#xff0c;可以使用插件来在 Sublime Text 中集成终端功能。最常用的插件之一是“Terminal”。 使用“Terminal”插件在 Sublime Text 中启动终端 以下是安装和使用该插件的步骤&#xff1a; 安装 Package Control&#xff1a; 如果你…

【IJCAI2024】LeMeViT: Efficient Vision Transformer with Learnable Meta Tokens

【IJCAI2024】LeMeViT: Efficient Vision Transformer with Learnable Meta Tokens for Remote Sensing Image Interpretation 论文&#xff1a;https://arxiv.org/abs/2405.09789 代码&#xff1a;https://github.com/ViTAE-Transformer/LeMeViT 由于相邻像素和图像块之间的高…

Thermo Fisher Scientific赛默飞检测扫描架IPC电路板维修WAH402290

美国Thermo Fisher赛默飞世尔光谱仪IS10 IS5光谱仪主板维修iCAP6000/iCAP7000/iCAP7400&#xff1b;热电质朴分析仪电路板维修 公司仪器维修设备备有三相交流电源,变频电源&#xff0c;无油空压气源&#xff0c;标准化的维修平台、电子负载&#xff0c;耐压测试仪、老化台车和各…

云动态摘要 2024-06-28

给您带来云厂商的最新动态&#xff0c;最新产品资讯和最新优惠更新。 最新优惠与活动 [新客专享]WeData 限时特惠 腾讯云 2024-06-21 数据分类分级管理&#xff0c;构建数据安全屏障 &#xff0c;仅需9.9元&#xff01; 云服务器ECS试用产品续用 阿里云 2024-04-14 云服务器…

量化投资 日周月报 2024-06-28

文章 深度学习在量化交易中的应用:在BigQuant量化交易平台的文章中,探讨了深度学习在量化交易中,特别是在因子挖掘方面的应用。文章提到,随着传统线性模型的潜力逐渐枯竭,非线性模型逐渐成为量化交易的主要探索方向。深度学习因其对非线性关系的拟合能力,在量化交易中展现…

华为面试题及答案——机器学习(二)

21. 如何评价分类模型的优劣? (1)模型性能指标 准确率(Accuracy): 定义:正确分类的样本数与总样本数之比。适用:当各类样本的数量相对均衡时。精确率(Precision): 定义:预测为正类的样本中实际为正类的比例。适用:当关注假阳性错误的成本较高时(例如垃圾邮件检测…

firewalld(3)zone配置

简介 前面文章我们已经介绍了firewalld的安装,配置文件介绍、简单的规则查询,本篇文章主要介绍zone的配置。前面我们介绍了firewalld默认的zone和不同zone的功能,下面我们就直接进入zone的具体配置使用。 配置zone的方式 图形配置工具 firewall-config: 这是一个图形…

SAP PP学习笔记24 - 生产订单(制造指图)的创建

上面两章讲了生产订单的元素。 SAP PP学习笔记22 - 生产订单&#xff08;制造指图&#xff09;的元素1-CSDN博客 SAP PP学习笔记23 - 生产订单&#xff08;制造指图&#xff09;的元素2 - 决济规则(结算规则)-CSDN博客 这一章讲生产订单的创建。比如 - 生产订单的流程&#…

Unity Animator 运行时修改某个动画状态的播放速度

1.添加动画参数&#xff0c;选择需要动态修改速度的动画状态 2.在属性面板种设置速度倍速参数

three.js场景三元素

three.js是一个基于WebGL的轻量级、易于使用的3D库。它极大地简化了WebGL的复杂细节&#xff0c;降低了学习成本&#xff0c;同时提高了性能。 three.js的三大核心元素&#xff1a; 场景&#xff08;Scene&#xff09; 场景是一个三维空间&#xff0c;是所有物品的容器。可以将…

Java集合实例

一、什么是Java集合实例&#xff1a; 指的是在 Java 程序中创建和使用的集合对象&#xff0c;这些对象用于存储和操作数据。Java 集合框架提供了一系列的接口和实现类&#xff0c;用于管理不同类型的数据集合。 二、Java集合的主要实例类型&#xff1a; 1. List&#xff08;列…

uni-app uni-data-picker级联选择器无法使用和清除选中的值

出现问题&#xff1a; 使用点击右边的叉号按钮无法清除已经选择的uni-data-picker值 解决办法&#xff1a; 在uni-app uni-data-picker使用中&#xff0c;要添加v-model&#xff0c;v-model在官网的示例中没有体现&#xff0c;但若不加则无法清除。 <uni-data-picker v-m…