• PyTorch【9】-图像增强


    torchvision 是 torch 中计算机视觉库,提供了3种类型的接口,包括 datasets、transforms、model,其中 transforms 封装了各种图像增强的方法

    裁剪

    transforms.CenterCrop(size):从图像中心裁剪图片

    • size:裁剪尺寸

    transforms. RandomCrop:从图像中随机裁剪出指定尺寸的图片

    • size:裁减尺寸
    • padding:设置填充大小,默认为 None;可取整型和tuple,

        // 当为整型 a 时,表示上下左右填充 a 个像素;

        // 当为 (a,b) 时,代表上下填充 b,左右填充 a 个像素;

        // 当为 (a,b,c,d) 时,代表 左上右下 填充 abcd 个像素    【顺时针】

    • pad_if_need:若图像尺寸小于 裁剪 size,则需要填充,默认 False
    • padding_mode:填充模式,共4种模式,默认取 constant

        1. constant:像素值由 fill 参数指定

        2. edge:像素值由图像边缘像素决定

        3. reflect:镜像填充,最后一个像素不镜像,如 图像像素为 [1,2,3,4],则镜像填充为 [3,2,1,2,3,4,3,2], 边缘像素 1 4 不镜像

        4. symmetric:镜像填充,最后一个像素也镜像,上例镜像填充为 [3,2,1,1,2,3,4,4,3,2]

    • fill:填充值,当 padding_mode 为 constant 时有效,默认为 0

    transforms.RandomSizeCrop:随机大小 长宽比 裁剪图片

    • size:最后生成的图像尺寸
    • scale:随机裁剪面积比例,默认 (0.08,1)
    • ratio:随机长宽比,默认 (3/4,4/3)
    • interpolation:插值方法,PIL.Image.NEAREST、PIL.Image.BILINEAR、PIL.Image.BICUBIC

    transforms.FiveCrop:在图像的四角和中心裁剪出指定尺寸的 5 张图片

    • size:裁剪尺寸

    transforms.TenCrop:在 FiveCrop 的基础上,并对这 5 张图片进行水平或者垂直翻转,共10张

    • size:裁剪尺寸
    • vertical_flip:是否进行垂直翻转,若为 False,进行水平翻转

    翻转 Flip 和 旋转 Rotation

    transforms.RandomRotation:随机旋转图片

    • degrees:旋转角度,当为 a 时,在 (-a,a) 之间选择旋转角度,当为 (a,b) 时,在 (a,b) 之间选择旋转角度
    • resample:重采样方法,默认 False
    • expand:是否扩大图片,默认 False;旋转后图片size不变时,部门图片会丢失,此时可选择 扩大图片,以包含丢失图片
    • center:以该点为中心进行旋转
    transforms.RandomRotation(30, center=(0, 0), expand=True)

    图像变换

    transforms.Pad:对图像边缘进行填充

    • padding:设置填充大小

        // 当为整型 a 时,表示上下左右填充 a 个像素;

        // 当为 (a,b) 时,代表上下填充 b,左右填充 a 个像素;

        // 当为 (a,b,c,d) 时,代表 左上右下 填充 abcd 个像素    【顺时针】

    • padding_mode:填充模式,共4种模式,包括 constant、edge、reflect、symmetric,默认取 constant            【具体含义见上文-裁剪部分】
    • fill:当 constant 时,设置填充像素值 (R,G,G) or (Gray)

    transforms.ColorJitter:调整亮度、对比度、饱和度、色相

    • brightness:亮度调整因子;当为 a 时,从 [max(0,1-a),1+a] 中随机选择,当为 (a,b) 时,从 [a,b] 中随机选择
    • contrast:对比度参数,方法同 brightness
    • saturation:饱和度参数,方法同 brightness
    • hue:色相参数,色相取值 在 -0.5 到 0.5

        // 当为 a 时,从 [-a,a] 中选择,注意 -0.5<a<0.5,当为 (a,b) 时,在[a,b] 中选择

    transforms.Grayscale:转成灰度图

    • num_output_channels:输出通道数,只能取 1 或者 3

    transforms.RandomGrayscale:以一定概率转成灰度图

    • num_output_channels:输出通道数,只能取 1 或者 3
    • p:概率值,被灰度的概率,默认 0.1

    transforms.RandomAffine:对图像进行仿射变换,仿射变换是二维的线性变换,由5种基本原子变换构成,包括旋转、平移、缩放、错切、翻转

    • degrees:旋转角度,必选参数
    • translate:平移,默认为 None
    • scale:缩放,默认为 None
    • shear:错切角度设置,有水平错切和垂直错切,默认为 None

        // 若为 a,仅在 x 轴错切,错切角度在 (-a,a) 之间;

        // 若为 (a,b),则 a 代表 x 轴错切角度,b代表 y 轴错切角度;

        // 若为 (a,b,c,d),则 ab 设置 x 轴角度,cd 设置 y 轴角度;

    • resample:重采样,有 nearest、bilinear、bicubic,默认 False
    • fillcolor:填充像素,默认为 0

    transforms.RandomErasing:对图像进行随机遮挡

    • p:概率,执行遮挡操作的概率;
    • scale:遮挡区域的面积;
    • ratio:遮挡区域的长宽比;
    • value:遮挡区域的像素值,(R,G,B) or (Gray)
    • inplace:默认 False
    transforms.RandomErasing(p=0.5, scale=(0.02, 0.33), ratio=(0.3, 3.3))

    当 value 取字符串时,采用随机像素进行遮挡

    匿名函数

    transforms.Lambda:用户自定义图像处理的方法,如 CenterCrop

    组合操作

    transforms.RandomChoice:从多个 transforms 方法中随机选一个

    transforms.RandomChoice([transforms1, transforms2, transform3])

    transforms.RandomApply:依据概率执行一组 transforms 操作

    transforms.RandomApply([transforms1, transforms2, transform3], p=0.5)

    transforms.RandomOrder:对一组 transforms 操作进行乱序,乱序处理图片

    transforms.RandomOrder([transforms1, transforms2, transform3])

    transforms.Compose:顺序执行一系列 transforms 操作

    transforms.Compose([transforms1, transforms2, transforms3])

    自定义 transforms

    transforms.Lambda 是自定义图像处理的方法,如 Resize;

    自定义 transforms 是自定义 transforms 系列操作,如 RandomCompose;当然也可以是一个操作;

    先看下 pytorch 的 Compose 方法的实现

    class Compose(object):
        def __call__(self, img):
            for t in self.transforms:
                img = t(img)
            return img

    类比实现自定义:处理椒盐噪声

    椒盐噪声:又称脉冲噪声,是一种随机出现的白点或者黑点,白点称为盐噪声,黑点称为椒噪声

    信噪比:Signal-Noise Rate,SNR,衡量噪声的比例,图像的信噪比是图像像素的占比

     

    使用注意事项

    1. 上述所有方法是一个类,参数都是初始化参数,然后都以对象的形式存在,使用时调用 __call__ 方法处理图片

    2. 上述所有方法输入都是图像,输出也是图像

    3. 输入网络前要转换成 Tensor

    transforms.ToTensor():将 PIL Image 转换成 Tensor 对象,会自动将 [0, 255] 归一化到 [0, 1]

    transforms.Normalize:标准化,注意 只有 Tensor 才能标准化,img 不可以,故 Normalize 之前一般都有 ToTensor

    方法总览

    图像增强的原则

    使得训练集尽可能接近测试集

    例如,我们要区分第四套人民币的 1 元 和 100 元,很容易得到准确率很高的网络;

    那么该网络是否能识别第五套人民币的 100 元,测试结果是基本上都是别成了 1 元,因为颜色很像;

    假如我们把训练数据进行灰度处理,去掉颜色的影响,重新训练的模型也能准确预测 第五套人民币的  100 元 

  • 相关阅读:
    Storm系列(六)架构分析之Scheduler-调度器[EventScheduler]
    Storm系列(五)架构分析之Nimbus启动过程
    Storm系列(四)Topology提交校验过程
    Storm系列(三)Topology提交过程
    Storm系列(二)系统结构及重要概念
    Esper系列(一)初探
    scala学习笔记(四)样本类与模式匹配
    Storm系列(一)集群的安装配置
    Kafka系列(二)特性和常用命令
    Kafka系列(一)安装和配置说明
  • 原文地址:https://www.cnblogs.com/yanshw/p/12268035.html
Copyright © 2020-2023  润新知