Transforms是在计算机视觉工具包torchvision下的包,常用于对图像进行预处理(如裁剪、翻转和旋转、图像变换……),提高泛化能力。
相关阅读:Pillow(PIL)图像处理库入门教程
torchvision.transforms:常用的图像预处理方法
torchvision.datasets:常用数据集的dataset实现(MNIST、CIFAR-10、ImageNet等)
torchvision.model:常用的模型预训练(AlexNet、VGG、ResNet、GoogLeNet等)
import numpy as np
import torch
import torchvision.transforms as transforms
from PIL import Image
transforms.Compose
将一系列的transforms有序组合,实现时按照这些方法依次对图像操作。
norm_mean = [0.485, 0.456, 0.406]
norm_std = [0.229, 0.224, 0.225]
transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize(norm_mean, norm_std),
])
1 裁剪(Crop)
1.1 中心裁剪:transforms.CenterCrop
依据给定的size从中心裁剪
transforms.CenterCrop(size)
size
:所需裁剪图片尺寸。为序列时表示(h, w)
,为int时表示(size, size)
即正方形裁剪,下同
1.2 随机裁剪:transforms.RandomCrop
从图片中随机裁剪出尺寸为size的图片(位置随机裁剪)
transforms.RandomCrop(size,
padding=None,
pad_if_needed=False,
fill=0,
padding_mode='constant')
size
:所需裁剪图片尺寸padding
:设置填充大小- 当为
a
时,上下左右均填充$a$个像素 - 当为
(a, b)
时,左右填充$a$个像素,上下填充$b$个像素 - 当为
(a, b, c, d)
时,左、上、右、下4862分别填充$a$、$b$、$c$、$d$
- 当为
pad_if_need
:若图像小于设定size
,则填充padding_mode
:填充模式constant
:像素值由fill
参数设定edge
:像素值由图像边缘像素决定reflect
:镜像填充,最后一个像素不镜像。【例】对$[1,2,3,4]$进行2个像素的填充。左侧最后一个像素不镜像,忽略$1$,从左至右为$2,3$,镜像填充为$[3,2,1,2,3,4]$。同理,右侧忽略$4$,从右至左为$3,2$,最终填充为$[3,2,1,2,3,4,3,2]$。symmetric
:镜像填充,最后一个像素镜像。【例】对上例进行最后一个像素镜像得$[1,2,3,4]\rightarrow[2,1,1,2,3,4,4,3]$。不会跳过$1$和$4$,分别从$1$和$4$开始进行镜像填充。
fill
:填充模式为constant
时,设置填充的像素值((R,G,B)
或(Grey)
)
1.3 随机长宽比裁剪:transforms.RandomResizedCrop
随机大小、长宽比裁剪图片
transforms.RandomResizedCrop(size,
scale=(0.08, 1.0),
ratio=(3/4, 4/3),
interpolation=2)
size
:所需裁剪图片尺寸scale
:随机裁剪面积比例。默认(0.08, 1)
,即0.08~1之间随机选取一个数ratio
:随机长宽比。默认(3/4, 4/3)
,即3/4~4/3之间随机选取一个数interpolation
:插值方法。裁剪出来的图片尺寸可能小于size
,所以需进行插值处理PIL.Image.NEAREST
:最近邻插值PIL.Image.BILINEAR
:双线性插值(默认值)PIL.Image.BICUBIC
:双三次插值
1.4 上下左右中心裁剪:transforms.FiveCrop
在图像的左上角、右上角、左下角、右下角以及中心裁剪出尺寸为size的5张图片
transforms.FiveCrop(size)
size
:所需裁剪图片尺寸大小
1.5 上下左右中心裁剪后翻转: transforms.TenCrop
在图像的上下左右以及中心裁剪出尺寸为size的5张图片,在这五张图片上进行水平或者垂直镜像获得10张图片
transforms.TenCrop(size, vertical_flip=False)
size
:所需裁剪图片尺寸大小vertical_flip
:是否垂直翻转,True为垂直翻转,False为水平翻转
2 翻转和旋转(Flip and Rotation)
2.1 随机水平翻转:transforms.RandomHorizontalFlip
以给定的概率随机水平翻转给定的PIL图像
transforms.RandomHorizontalFlip(p=0.5)
p
:翻转概率
2.2 随机垂直翻转:transforms.RandomVerticalFlip
以给定的概率随机垂直翻转给定的PIL图像
transforms.RandomVerticalFlip(p=0.5)
p
:翻转概率
2.3 随机旋转:transforms.RandomRotation
按角度旋转图像。
transforms.RandomRotation(degrees,
resample=False,
expand=False,
center=None)
degrees
:旋转角度- 当为
a
时,在$(-a,a)$之间选择旋转角度 - 当为
(a,b)
时,在$(a,b)$之间选择旋转角度
- 当为
resample
:重采样方法(同仿射变换)expand
:是否扩大图片,以保持原图信息。图片旋转后,可能会超出矩形框,超出部分可能会丢失。若为True,矩形框会变大center
:旋转点设置。默认中心旋转,center=(0, 0)
表示左上角旋转
3 图像变换
3.1 调整大小:transforms.Resize
将输入图像的大小调整为给定大小
transforms.Resize(size, interpolation=2)
size
:所需裁剪图片尺寸。若为序列(h, w)
,则输出大小与此匹配;若为int,则图像的较小边缘将与此匹配interpolation
:插值方法。默认为PIL.Image.BILINEAR
(同RandomResizedCrop)
3.2 标准化:transforms.Normalize
用平均值和标准差归一化张量图像。对于$n$通道,给定$mean:M_1,\cdots,M_n$和$std:S_1,\cdots,S_n$,标准化输入的每个通道:
transforms.Normalize(mean, std)
mean
:每个通道的均值序列std
:每个通道的标准偏差序列
3.3 转为张量:transforms.ToTensor
将PIL Image或ndarray转换为张量(Tensor),并归一化至0~1。
transforms.ToTensor()
注意此处的归一化为直接除以255,因此需事先自行修改原数组尺寸。
3.4 填充:transforms.Pad
对图片边缘进行填充
transforms.Pad(padding, fill=0, padding_mode=‘constant’)
padding
:设置填充大小(同RandomCrop,下同)padding_mode
:填充模式(constant
、edge
、reflect
、symmetric
)fill
:填充模式为constant
时,设置填充的像素值
3.5 修改亮度、对比度、饱和度:transforms.ColorJitter
随机更改图像的亮度,对比度和饱和度
transforms.ColorJitter(brightness=0,
contrast=0,
saturation=0,
hue=0)
brightness
:亮度调整因子- 当为
a
时,从$[\max(0, 1-a), 1+a]$中随机选择一个数 - 当为
(a, b)
时,从$[a, b]$中随机选择一个数
- 当为
contrast
:对比度参数(同上)saturation
:饱和度参数(同上)hue
:色相参数- 当为
a
时,从$[-a, a]$中选择参数(注:$0≤a≤0.5$) - 当为
(a, b)
时,从$[a, b]$中选择参数(注:$-0.5≤a≤b≤0.5$)
- 当为
3.6 转灰度图:transforms.Grayscale
依概率将图片转换为灰度图
transforms.RandomGrayscale(num_output_channels, p=0.1)
# Grayscale为p=1时RandomGrayscale的特例
transforms.Grayscale(num_output_channels=1)
num_ouput_channels
:输出通道数,只能为$1$或$3$p
:图像被转换为灰度图的概率
3.7 仿射变换:transforms.RandomAffine
对图像进行仿射变换。仿射变换是二维的线性变换,由五种基本原子变换构成,分别是旋转、平移、缩放、错切和翻转。经过五种变换的随机组合,即可得到二维线性变换。
transforms.RandomAffine(degrees,
translate=None,
scale=None,
shear=None,
resample=False,
fillcolor=0)
degrees
:旋转角度。必设参数translate
:平移区间设置。如(a, b)
,$a$设置宽(width),$b$设置高(height)。图像在宽维度平移的区间为-img_width * a < dx < img_width * a
scale
:原始图像占resize后图像的比例,即缩放比例(以面积为单位),0~1之间fill_color
:填充颜色设置。默认黑色填充shear
:错切角度设置,有水平错切和垂直错切- 若为
a
,则仅在x轴错切,错切角度在$(-a,a)$之间,以中心旋转形式 - 若为
(a, b)
,则仅在x轴错切,错切角度在$(a, b)$之间 - 若为
(a, h, c, d)
,则$a, b$设置x轴角度,$c, d$设置y轴角度
- 若为
resample
:重采样方式,有NEAREST
、BILINEAR
、BICUBIC
(详见插值方法)
3.8 随机遮挡:transforms.RandomErasing
对图像张量进行随机遮挡操作
transforms.RandomErasing(p=0.5,
scale=(0.02, 0.33),
ratio=(0.3, 3.3),
value=0,
inplace=False)
p
:执行该操作的概率scale
:遮挡区域的面积。默认(0.02, 0.33)
ratio
:遮挡区域长宽比,设置一个区间随机选择。默认(0.3, 3.3)
value
:设置遮挡区域的像素值(参考之前的fill
),0~1之间。
3.9 自定义匿名方法:transforms.Lambda
利用Lambda匿名函数实现自定义的简单操作
transforms.Lambda(lambd)
lambd
:lambda匿名函数,语法:lambda [arg_1 [, arg_2, … , arg_n]] : expression
4 随机化transforms操作
4.1 随机选择操作:transforms.RandomChoice
从给定的一系列transforms中随机选择一个进行操作
transforms.RandomChoice([transforms1, transforms2, transforms3])
4.2 随机执行操作:transforms.RandomApply
依据概率执行一组transforms操作
transforms.RandomApply([transforms1, transforms2, transforms3], p=0.5)
4.3 随机打乱操作:transforms.RandomOrder
将transforms中的操作顺序随机打乱
transforms.RandomOrder([transforms1, transforms2, transforms3])