正文共: 26893字 32图 预计阅读时间: 68分钟
计算机视觉任务中,对图像的变换(Image Transform)往往是必不可少的操作,例如在迁移学习中,需要对图像尺寸进行变换以使用预训练网络的输入层,又如对数据进行增强以丰富训练数据。
作为深度学习领域的主流框架,pytorch中提供了丰富的图像变换API。这些API实现了常用的图像数据增强操作,可以灵活组合使用。主要特点:
丰富的数据增强操作,包括Crop、Flip、Color变换等
支持PIL Image和Tensor
可以链式组合使用
提供了方便的功能函数接口
本文将对pytorch中torchvision.transforms提供的丰富多样的图像变换API进行整理介绍。为了方便理解记忆以及后续使用过程中查找,我把pytorch中提供的transform分为6大类:
几何变换:改变图像几何形状和结构的变换,如裁剪、旋转、缩放等。主要用于提升模型对角度、尺寸的鲁棒性。
色彩变换:改变图像颜色的变换,如调整亮度、对比度、饱和度等。主要用于增强模型对颜色变化的鲁棒性。
图像格式与数值转换:在PIL Image和Tensor间进行转换。对图像像素值进行正则化等操作。
图像增强组合:将多个变换组合使用,如RandomApply等。这是Transforms的精髓所在。
自动搜索学习数据增强策略:一些通过强化学习等方案学习而来的增强方法。
为方便下文展示各种图像变换API的效果,我们借助matplotlib定义一个名为show_image函数来展示图片,如下所示:
import torch1 加载图片 1.1 PIL库
import numpy as np
from torchvision import transforms
from torchvision.io import read_image
import matplotlib as mpl
import matplotlib.pyplot as plt
def show_image(img_lst, **imshow_kwargs):
img_lst: 保存图像和标题的list,形如:[(image1, title1),(image2, title2)]。image可以使Pillow.Image对象,也可以是torch.Tensor。
imshow_kwargs: 需要传递给plt.imshow的参数
fig, axs =plt.subplots(1,len(img_lst), constrained_layout=True, figsize=(2*len(img_lst),2), squeeze=False)
for i, (img, title) in enumerate(img_lst):
if isinstance(img, torch.Tensor): # 如果是torch.Tensor类型,就必须转换成Pillow.Image类型,才能进行展示
img = transforms.ToPILImage()(img)
axs[0, i].imshow(np.asarray(img), **imshow_kwargs)
axs[0, i].set_title(title)
plt.show()
对于存储在磁盘中的图片文件,使用Pillow库提供的Image类对象进行打开是一种十分常用的方法,如果你还没有安装,你可以通过以下命令方便下文进行:
pip install Pillowfrom PIL import Image
我们通过Pillow中提供的方法,打开一张图片,并通过show_image()方法进行展示,下文中各种图像变换,我们都将以此图片为例,进行演示:
raw_img = (Image.open('fruit.jpeg'), '原始图片')
show_image([raw_img])
1.2 pytorch中提供的图像加载方法
pytorch的torchvision.io模块本身也提供有加载图像数据的方法:read_image。该方法直接将图片加载为Tensor类型数据。
from torchvision.io import read_image
raw_img2 = read_image('fruit.jpeg')
raw_img2.shape
torch.Size([3, 448, 596])
type(raw_img2)
torch.Tensor
我们也通过之前定义的show_image()方法进行展示,注意,show_image()方法之所以能展示Tensor类型数据为图像,是因为show_image()方法内将Tensor转为PIL图像了。
show_image([(raw_img2, 'read_image()')])![]()
好了,知道怎么打开与展示图像之后,我们就可以开始介绍本篇中的主角——pytorch中的那些transform们。
2 几何变换
几何变换是指对图像的大小、形状、角度等几何形态和结构进行调整,常用于数据增强,有助于提高模型的泛化能力。一般在图像分类/检测等任务中,会频繁使用这些几何变换,防止过拟合和提高鲁棒性。
需要注意,这些变换大多数会在内部调用PIL来处理图像,因此输入需要是PIL Image格式。几何变换主要分为以下几类:
1. 大小变换。生成不同分辨率和尺寸的图像,增强模型对大小变化的鲁棒性。
Resize调整图像大小。
2. 空间变换。可以增强模型对关键特征的学习,防止过拟合背景信息。
RandomCrop随机裁剪图像区域。
CenterCrop中心裁剪图像。
RandomResizedCrop随机裁剪并resize。
FiveCrop与TenCrop从图像的四个角以及中心进行多次裁切
3. 形变变换。可以模拟弹性物体运动时的形变,增强模型对形变的鲁棒性。
ElasticTransform给图像添加随机形变。
4. 仿射变换。可以从不同视角获取图像,增强模型对视角变化的鲁棒性。
RandomRotation随机旋转图像。
RandomAffine进行随机仿射变换。
RandomPerspective进行透视变换。
5. 翻转变换。增加图像方向的多样性,防止过拟合某一方向。
RandomHorizontalFlip随机水平翻转。
RandomVerticalFlip随机垂直翻转。
6. 填充变换。可以防止信息丢失,也可用于模型输入大小不匹配。
Pad在图像边缘填充特定像素,扩大图像。
按给定尺寸对图像进行缩放,Resize主要参数size可以为int型,此时,原始图像短边将缩放至size像素,长边将缩放至:size×长边÷短边����×长边÷短边 。以上述原始图片为例,假设输入size=300,原始图像短边高是448像素,长边宽是596像素,所以缩放后,长边宽为:300×596÷448=399像素300×596÷448=399像素;当size为序列时,size=(h, w),原始图像将高和宽分别缩放至h和w。除了size参数外,Resize还有其他参数,可以参考[官方文档
raw_img = read_image('data/fruit.jpeg')
transform1 = transforms.Resize(size=300)
transform2 = transforms.Resize(size=(300, 300))
transform3 = transforms.Resize(size=(800, 800))
tran_img1 = transform1(raw_img)
tran_img2 = transform2(raw_img)
tran_img3 = transform3(raw_img)
print(f'size=300,缩放后图像宽高为:{tran_img1.shape}')
print(f'size=(300, 300),缩放后图像宽高为:{tran_img2.shape}')
show_image([
(raw_img, '原始图像'),
(tran_img1, 'size=300'), # 对PIL.Image类型图片进行裁切
(tran_img2, 'size=(300, 300)'), # 对torch.Tensor类型图片进行裁切
(tran_img3, 'size=(800, 800)') # 对torch.Tensor类型图片进行裁切
])
size=300,缩放后图像宽高为:torch.Size([3, 300, 399])
size=(300, 300),缩放后图像宽高为:torch.Size([3, 300, 300])
2.2 RandomCrop
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.