PyTorch模型训练深入指南:第二部分——数据处理与加载

目录

简介

随机裁剪

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. Totensor

数据标准化

(

减均值,除以标准差

)

随机裁剪

在裁剪之前先对图片的上下左右均填充上

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

的⼆⼗⼆个⽅法

本小节对

transforms.py

中的各个预处理方法进行介绍和总结。主要从官方文档中总结而来,官方文档只是将方法陈列,没有归纳总结,顺序很乱,这里总结一共有四大类,方便大家索引:

1.

裁剪

——Crop

中心裁剪:

transforms.CenterCrop

class

torchvision.transforms.CenterCrop

(

size

)

功能:依据给定的

size

从中心裁剪

参数:

size-

(sequence or int)

,若为

sequence,

则为

(h,w)

,若为

int

,则

(size,size)

随机裁剪:

transforms.RandomCrop

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

,暂不了解。

  1. symmetric

,暂不了解。

随机长宽比裁剪:

transforms.RandomResizedCrop

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

)

上下左右中心裁剪:

transforms.FiveCrop

class

torchvision.transforms.FiveCrop

(

size

)

功能:

对图片进行上下左右以及中心裁剪,获得

5

张图片,返回一个

4D-tensor

参数:

size-

(sequence or int)

,若为

sequence,

则为

(h,w)

,若为

int

,则

(size,size)

上下左右中心裁剪后翻转,

transforms.TenCrop

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

,则表示在

30-60

度之间随机旋转

  • resample-

重采样方法选择,可选

PIL.Image.NEAREST, PIL.Image.BILINEAR, PIL.Image.BICUBIC

,默认为最近邻

  • expand- ?
  • center-

可选为中心旋转还是左上角旋转

3.

图像变换

resize

transforms.Resize

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

标准化:

transforms.Normalize

class

torchvision.transforms.Normalize

(

mean

,

std

)

功能:对数据按通道进行标准化,即先减均值,再除以标准差,注意是

h*w*c

转为

tensor

transforms.ToTensor

class

torchvision.transforms.ToTensor

功能:

PIL Image

或者

ndarray

转换为

tensor


并且归一化至

[0-1]

注意事项:

归一化至

[0-1]

是直接除以

255

,若自己的

ndarray

数据尺度有变化,则需要自行修改。

填充:

transforms.Pad

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

,?

  1. symmetric

,?

修改亮度、对比度和饱和度:

transforms.ColorJitter

class

torchvision.transforms.ColorJitter

(

brightness=0

,

contrast=0

,

saturation=0

,

hue=0

)

功能:修改修改亮度、对比度和饱和度

转灰度图:

transforms.Grayscale

class

torchvision.transforms.Grayscale

(

num_output_channels=1

)

功能:将图片转换为灰度图

参数:

num_output_channels- (int)

,当为

1

时,正常的灰度图,当为

3

时,

3 channel with r ==g == b

线性变换:

transforms.LinearTransformation()

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

仿射变换:

transforms.RandomAffine

class

torchvision.transforms.RandomAffine

(

degrees

,

translate=None

,

scale=None

,

shear=None

,

resample=False

,

fillcolor=0

)

功能:仿射变换

依概率

p

转为灰度图:

transforms.RandomGrayscale

class

torchvision.transforms.RandomGrayscale

(

p=0.1

)

功能:依概率

p

将图片转换为灰度图,若通道数为

3

,则

3 channel with r == g == b

将数据转换为

PILImage

transforms.ToPILImage

class

torchvision.transforms.ToPILImage

(

mode=None

)

功能:将

tensor

或者

ndarray

的数据转换为

PIL Image

类型数据

参数:

mode-

None

时,为

1

通道,

mode=3

通道默认转换为

RGB

4

通道默认转换为

RGBA

transforms.Lambda

Apply a user-defined lambda as a transform.

暂不了解,待补充

4.

transforms

操作,使数据增强更灵活

PyTorch

不仅可设置对图片的操作,还可以对这些操作进行随机选择、组合

transforms.RandomChoice(transforms)

功能:从给定

的一系列

transforms

中选一个进行操作

randomly picked from a list

transforms.RandomApply(transforms, p=0.5)

功能:给一个

transform

加上概率,以一定的概率执行该操作

transforms.RandomOrder

功能:将

transforms

中的操作顺序随机打乱


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值