赞
踩
transforms.py像一个工具箱,里面有很多工具,工具有totensor类、resize类等等
图片经过工具 会输出我们想要的一个图片变换的结果
作用:将PIL类型或numpy类型的图片转换为tensor类型的图片
trans_totensor=transforms.ToTensor() img_tensor=trans_totensor(img)
注:这里重点说一下__call__
可调用对象:凡是可以将()运用到自身并执行的都可以称为可调用对象,例如 对象名(),对于可调用对象名称()可以理解为是名称.__call__()的缩写
__call__函数功能类似于在类中重载()运算符,使实例对象可以像普通函数那样,以对象名()的形式调用,将类的实例对象变为可调用对象
所以trans_totensor=transforms.ToTensor()相当于实例化,img_tensor=trans_totensor(img)调用了__call__
作用:用均值和标准差归一化一个tensor类型的图片
计算方式:output[channel] = (input[channel] - mean[channel]) / std[channel]
trans_norm=transforms.Normalize([0.5,0.5,0.5],[0.5,0.5,0.5])#类实例化,参数是每个通道的均值和标准差 img_norm=trans_norm(img_tensor)
作用:将输入图像的大小调整到给定大小输出
视频讲的该类使用时输入图片类型仅能是PIL类型,目前输入类型PIL,tensor都可以
但add_image参数类型仅能是tensor或numpy类型不能是PIL类型
trans_resize=transforms.Resize((512,512))#类实例化 img_resize=trans_resize(img)#调整大小
作用:组合几个transforms变换,按照参数操作
参数:需要是一个列表,python中,列表的表示形式为[数据1,数据2,...],在compose中数据需要的是transforms类型,所以得到Compose([transforms参数1,transforms参2...])
#传入PIL类型,经过Transforms类型参数1:trans_resize_2,实现缩放,经过Transforms类型参数2:trans_totensor实现将PIL类型转为tensor类型
trans_compose=transforms.Compose([trans_resize_2,trans_totensor])#输入为PIL类型 img_resize_2=trans_compose(img)
作用:裁剪给定图像
参数:size 希望裁剪输出的大小 如果是int类型 进行正方形裁剪,如果是像 (h, w)这样的序列,按照 (h, w)裁剪
trans_random=transforms.RandomCrop(512)#进行正方形裁剪,按照512*512 trans_random2=transforms.RandomCrop((500,1000))#进行长方形裁剪 500*1000
img_crop=trans_random(img_tensor) img_crop2=trans_random2(img_tensor)
代码如下:
- from PIL import Image
- from torch.utils.tensorboard import SummaryWriter
- from torchvision import transforms
- writer=SummaryWriter('logs')#类实例化,传入存储事件文件的文件夹名称
- img=Image.open("images/9.jpg")
- print(img)
- #1.Totensor
- # 作用:将PIL或numpy类型的图片转换为tensor类型的图片
- trans_totensor=transforms.ToTensor()#类实例化
- #调用totensor的__call__函数
- #作用:将PIL类型或numpy.ndarray类型的图片转换为tensor类型
- img_tensor=trans_totensor(img)
- writer.add_image("ToTensor",img_tensor)
-
-
- #2.normalize
- # 作用:用均值和标准差归一化一个tensor类型的图片
- #计算方式:output[channel] = (input[channel] - mean[channel]) / std[channel]
- 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.add_image("Normalize",img_norm)
-
- #3.Resize
- # 作用:将输入图像的大小调整到给定大小输出
- print(img.size)
- trans_resize=transforms.Resize((512,512))#类实例化
- #(1)输入图片类型是PIL
- img_resize=trans_resize(img)#调整大小
- #输出也是PIL类型,将PIL转化为tensor类型,
- img_resize=trans_totensor(img_resize)
- writer.add_image("Resize_inputPIL",img_resize)
- print(img_resize)
-
- #(2)输入图片类型也可以是tensor类型
- img_resize_tensor=trans_resize(img_tensor)
- writer.add_image("Resize_inputTensor",img_resize_tensor)
-
- #4.Compose--resize--2
- # 作用:组合几个transforms变换,按照参数操作
- # 参数:需要是一个列表,python中,列表的表示形式为[数据1,数据2,...],在compose中数据需要的是transforms类型,所以得到
- #Compose([transforms参数1,transforms参2...])
- trans_resize_2=transforms.Resize(512)
- #传入PIL类型,经过Transforms类型参数1:trans_resize_2,实现缩放,经过Transforms类型参数2:trans_totensor实现将PIL类型转为tensor类型
- trans_compose=transforms.Compose([trans_resize_2,trans_totensor])#输入为PIL类型
- img_resize_2=trans_compose(img)
- writer.add_image("Resize",img_resize_2,1)
-
-
-
- img_resize_1=trans_resize_2(img_tensor)#输入为tensor类型直接调用resize即可
- writer.add_image("Resize",img_resize_1,2)
-
-
- #5.RandomCrop
- #作用:裁剪给定图像
- #参数:size 希望裁剪输出的大小 如果是int类型 进行正方形裁剪,如果是像 (h, w)这样的序列,按照 (h, w)裁剪
- trans_random=transforms.RandomCrop(512)#进行正方形裁剪,按照512*512
- trans_random2=transforms.RandomCrop((500,1000))#进行长方形裁剪 500*1000
- for i in range(10):
- img_crop=trans_random(img_tensor)
- img_crop2=trans_random2(img_tensor)
-
- writer.add_image("Random",img_crop,i)
- writer.add_image("Random2", img_crop2, i)
-
- writer.close()

注意:
(1)关注输入、输出类型
(2)多看官方文档,按住ctrl直接点击函数和类即可看到函数或类的信息
(3)关注方法需要什么参数,ctrl+p软件会提示需要输入范润参数
(4)不知道返回值类型的时候时候 print 、print(type)、debug
(5)看transforms的structure,可以transforms包含哪些类和函数,点击structure中的类和函数,即可看到它们的官方声明
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。