PyTorch学习笔记(2)–常见的Transforms
本博文是PyTorch的学习笔记,第2次内容记录,主要记录了常见Transforms的使用方法。
目录
- PyTorch学习笔记(2)--常见的Transforms
- 1.Python中的类
- 1.1Python中怎样定义类
- 1.2Python类中常用的内置函数
- 2.PyTorch中常用Transforms
- 2.1ToTensor和Normalize的使用
- 2.2Resize的使用
- 2.3Compose的使用
- 2.4RandomCrop的使用
- 3.学习小结
1.Python中的类
1.1Python中怎样定义类
在Transforms使用之前,需要了解一下Python中类的使用方法。在Python中定义类的方法如下:
# coding :UTF-8
# 文件功能: 代码实现class基本功能
# 开发人员: dpp
# 开发时间: 2021/8/11 11:14 上午
# 文件名称: class_use.py
# 开发工具: PyCharm
class Person:
def __init__(self, name):
print("__init__ " + name)
def __call__(self, name):
print("__call__ " + "hello " + name)
def hello(self, name):
print("hello " + name)
person = Person("first name") # 对象创建时初始化,自动调用__init__函数
person.__call__("zhangsan") # 对象显示地调用__call__函数
person("zhangsan") # 对象直接调用__call__函数,调用效果与显示调用__call__一样
person.hello("lisi") # 对象调用hello方法
1.2Python类中常用的内置函数
在Python中有很多常用的内置函数,包括__init__、call、new__等,提醒这里的下滑线是2个短横线,在上面的例子中举例实现了__init、__call__等函数的使用方法。
2.PyTorch中常用Transforms
2.1ToTensor和Normalize的使用
ToTensor是实现将图像转换为tensor张量类型,Normalize是实现对张量的归一化操作。具体实例代码为:
# coding :UTF-8
# 文件功能: 代码实现常用Transforms的功能
# 开发人员: dpp
# 开发时间: 2021/8/11 11:58 上午
# 文件名称: Use_of_Transforms.py
# 开发工具: PyCharm
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
writer = SummaryWriter("logs")
img = Image.open("images/pytorch.jpg").convert('RGB') #convert('RGB')实现将图片映射到RGB三通道上面
print(img)
# Totensor的使用 ToTensor是指把PIL.Image(RGB) 或者numpy.ndarray(H x W x C) 从0到255的值映射到0到1的范围内,并转化成Tensor格式
trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)
print(img_tensor.shape)
writer.add_image("ToTensor", img_tensor)
# Normalize的使用 Normalize(mean,std)是通过下面公式实现数据归一化,mean表示平均值,std表示标准差
# channel=(channel-mean)/std
print(img_tensor[0][0][0]) # 输出第一个像素点归一化之前的值
trans_norm = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5]) # 假设均值为[0.5, 0.5, 0.5],标准差为[0.5, 0.5, 0.5]
img_norm = trans_norm(img_tensor) # 将图片转换为tensor之后,对tensor进行归一化处理
print(img_norm[0][0][0]) # 输出第一个像素点归一化之后的值
writer.add_image("Normalize", img_norm, 1)
writer.close()
可以在Tensorboard中查看运行结果:
2.2Resize的使用
Resize是修改原来图像的尺寸信息,代码如下:
# coding :UTF-8
# 文件功能: 代码实现常用Transforms的功能
# 开发人员: dpp
# 开发时间: 2021/8/11 11:58 上午
# 文件名称: Use_of_Transforms.py
# 开发工具: PyCharm
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
writer = SummaryWriter("logs")
img = Image.open("images/pytorch.jpg").convert('RGB') #convert('RGB')实现将图片映射到RGB三通道上面
print(img)
# Totensor的使用 ToTensor是指把PIL.Image(RGB) 或者numpy.ndarray(H x W x C) 从0到255的值映射到0到1的范围内,并转化成Tensor格式
trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)
print(img_tensor.shape)
writer.add_image("ToTensor", img_tensor)
# Normalize的使用 Normalize(mean,std)是通过下面公式实现数据归一化,mean表示平均值,std表示标准差
# channel=(channel-mean)/std
print(img_tensor[0][0][0]) # 输出第一个像素点归一化之前的值
trans_norm = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5]) # 假设均值为[0.5, 0.5, 0.5],标准差为[0.5, 0.5, 0.5]
img_norm = trans_norm(img_tensor) # 将图片转换为tensor之后,对tensor进行归一化处理
print(img_norm[0][0][0]) # 输出第一个像素点归一化之后的值
writer.add_image("Normalize", img_norm, 1)
# Resize的使用
print(img.size)
trans_resize = transforms.Resize((512, 512))
# img PIL -> resize -> img_resize PIL
img_resize = trans_resize(img)
# img_resize PIL -> totensor -> img_resize tensor
img_resize = trans_totensor(img_resize)
writer.add_image("Resize", img_resize, 0)
print(img_resize)
writer.close()
可以在Tensorboard中查看Resize的运行结果:
2.3Compose的使用
Compose类的主要作用是串联多个图片变换的操作,代码如下:
# coding :UTF-8
# 文件功能: 代码实现常用Transforms的功能
# 开发人员: dpp
# 开发时间: 2021/8/11 11:58 上午
# 文件名称: Use_of_Transforms.py
# 开发工具: PyCharm
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
writer = SummaryWriter("logs")
img = Image.open("images/pytorch.jpg").convert('RGB') #convert('RGB')实现将图片映射到RGB三通道上面
print(img)
# Totensor的使用 ToTensor是指把PIL.Image(RGB) 或者numpy.ndarray(H x W x C) 从0到255的值映射到0到1的范围内,并转化成Tensor格式
trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)
print(img_tensor.shape)
writer.add_image("ToTensor", img_tensor)
# Normalize的使用 Normalize(mean,std)是通过下面公式实现数据归一化,mean表示平均值,std表示标准差
# channel=(channel-mean)/std
print(img_tensor[0][0][0]) # 输出第一个像素点归一化之前的值
trans_norm = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5]) # 假设均值为[0.5, 0.5, 0.5],标准差为[0.5, 0.5, 0.5]
img_norm = trans_norm(img_tensor) # 将图片转换为tensor之后,对tensor进行归一化处理
print(img_norm[0][0][0]) # 输出第一个像素点归一化之后的值
writer.add_image("Normalize", img_norm, 1)
# Resize的使用
print(img.size)
trans_resize = transforms.Resize((512, 512))
# img PIL -> resize -> img_resize PIL
img_resize = trans_resize(img)
# img_resize PIL -> totensor -> img_resize tensor
img_resize = trans_totensor(img_resize)
writer.add_image("Resize", img_resize, 0)
print(img_resize)
# compose - resize - 2
trans_resize_2 = transforms.Resize(512)
# PIL -> PIL -> tensor
trans_compose = transforms.Compose([trans_resize_2, trans_totensor])
img_resize_2 = trans_compose(img)
writer.add_image("Compose", img_resize_2, 1)
writer.close()
可以在Tensorboard中查看Compose的运行结果:
2.4RandomCrop的使用
RandomCrop类的主要作用是实现对图片随机裁剪,裁剪的尺寸根据给定的参数进行,如果给定的是1个参数,则裁剪成正方形,如果是两个参数,则裁剪成两个参数指定的长和宽。代码如下:
# coding :UTF-8
# 文件功能: 代码实现常用Transforms的功能
# 开发人员: dpp
# 开发时间: 2021/8/11 11:58 上午
# 文件名称: Use_of_Transforms.py
# 开发工具: PyCharm
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
writer = SummaryWriter("logs")
img = Image.open("images/pytorch.jpg").convert('RGB') #convert('RGB')实现将图片映射到RGB三通道上面
print(img)
# Totensor的使用 ToTensor是指把PIL.Image(RGB) 或者numpy.ndarray(H x W x C) 从0到255的值映射到0到1的范围内,并转化成Tensor格式
trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)
print(img_tensor.shape)
writer.add_image("ToTensor", img_tensor)
# Normalize的使用 Normalize(mean,std)是通过下面公式实现数据归一化,mean表示平均值,std表示标准差
# channel=(channel-mean)/std
print(img_tensor[0][0][0]) # 输出第一个像素点归一化之前的值
trans_norm = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5]) # 假设均值为[0.5, 0.5, 0.5],标准差为[0.5, 0.5, 0.5]
img_norm = trans_norm(img_tensor) # 将图片转换为tensor之后,对tensor进行归一化处理
print(img_norm[0][0][0]) # 输出第一个像素点归一化之后的值
writer.add_image("Normalize", img_norm, 1)
# Resize的使用
print(img.size)
trans_resize = transforms.Resize((512, 512))
# img PIL -> resize -> img_resize PIL
img_resize = trans_resize(img)
# img_resize PIL -> totensor -> img_resize tensor
img_resize = trans_totensor(img_resize)
writer.add_image("Resize", img_resize, 0)
print(img_resize)
# compose - resize - 2
trans_resize_2 = transforms.Resize(512)
# PIL -> PIL -> tensor
trans_compose = transforms.Compose([trans_resize_2, trans_totensor])
img_resize_2 = trans_compose(img)
writer.add_image("Compose", img_resize_2, 1)
# RandomCrop随机裁剪
trans_random = transforms.RandomCrop(512) #裁剪图像尺寸为512×512
trans_compose_2 = transforms.Compose([trans_random, trans_totensor])
for i in range(10): #对原始图像随机裁剪0-9一共10个图像
img_crop = trans_compose_2(img)
writer.add_image("RandomCrop", img_crop, i)
writer.close()
可以在Tensorboard中查看RandomCrop的运行结果:
3.学习小结
在本文中总结了几种常用的Transforms,主要包括:ToTensor、Normalize、Resize、Compose、RandomCrap等。在新接触这些类时,几种常用的学习方法总结如下:
- 多关注每个函数的输入值类型、输出值类型;
- 多看函数的源码,根据源码中提供的内容对函数的使用方法进行掌握;
- 通过关注函数的参数类型、参数个数、参数作用对函数的使用方法进行了解;
- 如果不知道函数的返回值是什么类型,借助print()函数,输出其类型或者格式,进行查看。