torchvision.transforms图像预处理常用方法简介

Transforms是在计算机视觉工具包torchvision下的包,常用于对图像进行预处理(如裁剪、翻转和旋转、图像变换……),提高泛化能力。

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 a个像素
    • 当为(a, b)时,左右填充 a a a个像素,上下填充 b b b个像素
    • 当为(a, b, c, d)时,左、上、右、下4862分别填充 a a a b b b c c c d d d
  • pad_if_need:若图像小于设定size,则填充
  • padding_mode:填充模式
    1. constant:像素值由fill参数设定
    2. edge:像素值由图像边缘像素决定
    3. reflect:镜像填充,最后一个像素不镜像。【例】对 [ 1 , 2 , 3 , 4 ] [1,2,3,4] [1,2,3,4]进行2个像素的填充。左侧最后一个像素不镜像,忽略 1 1 1,从左至右为 2 , 3 2,3 2,3,镜像填充为 [ 3 , 2 , 1 , 2 , 3 , 4 ] [3,2,1,2,3,4] [3,2,1,2,3,4]。同理,右侧忽略 4 4 4,从右至左为 3 , 2 3,2 3,2,最终填充为 [ 3 , 2 , 1 , 2 , 3 , 4 , 3 , 2 ] [3,2,1,2,3,4,3,2] [3,2,1,2,3,4,3,2]
    4. symmetric:镜像填充,最后一个像素镜像。【例】对上例进行最后一个像素镜像得 [ 1 , 2 , 3 , 4 ] → [ 2 , 1 , 1 , 2 , 3 , 4 , 4 , 3 ] [1,2,3,4]\rightarrow[2,1,1,2,3,4,4,3] [1,2,3,4][2,1,1,2,3,4,4,3]。不会跳过 1 1 1 4 4 4,分别从 1 1 1 4 4 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,所以需进行插值处理
    1. PIL.Image.NEAREST:最近邻插值
    2. PIL.Image.BILINEAR:双线性插值(默认值)
    3. 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,a) (a,a)之间选择旋转角度
    • 当为(a,b)时,在 ( a , b ) (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 n n通道,给定 m e a n : M 1 , ⋯   , M n mean:M_1,\cdots,M_n mean:M1,,Mn s t d : S 1 , ⋯   , S n std:S_1,\cdots,S_n std:S1,,Sn,标准化输入的每个通道: i n p u t c h a n n e l ← i n p u t c h a n n e l − m e a n c h a n n e l s t d c h a n n e l input_{channel}\leftarrow \frac{input_{channel}-mean_{channel}}{std_{channel}} inputchannelstdchannelinputchannelmeanchannel

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:填充模式(constantedgereflectsymmetric
  • fill:填充模式为constant时,设置填充的像素值

3.5 修改亮度、对比度、饱和度:transforms.ColorJitter

随机更改图像的亮度,对比度和饱和度

transforms.ColorJitter(brightness=0,
					   contrast=0,
					   saturation=0,
					   hue=0)
  • brightness:亮度调整因子
    • 当为a时,从 [ max ⁡ ( 0 , 1 − a ) , 1 + a ] [\max(0, 1-a), 1+a] [max(0,1a),1+a]中随机选择一个数
    • 当为(a, b)时,从 [ a , b ] [a, b] [a,b]中随机选择一个数
  • contrast:对比度参数(同上)
  • saturation:饱和度参数(同上)
  • hue:色相参数
    • 当为a时,从 [ − a , a ] [-a, a] [a,a]中选择参数(注: 0 ≤ a ≤ 0.5 0≤a≤0.5 0a0.5
    • 当为(a, b)时,从 [ a , b ] [a, b] [a,b]中选择参数(注: − 0.5 ≤ a ≤ b ≤ 0.5 -0.5≤a≤b≤0.5 0.5ab0.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 1 1 3 3 3
  • p:图像被转换为灰度图的概率

3.7 仿射变换:transforms.RandomAffine

对图像进行仿射变换。仿射变换是二维的线性变换,由五种基本原子变换构成,分别是旋转平移缩放错切翻转。经过五种变换的随机组合,即可得到二维线性变换。

transforms.RandomAffine(degrees,
						translate=None,
						scale=None,
						shear=None,
						resample=False,
						fillcolor=0)
  • degrees:旋转角度。必设参数
  • translate:平移区间设置。如(a, b) a a a设置宽(width), b b b设置高(height)。图像在宽维度平移的区间为-img_width * a < dx < img_width * a
  • scale:原始图像占resize后图像的比例,即缩放比例(以面积为单位),0~1之间
  • fill_color:填充颜色设置。默认黑色填充
  • shear:错切角度设置,有水平错切和垂直错切
    • 若为a,则仅在x轴错切,错切角度在 ( − a , a ) (-a,a) (a,a)之间,以中心旋转形式
    • 若为(a, b),则仅在x轴错切,错切角度在 ( a , b ) (a, b) (a,b)之间
    • 若为(a, h, c, d),则 a , b a, b a,b设置x轴角度, c , d c, d c,d设置y轴角度
  • resample:重采样方式,有NEARESTBILINEARBICUBIC(详见插值方法)

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])
  • 45
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Akira37

💰unneeded

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值