目录
简介
随机裁剪
Totensor
数据标准化(减均值,除以标准差)
transforms 的⼆⼗⼆个⽅法
1. 裁剪——Crop
中心裁剪:transforms.CenterCrop
随机裁剪:transforms.RandomCrop
随机长宽比裁剪:transforms.RandomResizedCrop
上下左右中心裁剪:transforms.FiveCrop
上下左右中心裁剪后翻转,transforms.TenCrop
2. 翻转和旋转——Flip and Rotation
依概率 p 水平翻转
依概率 p 垂直翻转
随机旋转
3.图像变换
resize:transforms.Resize
标准化:transforms.Normalize
转为 tensor:transforms.ToTensor
填充:transforms.Pad
修改亮度、对比度和饱和度:transforms.ColorJitter
转灰度图:transforms.Grayscale
线性变换:transforms.LinearTransformation()
仿射变换:transforms.RandomAffine
依概率 p 转为灰度图:transforms.RandomGrayscale
将数据转换为 PILImage:transforms.ToPILImage
transforms.Lambda
4.对 transforms 操作,使数据增强更灵活
transforms.RandomChoice(transforms)
transforms.RandomApply(transforms, p=0.5)
transforms.RandomOrder
简介
在
PyTorch
中,这些数据增强方法放在了
transforms.py
文件中。这些数据处理可以满足我们大部分的需求,
我们也可以自定义
数据处理函数,实现自己的数据增强。
# 数据预处理设置
normMean = [0.4948052, 0.48568845, 0.44682974]
normStd = [0.24580306, 0.24236229, 0.2603115]
normTransform = transforms.Normalize(normMean, normStd)
trainTransform = transforms.Compose([
transforms.Resize(32),
transforms.RandomCrop(32, padding=4),
transforms.ToTensor(),
normTransform
])
validTransform = transforms.Compose([
transforms.ToTensor(),
normTransform
])
前三行设置均值,标准差,以及数据标准化:
transforms.Normalize()
函数,这里是以通道为单位进行计算均值,标准差。
然后用
transforms.Compose
将所需要进行的处理给
compose
起来,并且需要注意顺序!
在训练时,依次对图片进行以下操作:
1.
随机裁剪
2. Totensor
3.
数据标准化
(
减均值,除以标准差
)
随机裁剪
在裁剪之前先对图片的上下左右均填充上
4
个
pixel
,值为0
,即变成一个
36*36
的数据,然后再随机进行
32*32
的裁剪。
Totensor
第二个处理是
transforms.ToTensor()
在这里会对数据进行
transpose
,原来是
h*w*c
,会经过
img = img.transpose(0,1).transpose(0, 2).contiguous()
,变成
c*h*w
再除以
255
,使得像素值归一化至
[0-1]
之间.
数据标准化(减均值,除以标准差)
在进行
Normalize
时,需要设置均值和方差,在这里直接给出了,但在实际应用中是要去训练集中计算的,天下可没有免费的午餐。
# coding: utf-8
import numpy as np
import cv2
import random
import os
"""
随机挑选CNum张图片,进行按通道计算均值mean和标准差std
先将像素从0~255归一化至 0-1 再计算
"""
train_txt_path = os.path.join("..", "..", "Data/train.txt")
CNum = 2000 # 挑选多少图片进行计算
img_h, img_w = 32, 32
imgs = np.zeros([img_w, img_h, 3, 1])
means, stdevs = [], []
with open(train_txt_path, 'r') as f:
lines = f.readlines()
random.shuffle(lines) # shuffle , 随机挑选图片
for i in range(CNum):
img_path = lines[i].rstrip().split()[0]
img = cv2.imread(img_path)
img = cv2.resize(img, (img_h, img_w))
img = img[:, :, :, np.newaxis]
imgs = np.concatenate((imgs, img), axis=3)
print(i)
imgs = imgs.astype(np.float32)/255.
for i in range(3):
pixels = imgs[:,:,i,:].ravel() # 拉成一行
means.append(np.mean(pixels))
stdevs.append(np.std(pixels))
means.reverse() # BGR --> RGB
stdevs.reverse()
print("normMean = {}".format(means))
print("normStd = {}".format(stdevs))
print('transforms.Normalize(normMean = {}, normStd = {})'.format(means, stdevs))
本小节对
transforms.py
中的各个预处理方法进行介绍和总结。主要从官方文档中总结而来,官方文档只是将方法陈列,没有归纳总结,顺序很乱,这里总结一共有四大类,方便大家索引:
1. 裁剪——Crop
class
torchvision.transforms.CenterCrop
(
size
)
功能:依据给定的
size
从中心裁剪
参数:
size-
(sequence or int)
,若为
sequence,
则为
(h,w)
,若为
int
,则
(size,size)
class
torchvision.transforms.RandomCrop
(
size
,
padding=None
,
pad_if_needed=False
,
fill=0
,padding_mode='constant'
)
功能:依据给定的
size
随机裁剪
参数:
size-
(sequence or int)
,若为
sequence,
则为
(h,w)
,若为
int
,则
(size,size)
padding-
(sequence or int, optional)
,此参数是设置填充多少个
pixel
。
当为
int
时,图像上下左右均填充
int
个,例如
padding=4
,则上下左右均填充
4
个
pixel
,若为
32*32
,则会变成
40*40
。
当为
sequence
时,若有
2
个数,则第一个数表示左右扩充多少,第二个数表示上下的。当有
4
个数时,则为左,上,右,下。
fill-
(int or tuple)
填充的值是什么(仅当填充模式为
constant
时有用)。
int
时,各通道均填充该值,当长度为
3
的
tuple
时,表示
RGB
通道需要填充的值。
padding_mode-
填充模式,这里提供了
4
种填充模式,
1.constant
,常量。
2.edge
按照图片
边缘的像素值来填充。
3.reflect
,暂不了解。
4. symmetric
,暂不了解。
class
torchvision.transforms.RandomResizedCrop
(
size
,
scale=(0.08
,
1.0)
,
ratio=(0.75
,
1.3333333333333333)
,
interpolation=2
)
功能:随机大小,随机长宽比裁剪原始图片,最后将图片
resize
到设定好的
size
参数:
size-
输出的分辨率
scale-
随机
crop
的大小区间,如
scale=(0.08, 1.0)
,表示随机
crop
出来的图片会在的
0.08倍至
1
倍之间。
ratio-
随机长宽比设置
interpolation-
插值的方法,默认为双线性插值
(
PIL.Image.BILINEAR
)
class
torchvision.transforms.FiveCrop
(
size
)
功能:
对图片进行上下左右以及中心裁剪,获得
5
张图片,返回一个
4D-tensor
参数:
size-
(sequence or int)
,若为
sequence,
则为
(h,w)
,若为
int
,则
(size,size)
class torchvision.transforms.TenCrop(size, vertical_flip=False)
功能:
对图片进行上下左右以及中心裁剪,然后全部翻转(水平或者垂直),获得
10
张图片,返回一个
4D-tensor
。
参数:
size-
(sequence or int)
,若为
sequence,
则为
(h,w)
,若为
int
,则
(size,size)
vertical_flip
(
bool
) -
是否垂直翻转,默认为
flase
,即默认为水平翻转
2. 翻转和旋转——Flip and Rotation
依概率 p 水平翻转
class
torchvision.transforms.RandomHorizontalFlip
(
p=0.5
)
功能:
依据概率
p
对
PIL
图片进行水平翻转
参数:
p-
概率,默认值为
0.5
依概率 p 垂直翻转
class
torchvision.transforms.RandomVerticalFlip
(
p=0.5
)
功能:
依据概率
p
对
PIL
图片进行垂直翻转
参数:
p-
概率,默认值为
0.5
随机旋转
class
torchvision.transforms.RandomRotation
(
degrees
,
resample=False
,
expand=False
,
center=None
)
功能:
依
degrees
随机旋转一定角度
参数:
degress-
(
sequence or
float
or
int
)
若为单个数,如 30,则表示在(-30,+30)之间随机旋转 若为 sequence,如(30,60),则表示在 30-60 度之间随机旋转resample- 重采样方法选择,可选PIL.Image.NEAREST, PIL.Image.BILINEAR, PIL.Image.BICUBIC,默认为最近邻 expand- ? center- 可选为中心旋转还是左上角旋转
3.图像变换
class
torchvision.transforms.Resize
(
size
,
interpolation=2
)
功能:
重置图像分辨率
参数:
size-
If size is an int, if height > width, then image will be rescaled to (size * height / width,size)
,所以建议
size
设定为
h*w
interpolation- 插值方法选择,默认为 PIL.Image.BILINEAR
class
torchvision.transforms.Normalize
(
mean
,
std
)
功能:对数据按通道进行标准化,即先减均值,再除以标准差,注意是
h*w*c
class
torchvision.transforms.ToTensor
功能:
将
PIL Image
或者
ndarray
转换为
tensor
,并且归一化至
[0-1]
注意事项:
归一化至
[0-1]
是直接除以
255
,若自己的
ndarray
数据尺度有变化,则需要自行修改。
class
torchvision.transforms.Pad
(
padding
,
fill=0
,
padding_mode='constant'
)
功能:对图像进行填充
参数:
padding-
(sequence or int, optional)
,此参数是设置填充多少个
pixel
。
当为
int
时,图像上下左右均填充
int
个,例如
padding=4
,则上下左右均填充
4
个
pixel
,若为
32*32
,则会变成
40*40
。
当为
sequence
时,若有
2
个数,则第一个数表示左右扩充多少,第二个数表示上下的。当
有
4
个数时,则为左,上,右,下。
fill-
(int or tuple)
填充的值是什么(仅当填充模式为
constant
时有用)。
int
时,各通道均填充该值,当长度为
3
的
tuple
时,表示
RGB
通道需要填充的值。
padding_mode-
填充模式,这里ᨀ供了
4
种填充模式,
1.constant
,常量。
2.edge
按照图片边缘的像素值来填充。
3.reflect
,?
4. symmetric
,?
class
torchvision.transforms.ColorJitter
(
brightness=0
,
contrast=0
,
saturation=0
,
hue=0
)
功能:修改修改亮度、对比度和饱和度
class
torchvision.transforms.Grayscale
(
num_output_channels=1
)
功能:将图片转换为灰度图
参数:
num_output_channels- (int)
,当为
1
时,正常的灰度图,当为
3
时,
3 channel with r ==g == b
class
torchvision.transforms.LinearTransformation
(
transformation_matrix
)
功能:对矩阵做线性变化,可用于白化处理!
whitening: zero-center the data, computethe data covariance matrix
参数:
transformation_matrix
(
Tensor
) – tensor [D x D], D = C x H x W
class
torchvision.transforms.RandomAffine
(
degrees
,
translate=None
,
scale=None
,
shear=None
,
resample=False
,
fillcolor=0
)
功能:仿射变换
class
torchvision.transforms.RandomGrayscale
(
p=0.1
)
功能:依概率
p
将图片转换为灰度图,若通道数为
3
,则
3 channel with r == g == b
class
torchvision.transforms.ToPILImage
(
mode=None
)
功能:将
tensor
或者
ndarray
的数据转换为
PIL Image
类型数据
参数:
mode-
为
None
时,为
1
通道,
mode=3
通道默认转换为
RGB
,
4
通道默认转换为
RGBA
Apply a user-defined lambda as a transform.
暂不了解,待补充
PyTorch
不仅可设置对图片的操作,还可以对这些操作进行随机选择、组合
功能:从给定
的一系列
transforms
中选一个进行操作
,
randomly picked from a list
功能:给一个
transform
加上概率,以一定的概率执行该操作
功能:将
transforms
中的操作顺序随机打乱