zoukankan      html  css  js  c++  java
  • 【pytorch】常用图像处理与数据增强方法合集(torchvision.transforms)

    文章目录

    张量化

    torchvision.transforms.ToTensor

    描述

    PIL.Imagenumpy.ndarray类型的图片转为torch.Tensor类型,如果图片的灰度级在[0, 255],会除以255.0,归一化到[0.0, 1.0]。这个基本上每个数据集都会用到。

    参数

    不用给参数。

    示例

    >>> from torchvision import transforms
    >>> import numpy as np
    >>> a = np.array([[255, 199, 30]], dtype=np.uint8)
    >>> a
    array([[255, 199,  30]], dtype=uint8)
    >>> t = transforms.ToTensor()
    >>> b = t(a)
    >>> b
    tensor([[[1.0000, 0.7804, 0.1176]]])
    

    灰度化

    torchvision.transforms.Grayscale(num_output_channels=1)

    描述

    将彩色图片转为灰度图片。图片必须是PIL.Imagetorch.Tensor类型。

    参数

    如果num_output_channels=1,返回单通道灰度图片;如果num_output_channels=3,返回三通道的灰度图片,其中r == g == b。一般我们不用设置,默认为1就行了。

    示例

    from PIL import Image
    from torchvision import transforms
    img = Image.open('test.jpg')
    transform = transforms.Grayscale()
    img = transform(img)
    

    绘图

    标准化

    torchvision.transforms.Normalize(mean, std, inplace=False)

    描述

    用均值和标准差标准化数据,将数据映射到区间[-1, 1],能加快模型的收敛速度,一般加到ToTensor后面。仅限torch.Tensor类型。

    参数

    mean (sequence):各通道的均值。
    std (sequence):各通道的标准差。
    inplace:是否直接在原数据上操作。

    组合转换

    torchvision.transforms.Compose(transforms)

    描述

    将若干个转换方法组合起来。

    参数

    transforms:带组合的转换方法

    示例

    # 以mnist数据集为例, 单通道, 其均值和标准差分别为0.1307和0.3081
    train_file = datasets.MNIST(
        root='./dataset/',
        train=True,
        transform=transforms.Compose([
            transforms.ToTensor(),
            transforms.Normalize((0.1307,), (0.3081,))
        ])
    )
    

    中心裁剪

    torchvision.transforms.CenterCrop(size)

    描述

    对图片进行中心裁剪。中心就是图片高和宽二分之一的交点。图片必须是PIL.Imagetorch.Tensor类型。

    参数

    size是输出图片的高、宽。你可以给一个整型的数字,比如3,表示输出3x3的图片;你也可以给一个元组,比如(3, 5),表示输出高为3,宽为5的图片。

    示例

    from PIL import Image
    from torchvision import transforms
    img = Image.open('test.jpg')
    # 300x300
    transform_1 = transforms.CenterCrop(300)
    img_1 = transform_1(img)
    # 500x500
    transform_2 = transforms.CenterCrop(500)
    img_2 = transform_2(img)
    # 500x300
    transform_3 = transforms.CenterCrop((500,300))
    img_3 = transform_3(img)
    

    绘图

    边缘拓展

    torchvision.transforms.Pad(padding, fill=0, padding_mode=‘constant’)

    描述

    对图像边缘进行拓展填充。

    参数

    padding:拓展宽度。如果是整型,则所有边都拓展;如果是二元组,则指定左右和上下的拓展宽度。如果是四元组,则指定左、上、右、下的拓展宽度。
    fill:像素填充的值,默认是0,代表黑色。可以指定整型,也可以用三元组表示分别填充RGB通道。
    padding_mode:拓展模式,默认为constant,表示所有填的所有值都一样。edge表示用边缘值填充;reflecty以边缘为对称轴进行轴对称填充(边缘不重复),如在[1, 2, 3, 4]的两边填充2个元素就是[3, 2, 1, 2, 3, 4, 3, 2]symmetricy以边缘为对称轴进行轴对称填充(边缘重复),如在[1, 2, 3, 4]的两边填充2个元素就是[2, 1, 1, 2, 3, 4, 4, 3]

    示例

    from PIL import Image
    from torchvision import transforms
    img = Image.open('test.jpg')
    transform = transforms.Pad(100, (255, 0, 0))
    img = transform(img)
    

    绘图

    随机裁剪

    torchvision.transforms.RandomCrop(size, padding=None, pad_if_needed=False, fill=0, padding_mode=‘constant’)

    描述

    在随机位置对图像进行裁剪

    参数

    size:输出图片的高、宽。与中心裁剪的参数定义一致。
    padding:拓展宽度。与边缘拓展的参数定义一致。
    pad_if_needed:如果设置为True,当图像小于目标尺寸时会先填充再随机裁剪。
    fill:像素填充值。与边缘拓展的参数定义一致。
    padding_mode:拓展模式。与边缘拓展的参数定义一致。

    示例

    from PIL import Image
    from torchvision import transforms
    img = Image.open('test.jpg')
    transform = transforms.RandomCrop(300)
    img_1 = transform(img)
    img_2 = transform(img)
    img_3 = transform(img)
    

    绘图

    尺寸缩放

    torchvision.transforms.Resize(size, interpolation=2)

    描述

    调整图像的大小到指定尺寸。图像必须是PIL.Imagetorch.Tensor类型。这个也用的比较多,训练是按批的,必须保证每批图像的尺寸是相同,所以一般都会在训练前进行resize操作。

    参数

    size: 可以输入一个元组,表示图像的高、宽。比如(300, 500),返回高为300,宽为500的图片;也可以只输入一个整型的数字,短边就是这个数字,然后长边按照相同的长宽比进行调整。比如一张高、宽分别为400200的图片,指定size = 300,那么返回的图像高、宽分别是600300。计算过程:∵ with < height ∴ width = size = 300, height = size*height/width = 300*400*200 = 600
    interpolation:插值法,默认即可。

    注意

    尺寸缩放size参数如果只给定一个整数值,返回的图像不一定是方形的。要注意和中心裁剪size参数区分开来。

    示例

    from PIL import Image
    from torchvision import transforms
    img = Image.open('test.jpg')
    transform = transforms.Resize((720, 720))
    img = transform(img)
    img.save('img.jpg')
    

    绘图

    随机旋转

    torchvision.transforms.RandomRotation(degrees, resample=False, expand=False, center=None, fill=None)

    描述

    按角度随机旋转图像。图像必须是PIL.Imagetorch.Tensor类型。

    参数

    degrees: 旋转的角度范围。如果只填一个整型或浮点型的数字,比如90,表示在-90°90°之间随机旋转。也可以给一个序列类型的值,比如(45, 90),表示逆时针旋转,旋转角度从45°90°之间随机取一个值。
    resample:重采样方法,默认即可。
    expand:是否扩展。默认为False表示输出图和输入图大小一样,旋转超出区域就丢掉不要了;设置为True表示扩展边界以保证显示整个原图。
    center:旋转中心的坐标,可接受的输入是元组或列表类型。默认是图片的中心,比如1280x720的图片中心就是(640, 360)
    fill:图像外部区域的填充颜色。默认是0也就是黑色,也支持RGB格式的颜色,比如(255, 0, 0)就表示用红色填充。

    拓展

    官方只给了按角度随机旋转的方法,并没有给指定角度旋转的方法,但指定角度旋转也可以通过通过设置随机旋转的参数实现。比如图像顺时针旋转90°,只需要设置degrees=(-90, -90)。官方确实很聪明,只用一个函数就把随机旋转和定向旋转都实现了。

    示例

    from PIL import Image
    from torchvision import transforms
    img = Image.open('test.jpg')
    # 逆时针旋转45°
    transform_1 = transforms.RandomRotation(degrees=(45, 45))
    img_1 = transform_1(img)
    # 逆时针旋转45°,启动拓展
    transform_2 = transforms.RandomRotation(degrees=(45, 45), expand=True)
    img_2 = transform_2(img)
    # 逆时针旋转45°,绿色填充
    transform_3 = transforms.RandomRotation(degrees=(45, 45), fill=(255, 0, 0))
    img_3 = transform_3(img)
    

    绘图

    水平翻转

    torchvision.transforms.RandomHorizontalFlip(p=0.5)

    描述

    字面意思,就是水平翻转图像。不过是否翻转是随机的。

    参数

    p:水平翻转的概率,如果是1就一定翻转,如果给0就一定不翻转,如果其它值则按概率随机选择是否翻转。比如0.5,那么就有一半的可能翻转,一般的可能不翻转。图像必须是PIL.Imagetorch.Tensor类型。

    示例

    from PIL import Image
    from torchvision import transforms
    img = Image.open('test.jpg')
    transform = transforms.RandomHorizontalFlip(p=1)
    img = transform(img)
    img.save('img.jpg')
    

    绘图

    垂直翻转

    torchvision.transforms.RandomVerticalFlip(p=0.5)

    描述

    字面意思,就是垂直翻转图像。不过是否翻转是随机的。

    参数

    p:垂直翻转的概率,如果是1就一定翻转,如果给0就一定不翻转,如果其它值则按概率随机选择是否翻转。比如0.5,那么就有一半的可能翻转,一般的可能不翻转。图像必须是PIL.Imagetorch.Tensor类型。

    示例

    from PIL import Image
    from torchvision import transforms
    img = Image.open('test.jpg')
    transform = transforms.RandomVerticalFlip(p=1)
    img = transform(img)
    img.save('img.jpg')
    

    绘图

    色彩抖动

    torchvision.transforms.ColorJitter(brightness=0, contrast=0, saturation=0, hue=0)

    描述

    随机改变图片的亮度,对比度和饱和度。

    参数

    brightness:亮度;允许输入浮点型或二元组(min, max)。如果是浮点型,那么亮度在[max(0, 1 ## brightness), 1 + brightness]区间随机变换;如果是元组,亮度在给定的元组间随机变换。不允许输入负值。
    contrast:对比度。允许输入规则和亮度一致。
    saturation:饱和度。允许输入规则和亮度一致。
    hue:色调。允许输入浮点型或二元组(min, max)。如果是浮点型,那么亮度在[-hue, hue]区间随机变换;如果是元组,亮度在给定的元组间随机变换。不允许输入负值。必须满足0<= hue <= 0.5 or -0.5 <= min <= max <= 0.5

    示例

    from PIL import Image
    from torchvision import transforms
    img = Image.open('test.jpg')
    # 亮度设置为2
    transform_1 = transforms.ColorJitter(brightness=(2, 2))
    img_1 = transform_1(img)
    # 对比度设置为2
    transform_2 = transforms.ColorJitter(contrast=(2, 2))
    img_2 = transform_2(img)
    # 饱和度设置为2
    transform_3 = transforms.ColorJitter(saturation=(2, 2))
    img_3 = transform_3(img)
    

    绘图

    高斯模糊

    torchvision.transforms.GaussianBlur(kernel_size, sigma=(0.1, 2.0))

    描述

    对图像应用高斯模糊

    参数

    kernel_size:模糊半径。必须是奇数。
    sigma:正态分布的标准差。如果是浮点型,则固定;如果是二元组(min, max)sigma在区间中随机选取一个值。

    示例

    from PIL import Image
    from torchvision import transforms
    img = Image.open('test.jpg')
    # 模糊半径越大, 正态分布标准差越大, 图像就越模糊
    transform_1 = transforms.GaussianBlur(21, 10)
    img_1 = transform_1(img)
    transform_2 = transforms.GaussianBlur(101, 10)
    img_2 = transform_2(img)
    transform_3 = transforms.GaussianBlur(101, 100)
    img_3 = transform_3(img)
    

    绘图

    在这里插入图片描述

    仿射变换

    torchvision.transforms.RandomAffine(degrees, translate=None, scale=None, shear=None, resample=0, fillcolor=0)

    • 描述

    汇总了旋转、平移、缩放、扭曲等图像变换方法,并且支持叠加。比如旋转的同时又进行平移或缩放等。

    • 参数

    degrees (sequence or float or int):随机旋转的角度范围。和随机旋转的参数定义一致。设置为0表示不旋转。
    translate (tuple, optional) :水平和垂直平移的因子。如(a, b),表示在img_width * a < dx < img_width * a范围内随机水平平移,在-img_height * b < dy < img_height * b范围内随机垂直平移。
    scale (tuple, optional):缩放因子。如(a, b),表示在a <= scale <= b随机缩放。
    shear (sequence or float or int, optional):随机扭曲的角度范围。如(45, 90),表示在45~90范围内随机选取一个角度进行与横轴平行的扭曲。
    resample (int, optional) :重采样。
    fillcolor (tuple or int) :填充色。默认为0,也就是黑色。支持三元组的RGB颜色。

    • 示例
    from PIL import Image
    from torchvision import transforms
    img = Image.open('test.jpg')
    # 随机旋转
    transform_1 = transforms.RandomAffine(90)
    img_1 = transform_1(img)
    # 随机平移
    transform_2 = transforms.RandomAffine(0, (0.1, 0))
    img_2 = transform_2(img)
    # 随机缩放
    transform_3 = transforms.RandomAffine(0, None, (0.5, 2))
    img_3 = transform_3(img)
    # 随机扭曲
    transform_4 = transforms.RandomAffine(0, None, None, (45, 90))
    img_4 = transform_4(img)
    
    • 绘图

    在这里插入图片描述

    测试样例

    名称尺寸
    test.jpg1280x720

    注意事项

    数据增强的transform操作会增加样本量吗?需不需要单独的把数据集拿出来增强一下再训练?

    如果tranform里面有随机的方法,那么每个epoch训练的数据集将会不同,就相当于增加了样本数量,所以直接训练即可,不用单独拿出来做增强。

    温馨提示

    如果是对批数据进行变换,那么该批的所有变换都是相同的。为什么要这样说?之前不是提到随机旋转这些随机的操作嘛,pytorch在训练前需要把数据做成批数据,然后用数据加载器喂到模型中训练,也就是说这些随机的方法对于同一批数据的随机是相同,比如要旋转45°的话就都旋转45°,而不同批可能会不同。

    引用参考

    https://pytorch.org/docs/stable/torchvision/transforms.html

  • 相关阅读:
    VS开发工具 因插件问题导致 已停止工作 解决办法
    niceScroll 简单使用 及 插件API
    使用JQGrid 问题汇总 不定时更新
    H5特性 MutationObserver 监听元素 动态改变iframe高度
    UVALIVE 3972 March of the Penguins
    Codeforces #105 DIV2 ABCDE
    UVALIVE 3644 X-Plosives
    UVALIVE 3645 Objective: Berlin
    UVALIVE 3031 Cable TV Network
    UVALIVE 2927 "Shortest" pair of paths
  • 原文地址:https://www.cnblogs.com/ghgxj/p/14219097.html
Copyright © 2011-2022 走看看