3D卷積入門 | 多論文筆記 | R2D C3D P3D MCx R(2+1)D


主題列表:juejin, github, smartblue, cyanosis, channing-cyan, fancy, hydrogen, condensed-night-purple, greenwillow

貢獻主題://github.com/xitu/juejin-markdown-themes

theme: juejin
highlight:


【前前沿】:某一次和粉絲交流的時候,收穫一句話:

人點亮技能書,不是一次性電量的。是反覆折騰,反覆批判,反覆否定與肯定,加深了記憶軸。 —某位粉絲

0 前言

看到這篇論文是因為之前看到一篇Nature上的某一篇醫療影像的論文中用到了這幾個演算法,R3D,MC3和R2+1D的3D卷積的演算法。因為對3D卷積的演算法了解比較局限,所以開始補一補這方面的演算法。

1 R2D

這個就完全是把一個影片當成一個圖片來處理,一個影片假設有10幀,那麼就把這個影片當成一個10通道的圖片進行處理,如果是10幀的彩色圖片,那麼這個就是30通道的圖片。

正常情況下,一個影片是有四個維度的:
channel \times time \times h \times w

假設有一個10幀的1080×960的彩色影片,那麼是個影片轉換成張量應該是:

$3\times 10 \times 960\times 1080$

但是對於R2D演算法來說,這個影片的張量為:

$30 \times 960 \times 1080$

這樣的話,就完全的放棄了時間的資訊。當然,與這個R2D類似的演算法,還有一個叫做f-R2D的演算法,這個f-R2D是對每一幀進行2D的操作,然後在最後全局池化層去融合全部的資訊,某種角度上也是犧牲了時間連續的資訊。

  • f-R2D是frame-based R2D的縮寫。

2 C3D

這個就是使用了3D卷積的方法,對於3D卷積構建的網路,需要注意的就是池化層的時候需要注意stride的參數是3個,不僅有w和h的步長,還要考慮時間維度上的步長。

在C3D的論文中給出了這樣的一個網路結構:

8個卷積層和2個全連接層,其中包含5個池化層(filter:2×2×2,stride: 2×2×2,除了第一個池化層的filter:1×2×2,stride: 1×2×2)

2.1 R3D

R2D和C3D我們都有所了解,那麼什麼是R3D呢?這個其實就是使用了Resnet網路的C3D罷了,由此可見,這個R3D的R的含義是Resnet網路的意思。

3 P3D

這個類似2D網路中的googleNet提出的inception中的概念,將7×7的卷積核拆分成1×7和7×1的兩個。

P3D是Pseudo-3D偽3D卷積的含義,把3x3x3的卷積核拆分成1x3x3的空間卷積和3x1x1的時間卷積。這樣做的好處有:

  • 減少計算量,這個是肯定的
  • 可以使用2D影像經典的卷積模型的訓練參數作為3D模型的空間卷積層參數的初始化

P3D網路提出了3個不用的block,講道理我覺得這三個差別不大:

再多說兩句好了,P3D卷積把3D卷積解耦成2D的空間卷積和1D的時間卷積,這樣可以防止在resnet的殘差模組中,實現遷移學習:

關於這P3D的ABC三個樣式的效果論文中也給出了結果:

效果最好的是P3D Resnet,這個是對三個模組的混合,混合順序是:

P3D-A->P3D-B->P3D-C

但是我還是覺得這個有些冗餘,沒有什麼道理。

4 MCx

這個方法是結合了R2D和R3D(C3D)兩種方法,MC是Mixed Convolution混合卷積的含義。我們先看一下網路結構對比圖:

  • 這個的MCx的結構是前面3層是2D卷積,之後跟上兩個3D卷積,因為是有3層的2D卷積,之後才換成3D卷積的,所以這個叫做MC3;
  • 後面的rMCx是和MCx相反的,是先3D卷積,然後再2D卷積,這裡是rMC3;
    先2D還是3D取決於:你認識時間的資訊處理是依賴於淺層網路還是深層的網路。論文中給出的實驗結果表明,時間資訊應該更加依賴於深層的網路,MCx的效果更好一些。

5 R(2+1)D

這個和MCx同屬於混合卷積,用2D卷積和1D卷積來逼近3D卷積。

其實從圖中來看,這個和P3D-A沒什麼區別,其實我也覺得沒什麼區別。硬要說的話:

  • 就是P3D的第一層是2D卷積,之後才是P3D模組,而R(2+1)D的網路是從一開始都是這種模組的;
  • R(2+1)D模組計算了超參數,通過增加通道數,來讓分解之後的R(2+1)D模型和之前的3D模型的參數量相同。這裡是控制哪裡的通道數呢?是2D卷積之後,要輸入到1D時間卷積的那個特徵圖的通道數,從上圖中可以看到M_i這個參數。這個參數可以通過這樣計算:
    M_i=floor(\frac{td^2N_{i-1}N_i}{d^2N_{i-1}+tN_i})

總之這個的好處,在論文中是跟C3D進行比較的(並沒有和P3D進行比較):

  1. 第一就是兩個子卷積之間多出來一個非線性操作,和原來同樣參數量的3維卷積相比double了非線性操作,增強了網路的表達能力。
  2. 第二個好處就是時空分解讓優化的過程也分解開來,事實上之前發現,3維時空卷積把空間資訊和動態資訊擰巴在一起,不容易優化。2+1維卷積更容易優化,loss更低。

上個圖:


總結:總體來說3D卷積的論文是以實驗為主,用實驗結果來數結論。儘可能的利用2D預訓練模型的參數。

參考論文:

  1. C3D:Learning Spatiotemporal Features with 3D Convolutional Networks
  2. P3D:Learning Spatio-Temporal Representation with Pseudo-3D Residual Networks
  3. R(2+1)D:A Closer Look at Spatiotemporal Convolutions for Action Recognition