我是靠谱客的博主 繁荣眼神,最近开发中收集的这篇文章主要介绍ResNet/ResNet-I3D/ResNet-I3D-SlowFast 源码阅读,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

    • 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_freqinflate_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

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 源码阅读所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部