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-8import 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
中的操作顺序随机打乱