I 前言
训练一个优秀的神经网络需要上万的图片数据,而当自己目前的数据集数据不足时(只有几百张图片数据),可以使用数据增强(Data Augmentation)方法来扩充自己的图片数据集。Trochvision是PyTorch框架下的一个图像处理库,其中torchvision.transforms包中的函数可以对数据集中的图片进行处理,以实现数据增强的效果.
II Anaconda环境下安装
见https://blog.csdn.net/weixin_41978493/article/details/107126333.
III 函数用法
1 transform函数组合法
1.1 将多个transform组合使用
transforms.Compose(transforms.Func)
- Compose函数的参数可以放入多个transform函数,对原始图像按顺序进行处理.
1.2 随机选择一个transform进行使用
transforms.RandomChoice(transforms.Func)
1.3 选择一个transform按概率进行使用
transforms.RandomApply(transforms, p=0.5)
1.4 将内部的transform打乱使用
transforms.RandomOrder(transforms)
2 Tensor、PILImage、ndarray三者之间的转换
2.1 转换为Tensor
transform.ToTensor()(img/ndarray)
- 函数介绍:将一个三通道取值范围为[0,255]的
PIL.Image
或维度为(H,W,C)的numpy.ndarray
转换成维度为[C,H,W],且三通道取值范围为[0,1]的Tensor.
2.2 转换为PIL.Image
transforms.ToPILImage()(ndarray/tensor.float())
- 函数介绍:将
numpy.ndarray
或Tensor
转换成PIL.Image
. - 转换要求:
ndarray
的dtype=uint8,数据的维度为(H,W,C),且取值范围为[0,255];Tensor
只能为FloatTensor
,且维度为(C,H,W).
3. 对Tensor进行归一化
transforms.Normalize(mean, std)
- 函数介绍:对Tensor进行归一化,常与
transform.ToTensor()
结合使用。将三通道的数值先归一化到[0,1],再归一化至[-1,1]. - 参数:
mean - (R,G,B)三通道的的均值.
std - (R,G,B)三通道的的方差.
4. 两个翻转一个旋转
4.1 随机水平翻转
transforms.RandomHorizontalFlip(p)
- 函数介绍:随机地对图片进行水平翻转,每张图片被翻转的概率为p.
4.2 随机竖直翻转
transforms.RandomVerticalFlip(p)
- 函数介绍:随机地对图片进行竖直翻转,每张图片被翻转的概率为p.
4.3 随机旋转
transforms.RandomRotation(degree,resample,expand,center)
- 函数介绍:对图片进行旋转一定的角度.
- 参数:
degree - 旋转的角度;
resample - 是否重新采样,若为False则不重新采样;
expand - 是否不要旋转后超出边界部分的图像区域,若为False则丢弃;
center - 围绕中心点或左上角旋转;
5. 五个裁剪
5.1 固定裁剪
transforms.CenterCrop(size)
- 函数介绍:对图片从中心点开始按给定的size进行裁剪.
- 参数:
size - sequence类型或int类型,前者输入(H,W),后者输入(size,size);
5.2 随机裁剪
transforms.RandomCrop(size, padding, pad_if_needed, fill, padding_mode)
- 函数介绍:对图片随机地按给定的size进行裁剪.
- 参数:
size - sequence类型或int类型,前者输入size=(H,W)
,后者输入size=(size,size)
;
padding - int类型padding=m
时,图像的四周均填充m个pixel;sequence类型padding=(a,b)
时,于图像左右填充a个pixel,于图像上下填充b个pixel;
fill - 当padding_mode=constant
时,int类型fill=n
时,三通道均根据padding类型填充n;tuple类型fill=(p,q,r)
时,分别在三通道按类型填充p、q、r
padding_mode - 填充模式,padding_mode=constant
常数;padding_mode=reflect
、padding_mode=symmetric
;padding_modeedge
按边缘的pixel进行填充.
5.3 十倍裁剪
transforms.TenCrop(size, vertical_flip)
- 函数介绍:上下左右中心五个位置裁剪后进行水平、竖直翻转,从而一张原图得到十张处理后的图片,返回值为4维的Tensor.
- 参数:
size - sequence类型或int类型,前者输入size=(H,W)
,后者输入size=(size,size)
;
vertical_flip - 是否竖直翻转/水平翻转,若vertical_flip=False
则水平翻转;
5.4 五倍裁剪
transforms.FiveCrop(size)
- 函数介绍:上下左右中心五个位置裁剪后得到五张处理后的图片(不翻转),返回值为4维的Tensor.
- 参数:
size - sequence类型或int类型,前者输入size=(H,W)
,后者输入size=(size,size)
;
5.5 随机裁剪
transforms.RandomResizedCrop(size, scale, ratio, interpolation)
- 函数介绍:将图片随机地进行裁剪,然后将图片的大小调整至设定好的size.
- 参数:
size - 返回图片的大小(分辨率);
scale - 随机裁剪后的图片与原图片的面积比范围,若scale=(a,b)
则裁剪后结果与原图的比例为a到b之间;
ratio - 随机裁剪的长宽比;
interpolation - 在将裁剪后的图片调整至size后,进行插值的值,若interpolation=c
则插入c,插值方式默认为双线性插值.
6. 七个变换
6.1 填充
transforms.Pad(padding, fill, padding_mode)
- 函数介绍:对图片进行填充.
- 参数:
padding - int类型padding=m
时,图像的四周均填充m个pixel;sequence类型padding=(a,b)
时,于图像左右填充a个pixel,于图像上下填充b个pixel;
fill - 当padding_mode=constant
时,int类型fill=n
时,三通道均根据padding类型填充n;tuple类型fill=(p,q,r)
时,分别在三通道按类型填充p、q、r
padding_mode - 填充模式,padding_mode=constant
常数;padding_mode=reflect
、padding_mode=symmetric
;padding_modeedge
按边缘的pixel进行填充.
6.2 调整大小
transforms.Resize(size, interpolation)
- 函数介绍:将图片的大小调整至设定好的size.
- 参数:
size - 返回图片的大小(分辨率);
interpolation - 在将裁剪后的图片调整至size后,进行插值的值,若interpolation=a
则插入a,插值方式默认为双线性插值.
6.3 灰度变换
transforms.Grayscale(num_output_channels)
- 函数介绍:将图片转换为灰度图.
- 参数:
num_output_channels - 若num_output_channels=1则转换为单通道灰度图,若num_output_channels=3则返回三通道图像,且三通道数值相等;
6.4 概率灰度变换
transforms.RandomGrayscale(p)
- 函数介绍:按概率将图片转换为灰度图.
- 参数:
p - 转换的概率;
6.5 亮度、对比度、饱和度、色调变换
transforms.ColorJitter(brightness, contrast, saturation, hue)
- 函数介绍:修改输入图像的亮度、对比度、饱和度、色调.
- 参数:
brightness - float类型,给定一个brightness=float
,生成亮度改变范围[max(0,1-brightness),1+brightness]
,下同;
contrast - float类型,对比度改变范围;
saturation - float类型,饱和度改变范围;
hue - [0,0.5]范围内的float类型,色调改变范围[-hue,hue]
;
6.6 线性变换
transforms.LinearTransformation(transformation_matrix)
- 函数介绍:首先将原图像Flatten为向量,后逐元素与计算出来的向量元素平均值相减,并与transformation_matrix计算点积,最后将大小调整至与输入相等.
- 参数:
transformation_matrix - Tensor类型,维度为[C*H*W,C*H*W]
;
6.7 仿射变换
transforms.RandomAffine(degrees, translate, scale, shear, resample, fillcolor)
- 函数介绍:对图像进行仿射变换处理.
- 参数:
degrees - 旋转的度数范围,sequence、int、float类型皆可,若为sequence类型degrees=(a,b)
则度数范围为(a,b);若为int或float类型degrees=c
则度数范围为(-c,c);
translate - 随机采样平移的范围,元组类型translate=(a,b)
则首先在[-Wa,Wa]的范围内随机采样水平平移,然后在[-Wb,Wb]的范围内随机采样竖直平移;
scale - 元组类型scale=(a,b)
随机从该范围抽取一个数(比例)进行缩放,然后采样;
shear -sequence、int、float类型皆可,若为sequence类型degrees=(a,b)
则范围为(a,b);若为int或float类型degrees=c
则范围为(-c,c);
resample - 重采样滤波器,resample=PIL.Image.NEAREST/PIL.Image.BILINEAR/PIL.Image.BICUBIC
;
fillcolor - 变换后图像边缘区域所填充的颜色,int类型