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,先查看一下原本的sizetrans_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 Imagewriter.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 ToPILImagewriter = 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,先查看一下原本的sizetrans_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 Imagewriter.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.mzph.cn/web/36065.shtml

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

相关文章

vue-cli的搭建过程

一、创建一个vue2的项目 二、创建成功后删除这三个文件 三、新建一个App.vue文件 四、在文件中添加这一段话 五、打开命令框输入指令下载router路由 六、新建一个router目录,新建index.js文件 七、导入你的路由,进行配置 打开命令行工具,进入…

【LeetCode】一、数组相关:双指针算法 + 置换

文章目录 1、算法复杂度1.1 时间复杂度1.2 空间复杂度 2、数组3、leetcode485:最大连续1的个数4、leetcode283:移动05、leetcode27:移除元素 1、算法复杂度 1.1 时间复杂度 算法的执行时间与输入值之间的关系(看代码实际总行数的…

hive零基础入门

1、hive简介 hive:由facebook开源用于解决海量结构化数据的统计工具。 hive是基于Hadoop的数据仓库工具,可以将结构化的数据文件映射为一张表,并提供sql查询功能。 2、hive本质 hive的本质是HQL(HiveSQL)转化成MapR…

java 统计xmind的结点数(测试用例case数)

mac电脑解压出来的xmind的数据主要在content.json上 开头结尾有[],里面是json import org.json.JSONArray; import org.json.JSONObject; import java.io.*; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream;public class XMindLeafCounter2 {public stat…

PlatformIO开发环境

PlatformIO是一个开源的生态系统,用于构建物联网应用,它支持多种微控制器(MCU)和硬件开发板,并且与各种IDE集成良好,如VSCode, Atom等,使得跨平台的固件开发变得更加简单和高效。 ### 平台介绍…

数据库自动备份到gitee上,实现数据自动化备份

本人有个不太好的习惯,每次项目的数据库都是在线上创建,Navicat 连接线上数据库进行处理,最近有一个项目需要二次升级,发现老项目部署的服务器到期了,完蛋,数据库咩了!!!…

一篇文章教会你【elementUI搭建使用】

Element,一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组 件库. 安装 ElementUI npm i element-ui -S 在 main.js 中写入以下内容: import ElementUI from element-ui; import element-ui/lib/theme-chalk/index.css; Vue.use(Eleme…

【漏洞复现】金和OA 任意文件上传

【产品介绍】 金和OA协同办公管理系统C6软件(简称金和OA),本着简单、适用、高效的原则,贴合企事业单位的实际需求,实行通用化、标准化、智能化、人性化的产品设计,充分体现企事业单位规范管理、提高办公效…

老生常谈问题之什么是缓存穿透、缓存击穿、缓存雪崩?举个例子你就彻底懂了!!

老生常谈问题之什么是缓存穿透、缓存击穿、缓存雪崩?举个例子你就彻底懂了!! 缓存穿透发生场景解决方案 缓存击穿解决方案 缓存雪崩发生场景解决方案 总结三者区分三者原因三者解决方案 想象一下,你开了一家便利店,店里…

Unity3D Text使用超链接跳转事件

系列文章目录 Unity工具 文章目录 系列文章目录👉前言👉一、第一种使用TextMeshPro加入超链接👉二、继承Text组件,重载OnPopulateMesh方法👉三.壁纸分享👉总结 👉前言 有时候会用到跳转的问题,所以添加一…

【Python机器学习实战】 | 基于支持向量机(Support Vector Machine, SVM)进行分类和回归任务分析

🎩 欢迎来到技术探索的奇幻世界👨‍💻 📜 个人主页:一伦明悦-CSDN博客 ✍🏻 作者简介: C软件开发、Python机器学习爱好者 🗣️ 互动与支持:💬评论 &…

一个AI图片生成工具导航网站

上周末上线了一个AI图片生成工具导航网站,主要是面向AI图片工具这个垂直领域。 https://chatgpt-image-generator.com/ 目标是通过收集当下的一些工具,然后进行分类管理,一方面方便大家发现新的工具,另一方面能够更加有针对性、…

华为OceanStor磁盘阵列存储恢复出厂设置命令 LUN不处于在线状态,不能执行此操作解决方案

环境 OceanStor S2600T V2老版本 客户现场有一台Oceanstor 2600 V2的存储,因和另一台磁盘扩展框做了跨设备LUN需要进行配置清除,配置结束后需要重新划分存储空间并对接服务器,保证业务能够正常上线!在清除配置回退的过程中&#…

G8 - ACGAN

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 目录 模型结构 模型结构 之前几期打卡中,已经介绍过GAN CGAN SGAN,而ACGAN属于上述几种GAN的缝合怪,其模型的结构图如下&a…

Python 中的抽象语法树

Abstract Syntax Trees in Python 注:机翻,未校对。 Requirement: All examples are compatible with at least Python v3.6, except for using ast.dump() with the attribute indent which has been added in Python v3.9. 要求:所有示例至…

第二十课,认识列表与定义列表

一,列表的作用 思考一个问题:如果我想要在程序中,记录5名学生的信息,如姓名。 如何做呢? 这就是列表的作用,能帮助我们更加高效的存储各种数据 思考:如果一个班级100位学生,每个人…

利用SHAP算法解释BERT模型的输出

1 何为SHAP? 传统的 feature importance 只告诉哪个特征重要,但并不清楚该特征如何影响预测结果。SHAP 算法的最大优势是能反应每一个样本中特征的影响力,且可表现出影响的正负性。SHAP算法的主要思想为:控制变量法,如果某个特征…

VMware完美安装Ubuntu20.04

一、官网下载Ubuntu20.04 下载地址为:https://releases.ubuntu.com/https://releases.ubuntu.com/ 下载完后镜像为ubuntu-20.04.4-desktop-amd64.iso 二、Ubuntu安装 2.1、打开VMware player,并创建新虚拟机。 2.2、点击浏览按钮选择需要安装的镜像 2…

Linux系统上部署Whisper。

Whisper是一个开源的自动语音识别(ASR)模型,最初由OpenAI发布。要在本地Linux系统上部署Whisper,你可以按照以下步骤进行: 1. 创建虚拟环境 为了避免依赖冲突,建议在虚拟环境中进行部署。创建并激活一个新…

ElementUI组件

目录 1、安装ElementUI 2、在main.js文件中加入 3、使用组件 终端运行: Element,一套为开发者、设计师和产品经理准备的基于Vue2.0的桌面端组件库. 1、安装ElementUI 控制台输入 npm i element-ui -S 2、在main.js文件中加入 import ElementUI from…