网络分成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
看做一个stageBottleneck3d
: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 -convself.maxpool
:nn.MaxPool3d(kernel_size=(1, 3, 3), stride=(1,2,2), padding=(0, 1, 1))
对空间维度进行pooling。pooling是否可以改成strided-convself.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()
- conv: