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:
- 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
|