概述
文章目录
- 0. 前言
- 1. ResNet50-2D
- 2. ResNet-I3D
- 3. 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+1x1x1
- inflate 3x1x1模式(最常用):3x1x1+1x3x3+1x1x1
- inflate 3x3x3模式:1x1x1+3x3x3+1x1x1
- 对于BasicBlock有两种模式:inflate模式与非inflate模式
- STEM中的变化
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。
最后
以上就是繁荣眼神为你收集整理的ResNet/ResNet-I3D/ResNet-I3D-SlowFast 源码阅读的全部内容,希望文章能够帮你解决ResNet/ResNet-I3D/ResNet-I3D-SlowFast 源码阅读所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复