“ 数据增强可能因为是数据量不够,也可能是因为为了增加样本多样性,保持模型的鲁棒性,anyway,show you code。”
网上有很多写数据增强的,大同小异,本文主要为了实践数据增强,分为几大部分:裁剪、翻转与旋转以及图像变换。
首先进行导包以及原始图像加载:
import numpy as npimport torchimport torchvisionfrom PIL import Image# 图片存放路径image_path = r'F:/deepLearning/data/superResolution/tree_SuperSolution_chipsize512/images/000000031.png'# 图像大小 512 x 512image = Image.open(image_paht)image
01
—
裁剪
1.随机裁剪:transforms.RandomCrop
# 给定一个size大小,size可以是序列也可以是inttorchvision.transforms.RandomCrop(size=256)(image)
2.中心裁剪:transforms.CenterCrop
# 中心裁剪,显而易见torchvision.transforms.CenterCrop(size=256)(image)

3.随机长宽比裁剪:transforms.RandomResizedCrop
torchvision.transforms.RandomResizedCrop(size=256)(image)
size:输出结果的分辨率
scale:随机裁剪的大小区间,默认是0.08-1.0
ratio:随机长宽比设置
interpolation:插值方法,默认是双线性插值
4.上下左右中心裁剪:transforms.FiveCrop
images = torchvision.transforms.FiveCrop(size=256)(image)images
5.上下左右中心裁剪后翻转:transforms.TenCrop
# 跟上面的一样,第二个参数设置成false为水平翻转torchvision.transforms.TenCrop(256)(image)
02
—
翻转与旋转
6.依概率p水平翻转:transforms.RandomHorizontalFlip
# 就是根据参数中的那个概率值决定要不要水平翻转torchvision.transforms.RandomHorizontalFlip(p=0.9)(image)
7.依概率垂直翻转:transforms.RandomVerticalFlip
# 没啥说的torchvision.transforms.RandomVerticalFlip(p=0.9)(image)
8.随机旋转:transforms.RandomRotation
torchvision.transforms.RandomRotation((45,90))(image)
degress:旋转角度,可以是整数或者是区间,整数会在正负间随机。区间则为区间内随机
resample:重采样,可选PIL.Image.NEAREST, PIL.Image.BILINEAR, PIL.Image.BICUBIC,默认为最近邻
center:可选为中心旋转还是左上角旋转
03
—
图像变换
9.resize:transforms.Resize
# 插值方法默认是双线性插值torchvision.transforms.Resize(256)(image)
10.转为tensor:transforms.ToTensor
tensor_image = torchvision.transforms.ToTensor()(image)tensor_image
11.标准化:transforms.Normalize
# mean与std是有固定值的,需要看论文torchvision.transforms.Normalize(mean=[0.5,0.5,0.5],std=[0.5,0.5,0.5])(tensor_image)
12.填充:transforms.Pad
torchvision.transforms.Pad(20)(image)
padding:填充多少个参数,可以是单个,2个值的序列以及四个值的序列,2个值时第一个值为左右,第二个值为上下。4个值的时候对应着左上右下。
fill:int时,各通道均填充该值,当长度为3的tuple时,表示RGB通道需要填充的值。
padding_mode:填充模式,这里提供了4种填充模式,1.constant,常量。2.edge 按照图片边缘的像素值来填充。3.reflect 4. symmetric
13.修改亮度、对比度和饱和度:transforms.ColorJitter
torchvision.transforms.ColorJitter(brightness=2,contrast=0,saturation=1)(image)
14.转灰度图:transforms.Grayscale
torchvision.transforms.Grayscale()(image)
15.线性变换:transforms.LinearTransformation
使用方形变换矩阵和离线计算的mean_vector变换张量图像。给定transformation_matrix和mean_vector,将使矩阵变平。从中拉伸并减去mean_vector,然后用变换矩阵计算点积,然后将张量重新整形为其原始形状。白化转换:假设X是列向量零中心数据。然后torch.mm计算数据协方差矩阵[D x D],对该矩阵执行SVD并将其作为transformation_matrix传递。(有理论依据,查论文时用)
# 两个参数未填torchvision.transforms.LinearTransformation()(tensor_image)
transformation_matrix(Tensor) - 张量[D x D],D = C x H x W.
mean_vector(Tensor) - 张量[D],D = C x H x W.
16.仿射变换:transforms.RandomAffine
torchvision.transforms.RandomAffine(30)(image)
degrees(sequence 或float或int) -要选择的度数范围。如果degrees是一个数字而不是像(min,max)这样的序列,则度数范围将是(-degrees,+degrees)。设置为0可停用旋转。
translate(元组,可选) - 水平和垂直平移的最大绝对分数元组。例如translate =(a,b),然后在范围-img_width * a
scale(元组,可选) - 缩放因子间隔,例如(a,b),然后从范围a <= scale <= b中随机采样缩放。默认情况下会保持原始比例。
shear(sequence 或float或int,optional) - 要选择的度数范围。如果degrees是一个数字而不是像(min,max)这样的序列,则度数范围将是(-degrees,+ degrees)。默认情况下不会应用剪切
resample({PIL.Image.NEAREST ,PIL.Image.BILINEAR ,PIL.Image.BICUBIC} ,可选) - 可选的重采样过滤器。请参阅过滤器以获取更多信 如果省略,或者图像具有模式“1”或“P”,则将其设置为PIL.Image.NEAREST。
fillcolor(int) - 输出图像中变换外部区域的可选填充颜色。(Pillow> = 5.0.0)
17.依概率p转换成灰度图:transforms.RandomGrayscale
# 没啥好说的torchvision.transforms.RandomGrayscale(0.8)(image)
18.将数据转换成PILImage:transforms.ToPILImage
# tensor_image是tensor类型数据torchvision.transforms.ToPILImage()(tensor_image)
19.transforms.Lambda
# 自定义一个左上角裁剪方法class MyCrop: def __init__(self,size=224): self.size = size def __call__(self,img): ow,oh = img.size x1,y1 = (0,0) tw = th = self.size # 有足够的大小截取 # img.crop坐标表示 (left, upper, right, lower) if (ow > tw or oh > th): return img.crop((x1, y1, x1+tw, y1+th)) return img def __repr__(self): return self.__class__.__name__ + '(size={0})'.format(self.size)img = torchvision.transforms.Lambda(MyCrop(256))(image)img
04
—
对transforms组合进行操作
20.组合中随机选一个进行操作:transforms.RandomChoice
transforms = [ torchvision.transforms.Grayscale(), # 转换成灰度图 torchvision.transforms.CenterCrop(256) # 中心裁剪]
torchvision.transforms.RandomChoice(transforms)(image)
21.给一组变换加上概率:transforms.RandomApply
# 数组中所有变换都会应用上去torchvision.transforms.RandomApply(transforms[:],0.8)(image)
22.打乱transforms中的顺序:transforms.RandomOrder
# 在本例子中,虽然打乱顺序,但是都会执行,所以显示上无差别torchvision.transforms.RandomOrder(transforms)(image)
网上的讲torchvision的变换有很多,但是大多都没有带效果,不方便理解。本文参考网上博客加上自己实践附上效果图,当做是字典来查,建议大家收藏。
参考:
https://blog.youkuaiyun.com/qq_38410428/article/details/94719553?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param