這是Du Tran在Learning Spatiotemporal Features with 3D Convolutional Networks之後發表的續篇,相當於C3D的第二個版本,C3D-resnet.我個人覺得這篇文章除了主要探討C3D-resnet以外,更重要的是對CNN卷積結構在時空特徵表現上的一個深入探討。大部分工作還是基於UCF-101,而且從頭訓練,很利於在硬件條件有限的情況下,對算法進行討論。
首先給出代碼: https://github.com/facebook/C3D/tree/master/C3D-v1.1
再看一下升級後的效果圖:
這是相較於C3D來說,已經有了明顯的提高。 接下來我們看一下3D Residual Networks的結構 !
這是一個標準的8×112×112的input的結構。
可以看到它的效果相比於2D-CNN有了提高,但是同時也增加了參數和浮點運算。 爲了接下來研究方便,作者使用了一個很方便的小trick: 他簡化了網絡輸入,把8×112×112換成4×112×112,只需要把最後一個卷積層conv5_1的stride換成1*2*2即可,也就是時序上的stride=1. 然後作者討論了幀採樣率{1, 2, 4, 8, 16, 32},這裏幀採樣率就是輸入幀時序上的stride(採樣間隔),在最小幀採樣率爲1,輸入爲4的情況下,4幀大概是1/8s,按照上述採樣率,最大32的話,相當於稀疏採樣,用4幀段視頻表達了128幀的長視頻(大概4.5-5s).
可以看到,採樣率是2或者4的時候比較好,說明過於稀疏也沒用,1的話太稠密冗餘,也沒有意義。
作者還比較了不同分辨率的影響:
這也說明了,分辨率不一定是越大越好。
接下來作者討論了2D-CNN和3D-CNN的混合模型:
然而證明效果不佳。
接下來這個探討我覺得非常可惜:
這個2.5D-CNN的想法我覺得本來很好,但是作者做出來的效果也不好,不過準確率沒有提高就算了,參數量和浮點運算量也還是那麼大,令人費解。 因爲令人驚奇的是MSRA有一篇文章實現了僞3D卷積,效果不錯,不僅準確率高,參數量和浮點運算量也低,值得關注。 Learning Spatio-Temporal Representation with Pseudo-3D Residual Networks 接下來,作者討論了在參數量和浮點運算量差不多的情況下,網絡深度的影響,發現也沒什麼作用。
其中,k是輸出卷積核的通道數,俗稱網絡寬度,用來控制參數量和浮點運算次數。 之後,作者還做了一個很有意義的比較:
這張圖的意思是,把C3D和C3D-Resnet的特徵同時用PCA降維處理後,在低維情況下進行了比較,發現它的效果好。這個還是比較有實際意義的,因爲應用上不可能有高維特徵,把它降維之後,才方便產品落地。 最後,給出整體的網絡框架,大家會發現和2D-CNN的Resnet類似。
這是混合的2D-CNN和3D-CNN的Resnet.
這是不同深度的3D-CNN的Resnet. 總結: 雖然這篇升級版的C3D不一定是state of art,但是我最大的收穫是從作者的思路中學習到如何討論科研問題和改進模型結構的方法,這一點很重要。所以我很欣賞這篇文章,接地氣,硬件條件有限的情況下也可以實現,從頭訓練討論問題,排除了依靠大數據遷移學習,提升效果而忽略算法本事的問題。(PS:大概是貧窮限制了我的想象!)