ResNet/ResNet-I3D/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分支的 18\frac{1}{8}(通過 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。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章