常见的Transforms使用方法
目录
前言
transforms的使用要非常注意三点:输入——输出——作用
常见的图片格式有:PIL(使用Image.open()打开,python自带的);tensor(使用ToTensor()打开);narrays(使用cv.imread()打开)
一、python中__call__()方法的用法
我们知道函数是可被调用的。内置函数callable可以验证该对象是否是可以调用对象,所以如果把一个函数名传给callable(),就会返回True。
__call__() 方法可以用来将类实例变成为可调用对象, 说的直白点就是如果在类里重写了__call__函数,该类实例就可以当做函数一样被调用。
代码如下:
class Person: #创建一个Person类
def __call__(self, name): #定义___call__函数,name是参数
print("__call__ "+ "hello "+ name)def hello(self, name): #定义hello函数,name是参数
print("hello "+ name)person = Person() #新建一个Person的对象,名字叫person(创建一个Person实例person)
person("zhangsan") #调用__call__函数
person.hello("haha") #调用hello函数
二、ToTensor的使用
TensorBoard默认是tensor的数据类型。
代码如下:
trans_ToTensor = transforms.ToTensor() #创建一个实例
img_tensor = trans_ToTensor(img) #使用totensor方法把图片转化为tensorg类型
writer.add_image("totensor", img_tensor, 1) #写入tensorboard中
三、Normalize(归一化)的使用
归一化一个tensor的数据类型,给入均值和标准差,输出归一化结果
代码如下:
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, 2) #写入tensorboard中
四、Resize的使用
代码如下:
print(img.size) #输出图片尺寸
trans_resize = transforms.Resize(400) #创建一个实例,调用resize()方法
img_resize = trans_resize(img) #按比例进行变换
img_resize_tensor = trans_ToTensor(img_resize) #将图片格式转换为tensor类型
print(img_resize_tensor) #输出图片尺寸
writer.add_image("resize", img_resize_tensor , 3) #写入tensorboard中
五、在Compose中使用Resize
如果说torchvision.transforms是pytorch中的图像预处理包,有很多步骤。Compose的作用就是把多个步骤整合到一起。
比如说:
transforms.Compose([
transforms.CenterCrop(10),
transforms.ToTensor(), ])
这样就把两个步骤整合到了一起。
注意:compose([], [], ...) 中括号内的每一步都是有顺序的,从前到后,前一个输出的结果,就是后一步输入的,所以要保证数据类型一致,要不然会报错。
代码如下:
trans_resize_2 = transforms.Resize(500) #创建一个实例,调用resize()方法
trans_compose = transforms.Compose([trans_resize_2, trans_ToTensor]) #使用compose函数
img_resize_2 = trans_compose(img)
writer.add_image("conpose_resize", img_resize_2, 5) #写入tensorboard中
六、RandomCrop(随机裁剪)的使用
代码如下:
trans_random = transforms.RandomCrop(300, 200) #创建一个实例,调用randomcrap()方法
trans_compose_2 = transforms.Compose([trans_random, trans_ToTensor]) #先裁剪,在转换成tensor类型
for i in range(10): #for循环
img_crop = trans_compose_2(img)
writer.add_image("randomcrop", img_crop, i)
全部代码如下:
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transformswriter = SummaryWriter("logs")
img = Image.open("train/ants/0013035.jpg")
print(img)#ToTensor的使用
trans_ToTensor = transforms.ToTensor() #创建一个实例
img_tensor = trans_ToTensor(img) #使用totensor方法把图片转化为tensorg类型
writer.add_image("totensor", img_tensor, 1) #写入tensorboard中#Normalize
print(img_tensor[0, 0, 0]) #归一化前图片的数据
trans_norm = transforms.Normalize([0.5,2,1.5], [0.5,1,1.2]) #创建一个实例,输入均值,方差
img_norm = trans_norm(img_tensor) #调用函数随图片进行归一化处理
print(img_norm[0, 0, 0]) #归一化后图片的数据
writer.add_image("normalize", img_norm, 1) #写入tensorboard中#Resize
print(img.size) #输出图片尺寸
trans_resize = transforms.Resize(400) #创建一个实例,调用resize()方法
img_resize = trans_resize(img) #按比例进行变换
img_resize_tensor = trans_ToTensor(img_resize) #将图片格式转换为tensor类型
print(img_resize_tensor) #输出图片尺寸
writer.add_image("resize", img_resize_tensor , 3) #写入tensorboard中#在Compose中使用resize
trans_resize_2 = transforms.Resize(250) #创建一个实例,调用resize()方法
trans_compose = transforms.Compose([trans_resize_2, trans_ToTensor]) #使用compose函数
img_resize_2 = trans_compose(img)
writer.add_image("conpose_resize", img_resize_2, 6) #写入tensorboard中#RandomCorp
trans_random = transforms.RandomCrop(300, 200) #创建一个实例,调用randomcrap()方法
trans_compose_2 = transforms.Compose([trans_random, trans_ToTensor]) #先裁剪,在转换成tensor类型
for i in range(10): #for循环
img_crop = trans_compose_2(img)
writer.add_image("randomcrop", img_crop, i)writer.close()
总结
使用transforms要注意输入输出的数据类型;
多看官方的注解/用法;
关注方法需要什么参数;
不知道返回值的类型的时候可以使用print(); print(typr()); debug来运行查看一下。