1.transforms作用
transforms.py像一个工具箱,里面有很多工具,工具有totensor类、resize类等等
图片经过工具 会输出我们想要的一个图片变换的结果
2.常用的transforms
(1)Totensor
作用:将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__
(2)normalize
作用:用均值和标准差归一化一个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)
(3)Resize
作用:将输入图像的大小调整到给定大小输出
视频讲的该类使用时输入图片类型仅能是PIL类型,目前输入类型PIL,tensor都可以
但add_image参数类型仅能是tensor或numpy类型不能是PIL类型
trans_resize=transforms.Resize((512,512))#类实例化 img_resize=trans_resize(img)#调整大小
(4)Compose
作用:组合几个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)
5.RandomCrop
作用:裁剪给定图像
参数: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中的类和函数,即可看到它们的官方声明