PytorchVideo Transforms 详解

文章目录

    • 0. 前言
    • 1. Mix 操作
    • 2. 普通操作
      • 2.1 Norm 与其他
      • 2.2 Sample Strategy
      • 2.3 Resize & Crop
    • 3. “高端”数据增强
    • 4. create_video_transform

0. 前言

  • 看到 PytorchVideo 中有 RandAugment 以及 AugMix,我有心把这些引入 MMAction2。
  • 在写代码之前,先详细了解下 PyTorchVideo Transforms 的细节。
  • PytorchVideo Transforms 主要可分为
    • Mix操作,即多个 clips 之间的操作,如 Cumix、Mixup
    • 普通操作,如切片、resize 等
    • RandAument、AugMix 等
    • create_video_transform,也就是整合整体数据预处理pipeline

1. Mix 操作

  • 源码:mix.py
  • 目前实现有 Cutmix 和 Mixup,主要功能是:对同一个batch中的不同sample进行融合
  • Mixup 和 Cutmix 的原理不介绍了,以前写过笔记,主要关注接口形式
  • 两个对象的构造都是集成了 torch.nn.Module
    • 初始化方法参数一致,都是 alpha/label_smoothing/num_classes,第一个参数是 beta 分布的参数,后面是是否进行 label_smoothing。
    • 除了构造函数,都覆盖了 forward 方法,形参是两个 torch.Tensor,分别表示输入数据以及GT标签。
      • 输入数据的形式是 (B, C, T, H, W),对应的GT形如 (B,)(换句话说,是label id而不是 one-hot label)
  • 请注意,要使用 Mix 必须是数据已经 batch 了

2. 普通操作

  • 源码:transforms
  • 注意,普通是因为我想不出别的词来描述这一系列的操作。
  • 这里的视频数据预处理方法,按类别分可分为:
    • resize & crop:
      • ShortSideScale
      • RandomShortSideScale.
      • UniformCropVideo
      • RandomResizedCrop
    • norm:
      • Normalize
    • Sample Strategy:
      • UniformTemporalSubsample
      • UniformTemporalSubsampleRepeated
    • 其他:不是直接的数据预处理,而是工程相关操作
      • ApplyTransformToKey
      • RemoveKey
      • ConvertUint8ToFloat
      • Permute
      • OpSampler

2.1 Norm 与其他

  • 在数据预处理的过程中,传输数据是通过字典进行的。所以,有几个字典相关的操作
    • ApplyTransformToKey:只对指定的 key 进行 transform 操作
    • RemoveKey:在字典中删除指定的 key
  • 普通数据预处理
    • ConvertUint8ToFloat:只能操作 torch.tensor 对象,将 [0, 255] 转换到 [0, 1] 之间。
    • Permute:改变一个tensor的shape,就是 transpose 操作
    • OpSampler:从一组 transforms 中选择若干个,指定每个 transform 的选择概率
  • Normalize:指定 mean std 实现 norm 操作,输入数据shape是 C, T, H, W

2.2 Sample Strategy

  • UniformTemporalSubsample
    • 输入数据 shape 为 C, T, H, W
    • 固定参数是 num_samples,表示采样的图片数量
    • 换句话说,就是从 T 帧中提取 num_samples 个样本,按均匀分布来获取
    • 如果T < num_samples,index就通过插值法来获取
  • UniformTemporalSubsampleRepeated
    • 输入数据 shape 为 C, T, H, W
    • 固定参数是 frame_ratios,表示每次采样的 down_sample_rate,换句话说,每次采样帧数量为 temporal_length / ratio
    • 这个操作是进行多次采样,采样次数就是 len(frame_ratios)
    • 结果是一个list,每个元素表示依次采样的结果
    • 能想到的一个应用场景就是 SlowFast,分别对 Slow 和 Fast 分支进行采样

2.3 Resize & Crop

  • ShortSideScale
    • 顾名思义,就是固定短边长度,按比例缩放
    • 输入数据shape为 C, T, H, W
  • RandomShortSideScale
    • 在指定的 [min_size, max_size] 范围内随机取值,作为短边的长度,然后按比例缩放
    • 输入数据shape为 C, T, H, W
  • UniformCropVideo
    • 就是从图像中获取固定尺寸的,上/中/下 或者 左/中/右
    • 输入参数主要有:
      • 获取的区域必定是正方形区域,所以只需要指定一个 int 就可以
      • 要获取 上/中/下 (或者 左/中/右)中的哪个
  • RandomResizedCrop
    • 先根据条件crop一块区域(也就是获取一个bbox然后crop),然后reisze到目标尺寸
    • crop的条件是指定ratio范围和scale范围
    • resize的参数就是直接指定的 target height/width
    • 实现了 shift 模式,即获取两个 bbox,通过插值法,获取从 bbox1 到 bbox2 的变化得到一组 box list,然后在T纬度上对每一帧分别根据 box list 分别获取数据。

3. “高端”数据增强

  • RandAugment
    • 源码:rand_augment.py
    • 实现了 RandAugment,简单说,就是定义了一组 transforms,每次都从其中随机选择两个,对输入图像进行操作。
    • 原始论文有 16 个 transforms,我在 MMAction2 中用 Imgaug 实现的版本有 15 个 transform,PyTorchVideo 中有14个 transforms
    • 有一点与我实现的不同(不知道是不是我没注意看论文,需要再看下其他源码),这里的 magnitude 不是固定的,而是根据一定的参数进行随机获取,每次变换都需要随机获取。
    • 输入图像的shape为 T, C, H, W
  • AugMix
    • 源码:augmix.py
    • 实现了 AugMix,感觉类似于Mixup,只不过Mixup的两个部分分别是原始图像以及另一个经过类似 RandAugment 操作后的图像。
    • 输入图像的shape为 T, C, H, W

4. create_video_transform

  • 源码:transforms_factory.py
  • 定义了视频数据预处理的完整 pipeline,定义如下

PytorchVideo Transforms 详解_第1张图片

你可能感兴趣的:(CV,PytorchVideo)