PyTorch概述(一)---图像变换和增强

TorchVision

  • torchvision 包由流行的数据集、模型架构以及用于计算机视觉的通用图片转换工具组成

TorchVision 包构成

  • 图像变换和增强
  • TVTensors
  • 模型和预训练的权重
  • 数据集
  • 工具
  • 操作
  • 图像和视频的编/解码
  • 用于模型检测的特征提取

图像变换和增强

  • torchvision支持通用的计算机视觉变换;
  • 变换可用于数据增强、训练和推理;
  • 用于图片分类,探测,分割,视频分类等;
  • 大部分变换接收PIL图像和张量格式的输入;
  • 基于性能的考虑推荐以张量的型式输入;
  • 张量图像的期望形状为:(C,H,W);
  • 大部分变换支持批量的张量输入;
  • 批量张量图像的形状为(N,C,H,W),N为批量数目;
  • V2变换接收任意数值作为前导维度(...,C,H,W),可以批量处理图像或视频;
  • CPU和CUDA张量都给与支持;

数据类型和期望的范围

  • 张量图像的值范围被张量dtype隐式的定义;
  • 具有float类型的张量图像的值范围期望为【0,1】;
  • 具有integer类型的张量图像的值范围期望为【0,max_dtype】;
  • 典型的torch.uint8类型的图像期望的值范围为【0,255】;

V1 or V2?

  • 推荐使用V2;
  • V2更快,功能更为丰富;
  • V2的特点:
  • 可以变换图像、边界框、掩膜或者视频;
  • 对图像分类之外的任务提供支持:检测、分割、视频分类;
  • 支持更多的变换,比如:CutMix和MixUp;
  • 更快;
  • 支持任意的输入结构(字典、列表,元组等);
  • 后续只对V2的进行功能更新;
  • 完全向后兼容V1;

考虑性能

  • 推荐使用V2:torchvision.transforms.v2
  • 使用张量输入而不是PIL图像;
  • 使用torch.uint8数据类型,尤其是对于resizing操作;
  • resize操作推荐使用bilinear或者bicubic;

典型的变换流水线

from torchvision.transforms import v2
transforms=v2.Compose([v2.ToImage(),#Convert to tensor,only needed if you had a PIL image
                        v2.ToDtype(torch.uint8,scale=True),#optional,most input are already uint8 at this point
                        v2.RandomResizeCrop(size=(224,224),antialias=True),#Or Resize(antialias=True)
                        v2.ToDtype(torch.float32,scale=True),#Normalize expects float input
                        v2.Normalize(mean=[0.485,0.456,0.406],std=[0.229,0.224,0.225])])
  • 在num_workers>0的torch.utils.data.DataLoader的模块作用下,上述代码将给出典型训练环境中的最好性能;
  • 变换对输入步长、内存格式敏感;
  • 一些变换对于通道在前的图像具有更快的性能;
  • 另一些对通道在后的图像具有更快的性能;
  • 变换对于tensor的操作,将保持输入的格式,但根据具体情况,这也不总是期望的;
  • 如果追求更快的性能,可能需要自己去尝试;
  • 单个变换使用torch.compile()可帮助分解内存格式变量;
  • 类似于Resize和RandomResizedCrop的变换,倾向于通道最后的输入,且torch.compile()没有任何优势;

变换类、函数和内核

  • 像Resize这样的变化可以作为类来使用;
  • 同时对于torchvision.transforms.v2.functional中的resize()函数也可作为类来使用;
  • 以上两种情况类似于torch.nn包,同时定义了类和功能等效的函数在torch.nn.functional中;
  • 函数的功能支持PIL图像,纯张量格式的输入或者TVTensors;
  • resize(imgae_tensor)和resize(boxes)都是有效的;
  • 像RandomCrop这样的随机变换当每次被调用时会随机采样参数;
  • 但是他们的函数等效(crop())不做任何随机采样,因此具有稍有不同参数;
  • 当使用函数API时,get_params()变换类方法被用于执行参数采样;
  • torchvision.transforms.v2.functional命名空间也包含称为kernel的对象;
  • 这些是低级别的函数实现核心的功能用于特定的类型,比如:resize_bounding_boxes和resized_crop_mask;
  • 虽然没有记录,但他们是公开的;
  • 如果你要想获得torchscipt support用于bounding box 或mask类型的话,kernel是十分有用的;

Torchscript 支持

  • 很多变换类和函数支持torchscript;
  • 对于组合变换,使用torch.nn.Sequential而不是Compose:
transforms=torch.nn.Sequential(CenterCrop(10),Normalize((0.485,0.456,0.406),(0.229,0.224,0.225)))
scripted_trtansforms=torch.jit.script(transforms)

  • 23
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
PyTorch是一个开源的机器学习框架,它提供了一个灵活且高效的工具集,可用于构建各种类型的深度学习模型。PyTorch 使用动态计算图的方式来定义和计算网络模型,这使得模型的构建更加灵活,并提供了更好的调试和可视化功能。PyTorch具有丰富的库和接口,可以方便地进行数据加载、模型定义、训练和推断。 PyTorch-Memlab是一个用于分析PyTorch模型内存占用的工具。深度学习模型通常需要大量的内存来存储网络结构、参数和计算中间结果。PyTorch-Memlab通过记录和分析模型的内存使用情况,帮助用户优化模型的内存消耗,提高模型的运行效率。它可以用于查看各个模块和操作的内存使用情况,帮助用户识别内存泄露和优化模型的内存占用。 使用PyTorch,我们可以使用简单而直观的方式来构建深度学习模型,它提供了丰富的API和函数,用于定义和训练模型、优化模型参数、评估模型性能等。PyTorch还支持自动求导,使得梯度计算更加简单和高效。它还提供了用于并行化和分布式训练的工具,使得处理大规模数据和模型变得更加方便和高效。 PyTorch-Memlab可以帮助我们深入了解模型的内存占用情况,它可以告诉我们哪些模块或操作占用了大量的内存,帮助我们找到内存消耗较大的瓶颈和优化空间。通过使用PyTorch-Memlab,我们可以减少模型的内存占用,并提高模型的性能和可扩展性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值