对于视觉方向的图像处理方面,PyTorch提供了很好的预处理接口,对于图像的转换处理,使用 torchvision.tranforms 模块使得这些操作非常高效。
__all__ = ["Compose", "ToTensor", "PILToTensor", "ConvertImageDtype", "ToPILImage", "Normalize", "Resize", "Scale",
"CenterCrop", "Pad", "Lambda", "RandomApply", "RandomChoice", "RandomOrder", "RandomCrop",
"RandomHorizontalFlip", "RandomVerticalFlip", "RandomResizedCrop", "RandomSizedCrop", "FiveCrop", "TenCrop",
"LinearTransformation", "ColorJitter", "RandomRotation", "RandomAffine", "Grayscale", "RandomGrayscale",
"RandomPerspective", "RandomErasing", "GaussianBlur", "InterpolationMode", "RandomInvert", "RandomPosterize",
"RandomSolarize", "RandomAdjustSharpness", "RandomAutocontrast", "RandomEqualize"]
粗浅地理解,transforms.py可以看作一个工具箱,我们将图片作为输入,放入Transforms这个工具中,并将图像转换为其他类型的输出,以用于深度学习的工作。
可以理解为,Tensor数据类型在保留了图像的原始数据的基础上,包装了神经网络所需要的理论基础的参数的实体。
在神经网络的训练中,通常需要我们提前将图像数据的原始类型转换为Tensor数据类型,便于我们后续的神经网络的训练。
首先引入torchvision库中的transforms类:
通过PIL库中的image类,调用image.open()函数,对于文件进行读入:
可以观察到,通过open()函数读入的文件类型为JpegImageFile类型,模式是RGB,并且大小为3648*2736。
接下来需要将JpegImageFile类型的对象转换为Tensor类型的对象,通过ToTensor()函数实现,首先创建一个ToTensor函数的对象,方便调用:
接下来往函数对象中传入参数,参数为上述读入的图片对象:
通过print函数对于对象进行查看,可以看到转换后的对象的类型已经转换为Tensor类:
通过Tensorboard查看图像类型是否可以传入Tensorboard中,并且在Tensorboard界面查看:
同样,通过创建SummaryWriter类来对数据进行读入:
接下来在Tensorboard界面查看:
可以观察到成功上传了图片。
通过help()函数查看Nomalize()函数的参数以及具体使用方法:
可以通过阅读了解到,Normalize()函数实现的是归一化,具体来说是对于每一个信道的输入进行归一化,Normalize()函数对应的参数为每个信道的均值与标准差。
在了解完了之后,在Jupyter Notebook中创建Normalize的实例对象,并且将上述的Tensor类型的图像数据作为参数传入Normalize对象中,可以得到归一化的结果:
接下来将归一化的结果传入Tensorboard上进行查看:
虽然这个归一化的成果看起来比较抽象。。但是还是成功完成了归一化的任务,表明Normalize的实用性。
通过help()查看Resize类的使用:
可以了解到,Resize的主要功能是将图像调整成对应的大小,若输入的参数为长和宽,可以调整成对应的大小,若只输入一个参数,图像的最小边会匹配该参数,并将图像按照输入的参数进行等比的缩放。
接下来创建Resize对象,并设置需要转换的尺寸大小,此处设置为512*512:
观察转换前后的图像的大小,可以观察到图像的大小从3648*2736转换成512*512,并且保留了原图像的通过open()函数读入之后的图像类型。
接下来需要将对象放入Tensorboard上进行观察,需要先将图像的类型转换为Tensor类型,因此需要调用先前的ToTensor()来进行转换。
转换完成之后,放入Tensorboard上进行查看:
可以观察到图像被转换成指定的大小。
Compose()的作用是整合多个transforms类型的步骤到一起,只用一步完成多个转换操作。
Compose()的参数需要的是一个列表,数据需要的是transforms类型,列表的形式为[transforms类型1, transforms类型2]。
因此根据Compose()的功能以及参数需要,依次进行构造Compose对象。
首先构造一个新的只有一个参数的Resize对象:
接下来将Resize对象以及ToTensor对象整合在一个Compose对象中,因此可以实现一次性调用:
再接着把图像数据进行导入并查看transform的结果:
可以观察到图像进行了等比缩放。
RandomCrop类的主要作用是实现对图片随机裁剪,裁剪的尺寸根据给定的参数进行,如果给定的是1个参数,则裁剪成正方形,如果是两个参数,则裁剪成两个参数指定的长和宽。
在本文中总结了几种常用的Transforms,主要包括:ToTensor、Normalize、Resize、Compose、RandomCrap等。在新接触这些类时,几种常用的学习方法总结如下:
多关注每个函数的输入值类型、输出值类型;
多看函数的源码,根据源码中提供的内容对函数的使用方法进行掌握;
通过关注函数的参数类型、参数个数、参数作用对函数的使用方法进行了解;
如果不知道函数的返回值是什么类型,借助print()函数,输出其类型或者格式,进行查看。