一.torchvision:计算机视觉工具包
- torchvision.transforms : 常用的图像预处理方法
- torchvision.datasets : 常用数据集的dataset实现,MNIST,CIFAR-10,ImageNet等
- torchvision.model : 常用的模型预训练,AlexNet,VGG, ResNet,GoogLeNet等
二.数据增强
数据增强又称为数据增广,数据扩增,它是对训练集进行变换,使训练集更丰富,从而让模型更具泛化能力
三.transforms—裁剪
torchvision.transforms : 常用的图像预处理方法 ? 数据中心化 ? 数据标准化 ? 缩放 ? 裁剪 ? 旋转 ? 翻转 ? 填充 ? 噪声添加 ? 灰度变换 ? 线性变换 ? 仿射变换 ? 亮度、饱和度及对比度变换
3.1 transforms.Normalize()
功能:逐channel的对图像进行标准化 output = (input - mean) / std ? mean:各通道的均值 ? std:各通道的标准差 ? inplace:是否原地操作
transforms.Normalize(mean,
std,
inplace=False)
3.2 transforms.CenterCrop()
功能:从图像中心裁剪图片 ? size:所需裁剪图片尺寸
3.3 transforms.RandomCrop()
功能:从图片中随机裁剪出尺寸为size的图片 ? size:所需裁剪图片尺寸 ? padding:设置填充大小 当为a时,上下左右均填充a个像素 当为(a, b)时,上下填充b个像素,左右填充a个像素 当为(a, b, c, d)时,左,上,右,下分别填充a, b, c, d ? pad_if_need:若图像小于设定size,则填充 ? padding_mode:填充模式,有4种模式
- constant:像素值由fill设定
- edge:像素值由图像边缘像素决定
- reflect:镜像填充,最后一个像素不镜像,eg:[1,2,3,4] → [3,2,1,2,3,4,3,2]
- symmetric:镜像填充,最后一个像素镜像,eg:[1,2,3,4] → [2,1,1,2,3,4,4,3]
? fill:constant时,设置填充的像素值
transforms.RandomCrop(size,
padding=None,
pad_if_needed=False,
fill=0,
padding_mode='constant')
3.4 RandomResizedCrop()
功能:随机大小、长宽比裁剪图片 ? size:所需裁剪图片尺寸 ? scale:随机裁剪面积比例, 默认(0.08, 1) ? ratio:随机长宽比,默认(3/4, 4/3) ? interpolation:插值方法
- PIL.Image.NEAREST
- PIL.Image.BILINEAR
- PIL.Image.BICUBIC
3.5FiveCrop()
transforms.FiveCrop(size)
3.6 TenCrop()
transforms.FiveCrop(size) transforms.TenCrop(size, vertical_flip=False) 功能:在图像的上下左右以及中心裁剪出尺 寸为size的5张图片,TenCrop对这5张图片 进行水平或者垂直镜像获得10张图片 ? size:所需裁剪图片尺寸 ? vertical_flip:是否垂直翻转
transforms.TenCrop( size,
vertical_flip=False)
四.transforms—翻转、旋转
4.1RandomHorizontalFlip() RandomVerticalFlip()
功能:依概率水平(左右)或垂直(上下)翻转图片 ?p:翻转概率
RandomHorizontalFlip(p=0.5)
RandomVerticalFlip(p=0.5)
4.2RandomRotation()
功能:随机旋转图片 ? degrees:旋转角度 当为a时,在(-a,a)之间选择旋转角度 当为(a, b)时,在(a, b)之间选择旋转角度 ? resample:重采样方法 ? expand:是否扩大图片,以保持原图信息 ? center:旋转点设置,默认中心旋转
3.RandomRotation RandomRotation(degrees,
resample=False,
expand=False,
center=None)
五.transforms—图像变换
5.1Pad()
功能:对图片边缘进行填充 ? padding:设置填充大小 当为a时,上下左右均填充a个像素 当为(a, b)时,上下填充b个像素,左右填充a个像素 当为(a, b, c, d)时,左,上,右,下分别填充a, b, c, d ? padding_mode:填充模式,有4种模式,constant、edge、reflect和symmetric ? fill:constant时,设置填充的像素值,(R, G, B) or (Gray)
transforms.Pad(padding,
fill=0,
padding_mode='constant')
5.2ColorJitter
功能:调整亮度、对比度、饱和度和色相 ? brightness:亮度调整因子 当为a时,从[max(0, 1-a), 1+a]中随机选择 当为(a, b)时,从[a, b]中 ? contrast:对比度参数,同brightness ? saturation:饱和度参数,同brightness ? hue:色相参数,当为a时,从[-a, a]中选择参数,注: 0<= a <= 0.5 当为(a, b)时,从[a, b]中选择参数,注:-0.5 <= a <= b <= 0.5
transforms.ColorJitter(brightness=0,
contrast=0,
saturation=0,
hue=0)
5.3Grayscale
RandomGrayscale(num_output_channels, p=0.1)
5.4 RandomGrayscale
功能:依概率将图片转换为灰度图 ? num_ouput_channels:输出通道数 只能设1或3 ? p:概率值,图像被转换为灰度图的概率
Grayscale(num_output_channels)
5.5RandomAffine
功能:对图像进行仿射变换,仿射变换是二维的线性变换,由五种基本原子变换构成,分别是旋转、平移、缩放、错切和翻转 ? degrees:旋转角度设置 ? translate:平移区间设置,如(a, b), a设置宽(width),b设置高(height) 图像在宽维度平移的区间为 -img_width * a < dx < img_width * a ? scale:缩放比例(以面积为单位) ? fill_color:填充颜色设置
RandomAffine(degrees,
translate=None,
scale=None,
shear=None,
resample=False,
fillcolor=0)
5.6RandomErasing()
功能:对图像进行随机遮挡 ? p:概率值,执行该操作的概率 ? scale:遮挡区域的面积 ? ratio:遮挡区域长宽比 ? value:设置遮挡区域的像素值,(R, G, B) or (Gray)
RandomErasing(p=0.5,
scale=(0.02, 0.33),
ratio=(0.3, 3.3),
value=0,
inplace=False)
5.7transforms.Lambda()
功能:用户自定义lambda方法 ? lambd:lambda匿名函数
lambda [arg1 [,arg2, … , argn]] : expression
transforms.Lambda(lambd)
例:
transforms.TenCrop(200, vertical_flip=True),
transforms.Lambda(lambda crops: torch.stack([transforms.Totensor()(crop) for crop in crops])),
六、transforms的操作
6.1transforms.RandomChoice()
功能:从一系列transforms方法中随机挑选一个
transforms.RandomChoice([transforms1, transforms2, transforms3])
6.2transforms.RandomApply()
功能:依据概率执行一组transforms操作
transforms.RandomApply([transforms1, transforms2, transforms3], p=0.5)
6.3transforms.RandomOrder()
功能:对一组transforms操作打乱顺序
transforms.RandomOrder([transforms1, transforms2, transforms3])
七、自定义transforms
自定义transforms要素:
- 仅接收一个参数,返回一个参数
- 注意上下游的输出与输入
class Compose(object):
def __call__(self, img):
for t in self.transforms:
img = t(img)
return img
通过类实现多参数传入:
class YourTransforms(object):
def __init__(self, ...):
...
def __call__(self, img):
...
return img
7.1椒盐噪声
椒盐噪声又称为脉冲噪声,是一种随机出现的白点或者黑点, 白点称为盐噪声,黑色为椒噪声 信噪比(Signal-Noise Rate, SNR)是衡量噪声的比例,图像中为图像像素的占比
class AddPepperNoise(object):
def __init__(self, snr, p):
self.snr = snr
self.p = p
def __call__(self, img):
```
添加椒盐噪声具体实现过程
```
return img
class Compose(object):
def __call__(self, img):
for t in self.transforms:
img = t(img)
return img
八、transforms方法总览
一、裁剪 ? transforms.CenterCrop ? transforms.RandomCrop ? transforms.RandomResizedCrop ? transforms.FiveCrop ? transforms.TenCrop 二、翻转和旋转 ? transforms.RandomHorizontalFlip ? transforms.RandomVerticalFlip ? transforms.RandomRotation 三、图像变换 ? transforms.Pad ? transforms.ColorJitter ? transforms.Grayscale ? transforms.RandomGrayscale ? transforms.RandomAffine ? transforms.LinearTransformation ? transforms.RandomErasing ? transforms.Lambda ? transforms.Resize ? transforms.Totensor ? transforms.Normalize 四、transforms的操作 ? transforms.RandomChoice ? transforms.RandomApply ? transforms.RandomOrd
点赞!收藏!感谢支持!
这是pytorch目前提供的方法
from torchvision import transforms
from PIL import Image
import matplotlib.pyplot as plt
img = Image.open("img/5.jpg")
data1 = transforms.RandomResizedCrop(224)(img)
data4 = transforms.RandomCrop(224)(img)
data5 = transforms.Resize([512, 512])(img)
data6 = transforms.CenterCrop([512, 512])(img)
data7 = transforms.RandomHorizontalFlip(p=0.9)(img)
data8 = transforms.RandomVerticalFlip(p=0.9)(img)
data9 = transforms.RandomRotation(45)(img)
data10 = transforms.Pad(padding=100)(img)
data11 = transforms.ColorJitter(brightness=5,
contrast=0,
saturation=0, hue=0)(img)
data12 = transforms.RandomErasing(p=0.5,
scale=(0.02, 0.33),
ratio=(0.3, 3.3),
value=0,
inplace=False)(img)
data13 = transforms.GaussianBlur(5)(img)
plt.subplot(2, 2, 1), plt.imshow(img), plt.title("input")
plt.subplot(2, 2, 2), plt.imshow(data1), plt.title("data1")
plt.subplot(2, 2, 3), plt.imshow(data4), plt.title("data2")
plt.subplot(2, 2, 4), plt.imshow(data13), plt.title("data3")
plt.show()
|