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)时,左、上、右、下分别填充a、b、c、d
- 当为
pad_if_need:若图像小于设定size,则填充padding_mode:填充模式constant:像素值由fill参数设定edge:像素值由图像边缘像素决定reflect:镜像填充,最后一个像素不镜像。【例】对[1,2,3,4]进行2个像素的填充。左侧最后一个像素不镜像,忽略\text{1},从左至右为2,3,镜像填充为[3,2,1,2,3,4]。同理,右侧忽略\text{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]。不会跳过\text{1}和\text{4},分别从\text{1}和\text{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,\dots,M_n和std:S_1,\dots,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 * ascale:原始图像占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])