网络分成slow pathway和fast pathway分别对spatial和temporal维度特征进行提取
Backbone
fast_pathway:x_fastnn.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:
