• Pytorch学习 day04(Totensor、Normalize、Resize、Compose)


    Totensor

    • 把一个PIL格式的图片,或者ndarray格式的图片转换为tensor格式
    • 使用方法,如下:
    from PIL import Image
    from torchvision import transforms
    from torch.utils.tensorboard import SummaryWriter
    
    img = Image.open("images/0013035.jpg")  #打开一张图片
    print(img)
    
    writer = SummaryWriter("logs")  #创建一个writer对象
    
    trans_tensor = transforms.ToTensor()    #创建一个ToTensor对象
    img_tensor = trans_tensor(img)  #使用__call__方法,将PIL 转换为tensor
    writer.add_image("Totensor", img_tensor)    #将tensor添加到writer对象中,就可以用tensorboard展示图象
    
    writer.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    Normalize

    • 根据它的平均值和标准差来标准化一个tensor格式的图片,由于通常是RGB图片,所以信道数为3,传入三个平均值和标准差即可
    • 传入的平均值和标准差需要是以序列的格式
    • 计算公式如下:
      在这里插入图片描述
    • 代码如下:
    from PIL import Image
    from torchvision import transforms
    from torch.utils.tensorboard import SummaryWriter
    
    img = Image.open("images/0013035.jpg")  #打开一张图片
    print(img)
    
    writer = SummaryWriter("logs")  #创建一个writer对象
    
    # Totensor
    trans_tensor = transforms.ToTensor()    #创建一个ToTensor对象
    img_tensor = trans_tensor(img)  #使用__call__方法,将PIL 转换为tensor
    writer.add_image("Totensor", img_tensor)    #将tensor添加到writer对象中,就可以用tensorboard展示图象
    
    # Normalize
    trans_normal = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])  #创建一个Normalize对象
    img_normal = trans_normal.forward(img_tensor)  #使用forward方法,将tensor进行标准化
    writer.add_image("Normalize", img_normal)  #将标准化的tensor添加到writer
    writer.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 结果如下:
      在这里插入图片描述

    Resize

    • 将PIL或Tensor格式的输入图片,调整为指定的尺寸,并使用forward()函数返回对应格式的图片,如下:
    • 传入的尺寸需要是以序列的格式
    from PIL import Image
    from torchvision import transforms
    from torch.utils.tensorboard import SummaryWriter
    
    img = Image.open("images/0013035.jpg")  #打开一张图片
    print(img)
    
    writer = SummaryWriter("logs")  #创建一个writer对象
    
    # Totensor
    trans_tensor = transforms.ToTensor()    #创建一个ToTensor对象
    img_tensor = trans_tensor(img)  #使用__call__方法,将PIL 转换为tensor
    
    # Resize
    print(img.size)  #打印原图的尺寸
    trans_resize = transforms.Resize((100, 100))
    # img PIL -> Resize -> img_resize PIL
    img_resize = trans_resize.forward(img)  #使用forward方法,将图像进行缩放
    print(img_resize.size)   #打印PIL格式缩放后的尺寸
    # img_resize PIL -> ToTensor -> img_resize tensor
    img_resize = trans_tensor(img_resize)   #将PIL转换为tensor
    print(img_resize.size())   #打印tensor格式缩放后的尺寸
    writer.add_image("Resize", img_resize)   #将缩放后的tensor添加到writer
    writer.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 结果如下:
      在这里插入图片描述

    Compose

    • 将多个transforms工具组合在一起,方便使用,相当于循环调用多个transforms工具,并把上一个输出传给下一个,当作输入
    • 注意传入列表的第一个工具的输出格式要满足第二个的输入格式
    • 代码如下:
    from PIL import Image
    from torchvision import transforms
    from torch.utils.tensorboard import SummaryWriter
    
    img = Image.open("images/0013035.jpg")  #打开一张图片
    print(img)
    
    writer = SummaryWriter("logs")  #创建一个writer对象
    
    # Totensor
    trans_tensor = transforms.ToTensor()    #创建一个ToTensor对象
    img_tensor = trans_tensor(img)  #使用__call__方法,将PIL 转换为tensor
    writer.add_image("Totensor", img_tensor)    #将tensor添加到writer对象中,就可以用tensorboard展示图象
    
    # Compose
    trans_resize_2 = transforms.Resize(800)
    # PIL -> PIL -> Tensor
    trans_compose = transforms.Compose((trans_resize_2, trans_tensor))  
    img_compose = trans_compose(img)    #使用__call__方法,通过compose结合两个转换方法,将PIL转换为tensor
    writer.add_image("Compose", img_compose)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 注意:虽然Resize类中没有定义 _ _ call _ 方法,但是Resize继承自Module类,而Module类定义了 _ call _ 方法,因此当我们将resize对象作为一个函数调用时,python会在本身及其父类中寻找 _ call _ 方法, 因此这里可以正常调用,同时Module类的 _ call _ _方法和Raize类的forward()方法的基本实现如下:
    class Module:
        def __call__(self, *inputs, **kwargs):
            # 在调用模型实例时,会调用forward方法
            return self.forward(*inputs, **kwargs)
    
        def forward(self, *inputs, **kwargs):
            # 在子类中实现具体的前向传播逻辑
            raise NotImplementedError
     
    class Rasize:
        def forward(self, img):
            """
            Args:
                img (PIL Image or Tensor): Image to be scaled.
    
            Returns:
                PIL Image or Tensor: Rescaled image.
            """
            return F.resize(img, self.size, self.interpolation, self.max_size, self.antialias)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 因此当我们将resize对象作为一个函数调用时,实际上调用的是它的forward方法。
    • 结果如下:
      在这里插入图片描述
  • 相关阅读:
    全网最全谷粒商城记录_07、环境-虚拟机网络设置——2、固定IP,Windows和虚拟机ping通方式【简洁】
    Linux进程控制(上)
    Google Earth Engine(GEE)—— 快速进行农田作物土地分类和面积统计
    多线程经典代码案例及手动实现
    java编程基础总结——32.UDP网络编程
    浅谈ES标准的演变
    Node学习笔记之模块化
    【Python零基础入门篇 · 36】:greenlet协程模块的使用、gevent模块的使用、程序打补丁、总结
    onnx-modifier使用
    Tomcat配置敏感信息屏蔽
  • 原文地址:https://blog.csdn.net/u011453680/article/details/136503574