文章目录
0. 前言1. ResNet50-2D2. ResNet-I3D3. ResNet-I3D-SlowFast
0. 前言
目标:
更好的理解2D/I3D/SlowFast模型。为了实现MobileNet/ShuffleNet等2D轻量化网络的3D版本,要仔细研究、借鉴ResNet版的代码。 源码来源 mmaction。没什么营养的流水账
1. ResNet50-2D
后面几个结构也都是基于最原始的ResNet结构。总体结构分为五个部分,STEM+4个stage。STEM结构:没啥好说的
就是普通的conv-bn-relu+maxpooling结构。卷基层:kernel size为7,stride为2,output channels为64,padding为3。max pooling层:kernel size为3,stride为2,padding为1。 Stage结构
每个stage是若干个block的叠加,block在后面介绍。每个stage都有对应的stride、inplanes(输入channels数量)、planes(expansion前的channels数量)。 Block细节
block有两种:BasicBlock和Bottleneck。BasicBlock:
分支是 conv3*3+bn+relu+conv3*3+bn,channels变化是 inplanes -> planes -> planes。如果stride为2,或in/out channels数量不一样时,skip需要通过卷积等downsample操作。分支结果与skip累加,以及relu后,得到block结果。 Bottleneck
分支是 conv1*1+bn+relu+conv3*3+bn+relu+conv1*1+bn,channels变化是 inplanes -> planes -> planes -> 4*planes。如果stride为2,或in/out channels数量不一样时,skip需要通过卷积等downsample操作。分支结果与skip累加,以及relu后,得到block结果。 由于stride以及stage间channels数量的变化,每个stage的第一个block都需要改变feature map的特征图(通过downsample完成,一般由卷积操作实现)。每个stage除第一个block外的其他block一般都没有downsample操作。
2. ResNet-I3D
在ResNet-2D版代码的基础上进行一些改变总体arch的结构相同与ResNet50-2D相同
总而言之:channels变化完全相同,卷积/BN/Relu的数量相同,排列方式相同。分为stem+4stages每个stage也是由多个block组成,且block的类型、数量都相同block类型也是BasicBlock和Bottleneck每类block的基本形式也相同 不同之处
所有2D卷积全部改为3D卷积,多了一维时间维度。所有2D BN改为3D BN。 3D卷积的kernel size与stride
STEM中的变化
卷积从原先的3x3/stride(2,2)改为5x3x3/stride(2,2,2)max pooling从原先的3x3/stride(2,2)改为1x3x3/stride(2,2,2) stage总体变化:
原本四个stage的stride(都是空间)是(1,2,2,2),现在分为时间、空间两个维度,时间上stride为(1,1,1,1),空间上维度与之前相同,为(1,2,2,2)。inflate相关
本质就是 temporal 维度上kernel size的变化,stride都是1。所谓的 inflate 翻译应该就是膨胀的意思,好像是通过2D卷积实现类似3D卷积的功能(但看源码好像不是这个意思,具体看下面的实现)。换句话说,在inflate模式下,一次3x3x3的卷积需要转换为3x1x1+1x3x3两个卷积实现。参数包括inflate_freq与inflate_stype,前者是每个block都有对应的参数(判断当前block是否需要进行inflate操作),后者表示inflate类型。 inflate的具体实现:
对于BasicBlock有两种模式:inflate模式与非inflate模式
inflate模式下第两个卷积都使用3x3x3的卷积核。非inflate模式下,两个卷积都使用1x3x3的卷积核。 对于Bottleneck有三种模式:非inflate模式,inflate 3x1x1模式,inflate 3x3x3 模式
非inflate模式:1x1x1+1x3x3+1x1x1inflate 3x1x1模式(最常用):3x1x1+1x3x3+1x1x1inflate 3x3x3模式:1x1x1+3x3x3+1x1x1
3. ResNet-I3D-SlowFast
在ResNet-I3D的基础上进行一些改变,可以看成是两个I3D模型的叠加(分别称为Slow分支与Fast分支)。
相同之处:对于某一个分支,其本质就是一个I3D模型。
不同之处:
有两个分支在分支的某些地方会对特征进行融合。
Slow分支
输入帧率通过 tau 参数控制,帧率间隔为 tau 。包含了 lateral 相关信息,输入参数alpha/beta_inv都是 lateral 相关信息,后面单独介绍。STEM的时间维度相关的kernel size与stride都是1。4 stages中spatial stride都分别是(1,2,2,2),每个stage中不同block对应的inflate参数都相同,四个stage的 inflate freq为(0,0,1,1),都是3x1x1形式的。总体channels数量也与普通I3D相同。
Fast分支
输入帧率通过 tau 和 alpha 控制,帧率间隔为 tau/alpha不用处理 lateral 相关信息。STEM的时间维度相关的conv kernel size为5,pool size以及stride都是1。4 stages中spatial stride都分别是(1,2,2,2),每个stage中不同block对应的inflate参数都相同,四个stage的 inflate freq为(1,1,1,1),都是3x1x1形式的。channels数量是Slow分支的
1
8
\frac{1}{8}
81(通过 beta inv 参数控制)
Lateral 分支
作用:融合slow与fast分支。前提:slow与fast除了channel数量外,其他结构基本都是相同的基本做法就是将fast分支中某个位置的特征经过3D卷积转换,然后与同一层的slow分支进行concat操作,concat后结果作为slow分支的输出。3D卷积的实现细节:kernel size为 (5,1,1), stride为 (alpha,1,1),padding为(2,0,0),channel数量x2。