I3D論文總結


  最近看了李沐講論文系列朱毅老師講的I3D論文精讀(視頻筆記),這里記錄一下。

1.針對的問題

  1.之前的視頻數據集都太小,導致大多數流行的動作識別基准都很小,且即使不同模型效果有好有壞也難以區分。

  2.在I3D提出之前,視頻一直沒有明確的前端運行架構,之前捕獲時序信息的方法主要有三種。1.向模型中添加一個循環層,例如LSTM,但這種方法在之前這些數據集上,表現並不是非常好。2.3D卷積神經網絡,輸入是視頻段,卷積核是三維的,再二維信息的基礎上還要額外處理時間維度,這導致參數量變得很大,另外也沒能使用到ImageNet預訓練的好處。3.雙流網絡,時間信息通過計算出來的光流表示。還有一種結合了3D卷積和雙流的方法,這種方法同樣使用雙流,不過在最后輸出的時候不像3D卷積網絡一樣加權平均,而是使用了一個3D卷積。

2.主要貢獻

  這篇論文主要有兩個貢獻:1.一個inflated 3D network(I3D),把2D模型擴張到3D模型,這樣就不用專門設計一個視頻理解的網絡了,可以使用2D里已經設計好的網絡,比如VGG、ResNet直接把它擴張到3D就可以了,甚至利用一些巧妙的方式把預訓練模型利用起來,這樣不僅設計簡單,而且可以省掉很多預訓練的麻煩;2.提出了一個新的數據集——Kinetics數據集,剛開始提出的時候只有400類,后面又推出了kinetic 600/700,分別對應600類和700類,視頻的數量也從最開始的30萬漲到了50多萬,最后60多萬,類比均衡,難度適中,不算特別大。

3.方法

  e為I3D模型,結構與3D卷積網絡類似,不過結合了光流,最后進行加權平均,這里主要介紹一些細節部分。inflate和bootstrap操作是精華部分。

  1.Inflate,其實就是把一個2D網絡直接變成一個3D網絡,對於一個2D網絡,只要遇到一個2D的卷積kernel, 就把它變成一個3D的kernel,遇到一個2D的pooling層,就變成一個3D的pooling層,其他結構都不變,這樣就不需要重新設計網絡。

  2.bootstrap,如果輸入是一張圖片x,2D網絡是w,則輸出是wx,將圖片反復復制粘貼,變成一個視頻則為nx,將所有的2Dfilter在時間維度也復制粘貼n次,變成nw,則輸出變成nwx,所以需要做一些rescaling,也就是在所有的filter上除以n,則最終輸出變成wx,也就與2D網絡對應起來了(感興趣的同學可以看一下老師實現的代碼,具體實現在539行init_weights函數,先將2D網絡的參數下載下來,然后通過collect_params這個函數就可以得到所有2D網絡的參數,都存在weights2d這個變量里,然后將3D網絡的所有參數也保存到weights3d變量,566行是一個assert操作,因為2D網絡和3D網絡的結構一樣,也就是層數應該一樣,從581行開始的for循環就是將2D網絡的參數轉移給3D網絡,585行的就是bootstrap操作)

  3.如何控制池化層,從而使得感受野處於一個合適的范圍,在inflate inception-V1時,conv層直接從7×7變為7×7×7,在maxpooling操作時並不是簡單的將3×3變為3×3×3,因為作者發現時間維度最好不要做下采樣,因為本來時間維度可能就不是長,所以這里是把3×3變為1×3×3,stride從2×2變為1×2×2,不過只是對於前面兩個maxpooling,后面的依舊做了下采樣。inception module直接inflate。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM