pytorch transforms_Pytorch笔记:02 torchvision.transforms数据增强

 数据增强可能因为是数据量不够,也可能是因为为了增加样本多样性,保持模型的鲁棒性,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

b909276505a962547201c92884314346.png

01

裁剪

1.随机裁剪:transforms.RandomCrop

# 给定一个size大小,size可以是序列也可以是inttorchvision.transforms.RandomCrop(size=256)(image)

a077cf80dc160d1eabb84027099f3d35.png

2.中心裁剪:transforms.CenterCrop

# 中心裁剪,显而易见torchvision.transforms.CenterCrop(size=256)(image)
1eb58dc5e865081c7ca3f8dd32b87b13.png

3.随机长宽比裁剪:transforms.RandomResizedCrop

torchvision.transforms.RandomResizedCrop(size=256)(image)

031e8f90fa49509069df2d155f7a0ea2.png

  • size:输出结果的分辨率

  • scale:随机裁剪的大小区间,默认是0.08-1.0

  • ratio:随机长宽比设置

  • interpolation:插值方法,默认是双线性插值

4.上下左右中心裁剪:transforms.FiveCrop

images = torchvision.transforms.FiveCrop(size=256)(image)images

be1bc00a14dd49c9c12b9af488ded6ea.png

5.上下左右中心裁剪后翻转:transforms.TenCrop

# 跟上面的一样,第二个参数设置成false为水平翻转torchvision.transforms.TenCrop(256)(image)

02

翻转与旋转

6.依概率p水平翻转:transforms.RandomHorizontalFlip

# 就是根据参数中的那个概率值决定要不要水平翻转torchvision.transforms.RandomHorizontalFlip(p=0.9)(image)

640?wx_fmt=png

7.依概率垂直翻转:transforms.RandomVerticalFlip

# 没啥说的torchvision.transforms.RandomVerticalFlip(p=0.9)(image)

640?wx_fmt=png

8.随机旋转:transforms.RandomRotation

torchvision.transforms.RandomRotation((45,90))(image)

640?wx_fmt=png

  • degress:旋转角度,可以是整数或者是区间,整数会在正负间随机。区间则为区间内随机

  • resample:重采样,可选PIL.Image.NEAREST, PIL.Image.BILINEAR, PIL.Image.BICUBIC,默认为最近邻

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

03

图像变换

9.resize:transforms.Resize

# 插值方法默认是双线性插值torchvision.transforms.Resize(256)(image)

3502b7fa629907e46ad479252db2b258.png

10.转为tensor:transforms.ToTensor

tensor_image = torchvision.transforms.ToTensor()(image)tensor_image

53fcb0cb16d034d1bad2a79c324e86c8.png

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)

49e63a831e91bfe2b6380a645f74ceea.png

  • 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)

bea36fec43e1b155b08757e403d3735d.png

14.转灰度图:transforms.Grayscale

torchvision.transforms.Grayscale()(image)

271166a03e211ae9a94de3d0ede35b4b.png

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)

640?wx_fmt=png

  • 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)

271166a03e211ae9a94de3d0ede35b4b.png

18.将数据转换成PILImage:transforms.ToPILImage

# tensor_image是tensor类型数据torchvision.transforms.ToPILImage()(tensor_image)

95f1075ff7b3bab7c756cf45de11d1e2.png

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

7fa0600c47affb8fc3f4557d65a2260c.png

04

对transforms组合进行操作

20.组合中随机选一个进行操作:transforms.RandomChoice

transforms = [    torchvision.transforms.Grayscale(), # 转换成灰度图    torchvision.transforms.CenterCrop(256) # 中心裁剪]
torchvision.transforms.RandomChoice(transforms)(image)

271166a03e211ae9a94de3d0ede35b4b.png

21.给一组变换加上概率:transforms.RandomApply

# 数组中所有变换都会应用上去torchvision.transforms.RandomApply(transforms[:],0.8)(image)

114f8da831a2017dbd1cccbf93672bd4.png

22.打乱transforms中的顺序:transforms.RandomOrder

# 在本例子中,虽然打乱顺序,但是都会执行,所以显示上无差别torchvision.transforms.RandomOrder(transforms)(image)

114f8da831a2017dbd1cccbf93672bd4.png

网上的讲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

c2b055eac81324584a62b1c25a4f93e4.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值