0
点赞
收藏
分享

微信扫一扫

【代码解析】mmaction2: SlowFast

kmoon_b426 2022-04-07 阅读 59

网络分成slow pathway和fast pathway分别对spatial和temporal维度特征进行提取

Backbone

  • fast_pathway:
    • x_fast
      • nn.functional.interpolate(): Fast pathway在时间维度进行密集采样,空间维度不变。
      • self.slow_path.conv1: kernel=(5,7,7) 输出尺度 e.g. (N_fast,64,5,H,W)
    • x_fast_lateral: ConvModule(kernel_size=(5, 1, 1), stride=(8, 1, 1)) 从fast pathway特征加入一层空间卷积。 输出尺度 e.g. (N_slow,64,1,H,W)
  • slow_pathway:
    • x_slow:
      • nn.functional.interpolate(): Slow pathway在时间维度进行降采样(即稀疏采样),空间维度不变。
      • self.slow_path.conv1: conv1 kernel=(1,7,7) 输出尺度 e.g. (N_slow,64,1,H,W)
    • torch.cat((x_slow, x_fast_lateral) slow分支和fast分支特征融合。输出尺度 e.g. (N_slow,128,1,H,W)
    • self.slow_path.res_layers

slow和fast后续融合部分待续

Slow/Fast pathway网络结构模板

  • resnet3d:多个Bottleneck3d串行组合,每个Bottleneck3d看做一个stage
    • Bottleneck3d: conv_module不同stage的数量列表 = (3,4,6,3),conv_tride列表 = (1,2,2,2)
      • self.conv1: conv_module(3, 64, kernel=(3,7,7)): 对时间+空间维度进行降尺度卷积,第一层3d卷积的感受野设置较大。Q:是否丢失细节过多,考虑3d focus -conv
      • self.maxpool: nn.MaxPool3d(kernel_size=(1, 3, 3), stride=(1,2,2), padding=(0, 1, 1))空间维度进行pooling。pooling是否可以改成strided-conv
      • self.pool2: nn.MaxPool3d(kernel_size=(2, 1, 1), stride=(2, 1, 1))时间维度进行pooling。
      • self.res_layers : 特征提取基础block通过多个conv_module串行组合得到
        • conv_module: x + 3*(conv + norm + act)(x) 最小组合
          • conv: nn.Conv3d(in_channels, out_channels, kernel_size = (kt, kh, kw), stride, padding)
            特征图从二维变成三维,卷积参数增加了时间维度
          • norm: nn.BatchNorm3d()
            Q: BatchNorm2d/BatchNorm3d参数量是多少?
            A: 每个channel需要存储4个参数,mean for moving-average(不用学习),variance for moving-average(不用学习),gamma(需学习),beta(需学习),因此参数量为num_channel*4
          • act: nn.ReLU()

待续

Head

Loss

举报

相关推荐

0 条评论