深度学习(三)——Transforms的使用

一、Transforms的结构及用法

  • 导入transforms
from torchvision import transforms

  • 作用:图片输入transforms后,可以得到一些预期的变换

1. Transforms的python用法

写在前面:tensor数据类型

通过transforms.ToTensor去说明两个问题:第一,transforms该如何使用;第二,Tensor数据类型相较于普通数据类型有什么区别,为什么需要tensor这个数据类型。

(1)将PIL或numpy.ndarray类型的图片转化为tensor数据类型

具体方法:transforms.Totensor()

from torchvision import transforms
tensor_trans=transforms.ToTensor()  #创建transforms.ToTensor()工具
tensor_img=tensor_trans(pic)   #pic为要转化为tensor类的PIL或numpy.ndarray类型的图像数据

举例:

from torchvision import transforms
from PIL import Image

#读入图像如果读取绝对路径要把\改为\\,如果读取相对路径,则没有这样的困扰
img_path="E:\\Desktop\\hymenoptera_data\\hymenoptera_data\\train\\ants\\0013035.jpg"  #图片路径
img=Image.open(img_path)
print(img)

#将PIL类型图片转化为tensor类型的图片
tensor_trans=transforms.ToTensor()
tensor_img=tensor_trans(img)
print(tensor_img)

#将numpy.ndarray类型的图片转化为tensor类型
import cv2
cv_img=cv2.imread(img_path)  #将图片转化为ndarray数据
tensor_cv_img=tensor_trans(cv_img)
print(tensor_cv_img)

补充:如何读取tensor类型的图片数据

  • 方法:同样是上一篇提到的SummaryWriter中的add_image函数。下面是一个代码实例。
from torch.utils.tensorboard import SummaryWriter
writer=SummaryWriter("logs")
writer.add_image("Tensor_img",tensor_img)
writer.close()

(2)为什么需要tensor数据类型?

  • tensor数据类型内部包含了神经网络理论基础需要的一些参数

二、常见的Transforms

功能数据类型对应函数
输入PILImage.open()
输出tensorTotensor()
作用narrayscv.imread()

1. Compose类详解

  • 主要作用:将不同的transforms结合到一起,比如让不同类型的数据先经过一个中心裁剪,再合成一个tensor类型的数据

(1)关于Compose类中__call__函数的一些说明

随便写个类举例子:

class Person:
    def __call__(self, name):
        print("__call__ "+"Hello "+name)

    def hello(self,name):
        print("hello "+name)

person=Person()
person("zhangsan")     #[Run] __call__ Hello zhangsan
person.hello("lisi")   #[Run] hello lisi

总结:

  • 像def __call__这样的函数是不需要用”.函数名“这样的方式去调用的,可以直接使用”对象名(参数)“这样的方法去调用

  • 但def hello这样的函数需要用”对象名.函数(参数)“的形式调用

(2)Compose调用例子

from torchvision import transforms
img=transforms.compose([transforms.CenterCrop(10),transforms.ToTensor()])

2. ToTensor类详解

  • 上面有提到,Totensor的主要作用为将图像数据转化为tensor类型

(1)ToTensor输入数据类型

只支持输入以下两类的数据:

  • PIL类型的图像数据

  • numpy.ndarray类型的图像数据

(2)Totensor的使用

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

img=Image.open("E:\\Desktop\\hymenoptera_data\\hymenoptera_data\\train\\ants\\0013035.jpg")   #读取图片

writer=SummaryWriter("logs")

#Totensor的使用
trans_totensor=transforms.ToTensor()
img_tensor=trans_totensor(img)   #将PIL类型的图片转化为tensor类型
writer.add_image("ToTensor",img_tensor)  #将tensor数据类型的图像可视化
writer.close()

3. ToPILImage类详解

  • 主要作用:将tensor类型的图像数据转化为PIL类型

  • 支持两种类型数据的输入:tensor、numpy.ndarray

  • 返回:一个PIL的Image

4. Normalize类详解

  • 主要作用:归一化tensor Image,并输入该组图像的均值或标准差,进行归一化处理

  • 归一化公式:

    \[input(channel)=\frac{input(channel)-mean(channel)}{std(channel)} \]

(1)Normalize输入图像数据类型

  • 必须为tensor类型

(2)Normalize的使用

from PIL import Image
from torchvision import transforms

img=Image.open("E:\\Desktop\\hymenoptera_data\\hymenoptera_data\\train\\ants\\0013035.jpg")   #读取图片

#Normalize的使用
trans_norm=transforms.Normalize([0.5,0.5,0.5],[0.5,0.5,0.5])  #设置mean和std,因为是三通道数据,所以输入维度有3维
img_norm=trans_norm(img_tensor)  #标准化tensor图像数据类型
writer.add_image("Normalize",img_norm)  #将标准化后的图像可视化
writer.close()

可以对比原来的图片(下)和标准化后的图片(上):颜色都变了诶!

从代码上看不出啥东西,所以这里从标准化计算公式的角度去解释:

  • 代码中设定的均值mean和标准差std都是0.5,那么有:

    \[\frac{input-0.5}{0.5}=2×input-1 \]

  • 这条公式的意义在于:假如\(input\)图片像素值在\([0,1]\)这个范围内,那么标准化后会变成\([-1,1]\)这样一个范围内的图像数据

  • 用下面的代码验证这条公式:

print(img_tensor[0][0][0])  #[Run] tensor(0.8275)
trans_norm=transforms.Normalize([0.5,0.5,0.5],[0.5,0.5,0.5])  #设置mean和std,因为是三通道数据,所以输入维度有3维
img_norm=trans_norm(img_tensor)  #标准化tensor图像数据类型
print(img_norm[0][0][0])    #[Run] tensor(0.6549)  0.6549=2*0.8275-1

  • 可以看出:\(input=0.8275, mean=0.5, std=0.5\),输出的结果恰好是\(2×0.8275=0.6549\)

5. Resize类详解

  • 主要作用:输入PIL Image的时候,给定它的size;并输出根据size缩放的PIL图像数据

(1)Resize输入的数据类型

  • 只能输入PIL类型的数据,并给定它的size

  • 关于size的输入方式:

    • (h, w):输入数组(h,w)时,h为图像的高;w为图像的宽

    • int:输入一个整数时,图像最小的边将会匹配这个整数,另一条边会进行等比缩放

(2)Resize的使用

①将PIL图片缩放到指定尺寸

from PIL import Image
from torchvision import transforms

img=Image.open("E:\\Desktop\\hymenoptera_data\\hymenoptera_data\\train\\ants\\0013035.jpg")   #读取图片

#Resize的使用——将图片缩放到指定尺寸
print(img.size)   #size=3200×1800
trans_resize=transforms.Resize((512,512))  #将图片的size变为512×512
img_resize=trans_resize(img)   #注意img的数据格式是PIL
print(img_resize)  #size=512×512; type: PIL

  • 将结果进行可视化时需要注意,\(img\_resize\)属于\(PIL\)格式的数据,需要转化为\(tensor\)格式的数据类型,才能使用\(add\_image\)。具体如下
trans_totensor=transforms.ToTensor()
img_resizeToTensor=trans_totensor(img_resize)  #将PIL类型的图像数据转为tensor型

from torch.utils.tensorboard import SummaryWriter
writer=SummaryWriter("logs")
writer.add_image("Resize",img_resizeToTensor)  #将tensor数据类型的图像可视化
writer.close()

②将PIL图片等比缩放(最小边=int,另一条边等比缩放)

  • 这里需要使用Compose类去辅助

  • Compose() 用法:

    • Compose() 中的参数需要一个列表

    • 并且列表中的数据类型为_transforms_类型

    • 所以得到:\(Compose([transforms参数1,transforms参数2, \dots])\)

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

img=Image.open("E:\\Desktop\\hymenoptera_data\\hymenoptera_data\\train\\ants\\0013035.jpg")   #读取图片
writer=SummaryWriter("logs")

trans_totensor=transforms.ToTensor()

#Compose--resize的第2种用法
#输入一个序列,输出等比缩放比例的图片
trans_resize2=transforms.Resize(512)
trans_compose=transforms.Compose([trans_resize2,trans_totensor]) #让图像数据先经过Resize的处理,再转化为tensor格式
img_resize2=trans_compose(img)  #在Compose中的这两个函数都需要输入PIL的数据类型。所以这里是先输入PIL图像进行缩放,再转换为tensor数据
writer.add_image("Resize2",resize2)  #将tensor数据类型的图像可视化
writer.close()

补充:\(Compose\)的运行逻辑

  • Compose输入列表中,前面函数的输出,就是后面函数的输入。最后一个函数的输出,就是Compose函数的返回值

  • 比如说上面的transforms.Compose([trans_resize2,trans_totensor]),运行逻辑为:首先向Compose函数输入一个PIL类型的图像数据 --> PIL数据被传入Resize函数中进行处理 --> Resize将处理完的PIL数据输入ToTensor函数中 --> ToTensor函数将PIL数据转换为tensor类型输出 --> Compose函数返回处理完后的tensor数据

  • 也就是说,Compose中调用的transform函数先后顺序,一定要跟数据类型一一对应。比如说,上面的Resize函数输出的是PIL类型数据,后一个ToTensor函数刚好能接受PIL类型数据的输入。如果Resize后面的函数只能接受tensor类型的数据,那寄…

6. RandomCrop类详解

  • 主要作用:随机裁剪图像;Crop the given PIL Image at a random location

  • 对随机的理解:根据指定的size,随机裁剪掉图像的某个区域,使裁剪后的图像在size的范围内

  • Resize的主要作用是缩放,RandomCrop的主要作用是裁剪

(1)输入参数

拆开class RandomCrop,可以看到:

def __init__(self, size, padding=None, pad_if_need=False, fill=0, padding_mode='constant')

这里很多参数都有默认值,所以只介绍参数size的输入

  • \(size\)可以输入一个序列,格式跟\(Resize\)一样:(h,w)

  • \(size\)还可以输入一个整数\(int\),区别于\(Resize\),这里会输出一个size为int×int正方形图像

此外,\(RandomCrop\)需要输入一个格式为PIL类型的图像

(2)RandomCrop的用法

  • 随机裁剪为正方形:
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transfor

img=Image.open("E:\\Desktop\\hymenoptera_data\\hymenoptera_data\\train\\ants\\0013035.jpg")   #读取图片
writer=SummaryWriter("logs")

#RandomCrop的用法(裁剪为正方形)
trans_random=transforms.RandomCrop(512)  #将图像随机裁剪为size=512×512尺寸的正方形
trans_compose2=transforms.Compose([trans_random,trans_totensor])  #先裁剪PIL图像,再转换为tensor类型数据
for i in range(10):   #随机裁剪10次图像
    img_crop=trans_compose2(img)
    writer.add_image("RandomCrop",img_crop,i)
writer.close()

  • 随机裁剪为指定size:只需要更改下面这条代码
#RandomCrop的用法(裁剪为指定size)
trans_random=transforms.RandomCrop((512,1200))  #将图像随机裁剪为size=512×1200尺寸的正方形

三、总结

  1. 关注函数的输入、输出的数据类型

  2. 多看官方文档,比网上文档准确得多

  3. 关注方法需要什么参数。关注每个函数的__init__,比如def __init__(self,padding,fill=0,padding_mode='constant'),一般情况下,需要输入的参数为\(padding\),其他参数使用默认值即可。这时候还需要了解一下\(padding\)的作用及输入的数据类型。

  4. 不知道输出数据类型的时候,可以用\(type()\)函数去查看

最后的最后

感谢你们的阅读和喜欢,我收藏了很多技术干货,可以共享给喜欢我文章的朋友们,如果你肯花时间沉下心去学习,它们一定能帮到你。

因为这个行业不同于其他行业,知识体系实在是过于庞大,知识更新也非常快。作为一个普通人,无法全部学完,所以我们在提升技术的时候,首先需要明确一个目标,然后制定好完整的计划,同时找到好的学习方法,这样才能更快的提升自己。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

五、面试资料

我们学习AI大模型必然是想找到高薪的工作,下面这些面试题都是总结当前最新、最热、最高频的面试题,并且每道题都有详细的答案,面试前刷完这套面试题资料,小小offer,不在话下。
在这里插入图片描述

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

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

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

相关文章

如何更新 iOS 18 Beta 版本?具体步骤总结

如何更新 iOS 18 Beta 想必有一些用户已经迫不及待的想要知道怎么更新 iOS 18 Beta 版本了吧,下面就给大家总结了具体的操作步骤: 在更新 iOS 18 Beta 版本之前记得我们需要将手机的数据进行备份,大家可以自行选用备份软件比如 iCloud 等。…

vb.net小demo(计算器、文件处理等/C#也可看)

Demo1:使用窗体控件实现一个简易版计算器 Public Class Form1Private Sub Button_1_Click(sender As Object, e As EventArgs) Handles Button_1.ClickCalSubBox.Text Button_1.TextEnd SubPrivate Sub Button_2_Click(sender As Object, e As EventArgs) Handles …

使用RV1126交叉编译工具链交叉编译opencv,c++代码直接调用VideoCapture 读取摄像头数据

使用RV1126交叉编译工具链交叉编译opencv,rv1126直接调用VideoCapture 读取摄像头数据 前言环境一、ubantu安装二、交叉编译工具安装三、cmake升级四、ffmpeg安装五、opencv安装六、c代码测试(上板运行) 前言 交叉编译是一种将软件在操作系统…

超详解——​深入理解Python中的位运算与常用内置函数/模块——基础篇

目录 ​编辑 1.位运算 2.常用内置函数/模块 math模块 random模块 decimal模块 常用内置函数 3.深入理解和应用 位运算的实际应用 1.权限管理 2.位图 3.图像处理 2.math模块的高级应用 统计计算 几何计算 总结 1.位运算 位运算是对整数在内存中的二进制表示进行…

Android Uri转File path路径,Kotlin

Android Uri转File path路径,Kotlin /*** URI转化为file path路径*/private fun getFilePathFromURI(context: Context, contentURI: Uri): String? {val result: String?var cursor: Cursor? nulltry {cursor context.contentResolver.query(contentURI, null…

设计模式-创建型-04-建造者模式

1、盖房项目需求 1)需要建房子:这一过程为打桩、砌墙、封顶2)房子有各种各样的,比如普通房,高楼,别墅,各种房子的过程虽然一样,但是要求不要相同的3)请编写程序&#xf…

模拟信号转RS-485/232,数据采集A/D转换模块 YL21

特点: ● 模拟信号采集,隔离转换 RS-485/232输出 ● 采用12位AD转换器,测量精度优于0.1% ● 通过RS-485/232接口可以程控校准模块精度 ● 信号输入 / 输出之间隔离耐压3000VDC ● 宽电源供电范围:8 ~ 32VDC ● 可靠性高&…

【Axure高保真原型】拖拉拽动态编辑可视化页面

今天和大家分享拖拉拽动态编辑可视化页面的原型模板,我们可以拖动左侧工具列表的图表,添加到页面,可以多次添加,添加后可以拖动图表的位置,或者鼠标移入图表后点击delete键删除多余的图表,案例中提供10中常…

我国间二甲苯零售规模逐渐扩大 进口量有所下滑

我国间二甲苯零售规模逐渐扩大 进口量有所下滑 间二甲苯(MX)又称为1,3-二甲苯,是苯的两个氢基被两个甲基取代后形成的一种有机化合物。间二甲苯的化学方程式为C8H10,多表现为一种无色透明的液体,不溶于水,但…

Pikachu上的CSRF以及NSSCTF上的[NISACTF 2022]bingdundun~、 [SWPUCTF 2022 新生赛]xff

目录 一、CSRF CSRF(get) login CSRF(post) CSRF Token 二、CSRF的相关知识点 (1)什么是CSRF? (2)工作原理 (3)CSRF漏洞形成的条件 1、用户要在登录状态(即浏览器保存了该…

资源付费系统小程序APP公众号h5源码

🔐 揭秘“资源付费系统”:知识、技能与价值的交汇点 💎 🌟 引言:为何资源需要付费? 在数字化时代,我们周围充斥着大量的信息。但并非所有信息都具有同等的价值。其中,那些经过精心…

深度学习(四)——torchvision中数据集的使用

1. 参数详解 torchvision中每个数据集的参数都是大同小异的,这里只介绍CIFAR10数据集 该数据集的数据格式为PIL格式 class torchvision.datasets.CIFAR10(root:str,train:boolTrue,transform:Optional[Callable]None,target_transform:Optional[Callable]None,do…

Intel 8080接口与Motorola 6800接口定义与应用

本文介绍Intel 8080接口与Motorola 6800接口定义与应用。 Intel 8080接口与Motorola 6800接口是常用的并行总线接口,在MCU与外设直接的接口中经常用到,如MCU与LCD接口,MCU与FPGA之间的接口。本文介绍Intel 8080接口与Motorola 6800接口定义&…

R语言数据探索和分析23-公共物品问卷分析

第一次实验使用最基本的公共物品游戏,不外加其他的treatment。班里的学生4人一组,一共44/411组。一共玩20个回合的公共物品游戏。每回合给15秒做决定的时间。第十回合后,给大家放一个几分钟的“爱心”视频(链接如下)&a…

第一个Vue3.0应用程序

Vue 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界面,Vue 都可以胜任。 1、准备工作 工欲善其事&#…

简单2招,学会文件粉碎!告别文件安全顾虑

在数字化时代,电脑文件中可能存储着大量的敏感信息,涉及个人隐私、财务数据等。为了更有效地保护这些信息不被滥用或泄露,我们需要更加安全的删除文件的方法。电脑文件粉碎是一种高级的文件删除技术,可以确保被删除的文件无法被恢…

多个协程操纵同一个数据2个锁【互斥锁】【读写锁】

golang中sync包实现了两种锁Mutex(互斥锁)和RWMutex(读写锁) 【1】互斥锁(和上厕所一样,用的时候把门锁上,不用的时候把门给关上) 其中Mutex为互斥锁,Lock()加锁,Unlock()解锁&#…

申请郑州水污染防治乙级资质,这些材料你需要提前准备

申请郑州水污染防治乙级资质时,你需要提前准备以下材料,以确保申请流程的顺利进行: 一、企业基本材料 企业法人营业执照副本复印件:需加盖企业公章,确保复印件清晰、完整。企业章程文本:提供企业章程的完整…

Map - LinkedHashSetMap源码解析

本文主要对Map - LinkedHashSet&Map 源码解析。立刀旁 Map - LinkedHashSet&Map源码解析 Java 7 - LinkedHashSet&Map 总体介绍方法剖析 get()put()remove()LinkedHashSetLinkedHashMap经典用法 # Java 7 - LinkedHashSet&Map # 总体介绍 如果你已看过前面关…

【git使用二】gitee远程仓库创建与本地git命令用法

目录 gitee介绍 管理者注册gitee账号 管理者在gitee网站上创建远程仓库 每个开发者安装git与基本配置 1.git的下载和安装 2.配置SSH公钥 3.开发者信息配置 git命令用法 gitee介绍 Gitee(又称码云)是一个基于Git的代码托管服务,由开源…