I3D 論文精讀【論文精讀】

Que Vadis,Action Recognition?A New Model and the Kinetics Dataset
- inflated:擴(kuò)大、膨脹
- Quo Vadis:1951 年的電影《where is this going?》,作者想要表達(dá)的意思是如果只通過一張圖片來看的話,很難對(duì)動(dòng)作進(jìn)行區(qū)分,以及動(dòng)作的后續(xù)發(fā)展(無法同過一張單一的視頻幀進(jìn)行判斷,只有通過觀看視頻理解上下文含義才能得知
貢獻(xiàn)
1、提出了 inflated 3D netword(I3D)模型,將一個(gè) 2D 模型擴(kuò)張到一個(gè) 3D 模型,該方法的好處是不用再設(shè)計(jì)一個(gè)專門的視頻理解網(wǎng)絡(luò),可以使用 2D 中已經(jīng)設(shè)計(jì)好的網(wǎng)絡(luò)(如 VGG、ResNet 等),將它們直接擴(kuò)張到 3D 就可以了,甚至還可以用一些巧妙的方式將它們的預(yù)訓(xùn)練模型也利用起來,這樣不僅涉及上比較簡(jiǎn)單,而且還能省掉很多預(yù)訓(xùn)練的麻煩
2、提出了 Kinetics 數(shù)據(jù)集,這個(gè)數(shù)據(jù)集剛開始提出的時(shí)候只有 400 類,所以叫做 Kinetics 400,緊接著又提出了具有 600 、700 類的 Kinetics 600、Kinetics 700,視頻的數(shù)量也從最開始的 30 萬漲到了 50 多萬,最后漲到了 60 多萬
- 2014 年的 sport - 1 Million 數(shù)據(jù)集有一百萬個(gè)視頻,但是全部都是關(guān)于運(yùn)動(dòng)的類,應(yīng)用場(chǎng)景比較局限(如果只在運(yùn)動(dòng)視頻上做預(yù)訓(xùn)練,很難拓展到其他領(lǐng)域)
- 2016 年 Google 推出了 youtube 8Million 數(shù)據(jù)集有 800 個(gè)視頻,但是數(shù)據(jù)集實(shí)在太大,一般在比賽的時(shí)候都是直接分享已經(jīng)抽取好的特征,而不是直接下載原始視頻
- Kinetics 數(shù)據(jù)集的類別比較均衡,難度適中,而且也不算特別大,因此使用門檻不高,一經(jīng)提出就得到了廣泛的使用(現(xiàn)在已經(jīng)成為了衡量視頻分類效果的必要的數(shù)據(jù)集)
- 視頻領(lǐng)域缺少一個(gè)大的數(shù)據(jù)集,導(dǎo)致不能很好地去研究視頻理解的框架,本文中作者證實(shí)視頻模型最好是在視頻上進(jìn)行預(yù)訓(xùn)練,因此本文提出了一個(gè)又大又好的視頻數(shù)據(jù)集,在這個(gè)數(shù)據(jù)集之上訓(xùn)練了一個(gè)新的模型 -- I3D模型,它在現(xiàn)有的視頻數(shù)據(jù)集上都取得了巨大的效果提升(比如在 Kinetics 數(shù)據(jù)集上預(yù)訓(xùn)練之后,再在 UCF-101 數(shù)據(jù)集上做微調(diào),能夠?qū)⒆詈蟮慕Y(jié)果刷到 98,直接宣告了 UCF-101 數(shù)據(jù)集的終結(jié)以及 Kinetics 數(shù)據(jù)集的崛起,算是開啟了一個(gè)新時(shí)代)
- 現(xiàn)在大家發(fā)現(xiàn) Kinetics 數(shù)據(jù)集還是非常大,如果從視頻里選擇最中間的那一幀,然后對(duì)這一幀做圖像動(dòng)作分類,它的準(zhǔn)確度就已經(jīng)很高了,完全不要太多的上下文信息,也完全不需要模型具備太強(qiáng)的時(shí)序建模能力,所以和這篇論文所想要達(dá)到的目標(biāo)還是有一定的距離(但是想要做到這樣確實(shí)比較困難,直到現(xiàn)在,也無法想到一個(gè)很好的方式去構(gòu)建一個(gè)很好的視頻數(shù)據(jù)集,從而能夠讓所學(xué)到的模型真的能夠關(guān)注到時(shí)序上的信息,真的能夠處理長(zhǎng)時(shí)間的復(fù)雜的視頻和拓展到生活中方方面面的領(lǐng)域里去,所以視頻理解的道路還是非常漫長(zhǎng))
總覽
- 這篇論文沒有相關(guān)工作(related work)這部分,因?yàn)檫@些工作與文中所要講的內(nèi)容非常相關(guān),讀者必須對(duì)這些相關(guān)工作有一定的了解才,能夠欣賞到本文的必要之處,所以作者將之前的相關(guān)工作和自己的方法都融合到了一個(gè)大的章節(jié)中了
- 視頻中所選擇的是最新的 Arxiv 版本( 2018 年 2 月份最后一次更新)
1、摘要
如今缺少一個(gè)大型的、有用的視頻數(shù)據(jù)集,從而很難訓(xùn)練一個(gè)有效而且能夠擴(kuò)展的視頻理解模型,所以本文中提出了 Kinetics 數(shù)據(jù)集,還提出了一個(gè)新的模型 I3D
2、方法
作者首先敘述了三種過去非常流行的視頻理解方法
- 第一種:卷積神經(jīng)網(wǎng)絡(luò) + LSTM,卷積神經(jīng)網(wǎng)絡(luò)用來抽取特征,LSTM 用來抽取時(shí)序信息
- 第二種:直接訓(xùn)練一個(gè) 3D 卷積神經(jīng)網(wǎng)絡(luò)
- 第三種:雙流網(wǎng)絡(luò)
然后提出了自己的方法:I3D 網(wǎng)絡(luò)
3、結(jié)果
4、模型學(xué)到的特征的一些可視化
摘要
因?yàn)槟壳暗臄?shù)據(jù)集都太小了,比如 UCF-101 (101 類,13000 個(gè)視頻)和 HMDB-51 (51 類,7000 多個(gè)視頻)
- 在這么小的數(shù)據(jù)集上,往往很難發(fā)揮深度學(xué)習(xí)的作用,所以在 cvpr 16 、 eccv 16 的時(shí)候,很多方法在這兩個(gè)數(shù)據(jù)集上的表現(xiàn)都很相似,作者認(rèn)為這些方法其實(shí)都是有強(qiáng)弱之分的,但是因?yàn)閿?shù)據(jù)集太小,所以無法識(shí)別視頻網(wǎng)絡(luò)架構(gòu)的好壞了
所以本文提出了一個(gè)新的數(shù)據(jù)集-- Kinetics 數(shù)據(jù)集,同時(shí)作者重新把之前最好的網(wǎng)絡(luò)結(jié)構(gòu)在 Kinetics 數(shù)據(jù)集上測(cè)試了一遍現(xiàn)有的方法
- 這篇文章最主要的買點(diǎn)是數(shù)據(jù)集,所以作者將數(shù)據(jù)集放到了摘要的第一段,模型放到了第二段
- 新提出的 Kinetics 數(shù)據(jù)集有 400 類,也就是常說的 K400 數(shù)據(jù)集,每一類都有超過 400 個(gè)視頻段落( video clip ,一小段視頻,比如 K400 數(shù)據(jù)集所有的視頻都只有 10 秒,都是將對(duì)應(yīng)的人體動(dòng)作精準(zhǔn)地從視頻中摳出來了,所以說是一個(gè)標(biāo)注的非常仔細(xì)的好的數(shù)據(jù)集,一般將這種五六秒或者十幾秒的視頻段落叫做 video clip )
- 另外一個(gè)作者最想要的非常重要的一個(gè)賣點(diǎn)是遷移學(xué)習(xí),在這個(gè)大數(shù)據(jù)集上預(yù)訓(xùn)練過的模型到底能夠在小規(guī)模的數(shù)據(jù)集上能夠有多大的提升
作者在第二段講述了對(duì)模型的改進(jìn),提出了一個(gè) Two-Stream Inflated 3D 網(wǎng)絡(luò)
- 這個(gè)網(wǎng)絡(luò)來自 2D 網(wǎng)絡(luò)的擴(kuò)張( inflation ) :這里的擴(kuò)張指的是將一個(gè)已經(jīng)調(diào)好的網(wǎng)絡(luò)(比如說 ResNet )直接拿過來,然后將網(wǎng)絡(luò)中所有的 3 * 3 的 kernel 或者 3 * 3 的 pooling 全部變成 3 * 3 * 3 ,這樣就生成了一個(gè)針對(duì)視頻理解的網(wǎng)絡(luò)結(jié)構(gòu)。
- 這樣做的好處是不用再費(fèi)盡心思去設(shè)計(jì)一個(gè)專門的針對(duì)視頻理解的網(wǎng)絡(luò)架構(gòu)了,在 2017 年之前大家已經(jīng)做了很多這種模型上的改進(jìn):AlexNet -> VGG -> InceptionNet -> ResNet,并且已經(jīng)得出了很多很有用的結(jié)論:堆疊的 3 * 3 的 Kernel 效果就很好;分類的最后不需要使用全連接層;一個(gè)網(wǎng)絡(luò)應(yīng)該被分成幾個(gè)階段,每個(gè)階段中應(yīng)該包含多少個(gè) Residual block 等等,這些結(jié)論之前已經(jīng)在 2D 的網(wǎng)絡(luò)上做過很多的消融實(shí)驗(yàn)了,既然有這么多前人的工作,最好最簡(jiǎn)單的方式就是直接將這些網(wǎng)絡(luò)用到視頻理解中,畢竟視頻也是由一幀一幀的視頻幀堆疊起來的,跟圖片的區(qū)別不是很大。如果說從頭開始設(shè)計(jì)網(wǎng)絡(luò),之前所遇到的所有的問題都需要重新考慮:選用多大的 kernel size;整個(gè)網(wǎng)絡(luò)選取幾個(gè)階段,每個(gè)階段使用多少個(gè) block 等等,而且視頻又多了一個(gè)時(shí)間的維度,導(dǎo)致消融實(shí)驗(yàn)的量是非常巨大的,所以說如果能從一個(gè) 2D 的網(wǎng)絡(luò)直接擴(kuò)張成一個(gè) 3D 的網(wǎng)絡(luò)是一個(gè)最簡(jiǎn)單有效的方法,而且本文中作者甚至通過一種叫做 bootstrapping 的方法將 2D 網(wǎng)路的預(yù)訓(xùn)練參數(shù)用來做 3D 網(wǎng)絡(luò)的初始化,避免了從頭開始訓(xùn)練(這種擴(kuò)張的方法一直到現(xiàn)在都有用:TimeSformer 就是將 Vision Transformer 進(jìn)行擴(kuò)張)
最后作者講述了實(shí)驗(yàn)數(shù)據(jù),在本文所提出的大規(guī)模的 Kinetics 數(shù)據(jù)集上預(yù)訓(xùn)練過之后,本文所提出的 Two-Stream Inflated 3D 網(wǎng)絡(luò)能夠在 HMDB-51 上達(dá)到 80.9% 的效果(之前 HMDB-51 上最好的結(jié)果在 70% 左右,直接提高了 10 個(gè)點(diǎn),因?yàn)?HMDB-51 數(shù)據(jù)集比較難,所以能夠達(dá)到 80% 就已經(jīng)很好了,一直到現(xiàn)在也沒有太多的工作再做這個(gè)數(shù)據(jù)集了,80% 基本上已經(jīng)是天花板級(jí)別了),在 UCF-101 上達(dá)到 98.0% 的效果(這也是一個(gè)很好的結(jié)果,再刷也無非就是刷到 100%)
- 其實(shí) I3D 論文一出,基本上 UCF-101 和 HMDB-51 這兩個(gè)數(shù)據(jù)集之后也只能做一種輔助實(shí)驗(yàn)了,或者說將它們當(dāng)作遷移學(xué)習(xí)或者自監(jiān)督學(xué)習(xí)特征的衡量標(biāo)準(zhǔn),而不能單獨(dú)地作為有監(jiān)督學(xué)習(xí)下的衡量標(biāo)準(zhǔn)
引言
ImageNet 數(shù)據(jù)集所帶來的好處,不光是可以訓(xùn)練神經(jīng)網(wǎng)絡(luò),最主要的、也是最意想不到的好處是在這種大規(guī)模的數(shù)據(jù)集上進(jìn)行預(yù)訓(xùn)練之后,可以直接從網(wǎng)絡(luò)中抽取特征(之前常見的做法是將 FC 6 或者 FC 7(就是倒數(shù)兩層全連接層)的特征抽取出來),可以非常有效地遷移到其他任務(wù)(比如在 pascal voc 分類或者檢測(cè)任務(wù)上,都能取得很好的效果)
所以從 ImageNet 訓(xùn)練網(wǎng)絡(luò)結(jié)構(gòu)開始,深度學(xué)習(xí)逐漸將其他的任務(wù)也全都控制了(比如分割、深度估計(jì)、姿態(tài)估計(jì)、動(dòng)作分類等),但是在視頻領(lǐng)域,先在大規(guī)模數(shù)據(jù)機(jī)上做預(yù)訓(xùn)練然后遷移到小數(shù)據(jù)集上的這種范式其實(shí)還沒有被證實(shí)有效,因?yàn)橐曨l領(lǐng)域中還沒有一個(gè)好用的大規(guī)模數(shù)據(jù)集,目前有的數(shù)據(jù)集其實(shí)只有 1 萬個(gè)視頻左右,相對(duì)于其他任務(wù)或者其他領(lǐng)域來說,數(shù)據(jù)量太小了
所以本文提出了一個(gè)新的數(shù)據(jù)集 -- Kinetics 數(shù)據(jù)集,它遠(yuǎn)比之前的兩個(gè)數(shù)據(jù)集要大得多
- 第一版的 Kinetics 數(shù)據(jù)集,也就是 K400 數(shù)據(jù)集有 400 個(gè)類別,每個(gè)類別都有超過 400 個(gè)樣本,而且每個(gè)樣本都是來自于一個(gè)獨(dú)一無二的 youtube 視頻,因此多樣性是比較好的(像之前的一些數(shù)據(jù)集,哪怕是 UCF-101 ,它里面有很多視頻的小片段也是從一個(gè)大視頻中截取出來的)
- K400 數(shù)據(jù)集構(gòu)建的還是不錯(cuò)的,直到今天大家都還在使用,并且在它上面做算法好壞的比較
在構(gòu)建了一個(gè)新的數(shù)據(jù)集之后,作者將之前比較流行的而且好用的方法都拿來測(cè)試了一下
- 不僅可以看一下之前的方法有哪些優(yōu)缺點(diǎn)、相似性和不用的特性
- 還可以驗(yàn)證一下新的數(shù)據(jù)集的有效性:有時(shí)新出來的數(shù)據(jù)集可能有一些自身自帶的特性或者說 bias ,導(dǎo)致它會(huì)過于簡(jiǎn)單或者是過于困難(過于簡(jiǎn)單或者過于困難都會(huì)導(dǎo)致沒有人真正的用這個(gè)數(shù)據(jù)集,也就沒有構(gòu)建這個(gè)數(shù)據(jù)集的意義了)
本文中比較了三種之前比較流行的方式,這三種方式也代表了在視頻領(lǐng)域大家是如何通過不同的方式去使用視頻里自帶的時(shí)序信息的,因?yàn)橐曨l跟圖片相比就只是多了一個(gè)時(shí)間的維度,所以說主要的區(qū)別就是如何利用好持續(xù)的信息,所以這三種方式也是代表了三種常見的流派
- 卷積神經(jīng)網(wǎng)絡(luò) + LSTM
- 3D 卷積神經(jīng)網(wǎng)絡(luò)
- 雙流神經(jīng)網(wǎng)絡(luò)
通過測(cè)試作者發(fā)現(xiàn),這種先大規(guī)模的預(yù)訓(xùn)練,然后再在小數(shù)據(jù)集上做微調(diào)的時(shí)候,這幾個(gè)網(wǎng)絡(luò)結(jié)構(gòu)都表現(xiàn)的參差不齊,而且有的時(shí)候提升也不是很顯著,所以作者就取其精華,去其糟粕,最后提出了一個(gè) Two-Stream Inflated 3D 網(wǎng)絡(luò)
- Two-Stream Inflated 3D 網(wǎng)絡(luò)本身就是將所有的 2D kernel 變成了 3D kernel,將 3 * 3 變成了 3 * 3 * 3,包括 pooling 層也是從二維變成了三維,所以最終得到了一個(gè)非常深而且設(shè)計(jì)的還不錯(cuò)的視頻理解的網(wǎng)絡(luò)
- 之所以還是使用雙流,是因?yàn)樽髡甙l(fā)現(xiàn)即使使用了 3D 神經(jīng)網(wǎng)絡(luò),對(duì)局部信息的掌控神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)的還是不夠好,加上雙流之后效果還是能夠提高很多,才能得到在 UCF-101 上 98% 的準(zhǔn)確率,所以作者也就是將雙流網(wǎng)絡(luò)和 3D 神經(jīng)網(wǎng)絡(luò)進(jìn)行了結(jié)合
本文中,已經(jīng)不再和傳統(tǒng)的方式作比較了,比如 bag-of-visual-words 這種表示在 2015 、2016年的時(shí)候還是比較流行的,但是在本文中已經(jīng)不去和它進(jìn)行對(duì)比了。另外,因?yàn)?K400 這個(gè)數(shù)據(jù)集是公開的,所以作者也鼓勵(lì)大家在這個(gè)數(shù)據(jù)集上進(jìn)行嘗試
方法
- 前三節(jié)主要是回顧之前的方法,后面兩節(jié)主要講作者所提出的方法以及具體的實(shí)現(xiàn)細(xì)節(jié)
在 2D 圖像分類領(lǐng)域其實(shí)已經(jīng)有主導(dǎo)的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)了(之前是 VGG 、 Inception,現(xiàn)在是 ResNet),到現(xiàn)在為止視頻領(lǐng)域中也沒有一個(gè)定論:到底是用 2D 、 3D,還是使用 Transformer,在當(dāng)時(shí)來看只有以下幾種選擇(作者在 2.1 、2.2 、2.3 這三個(gè)章節(jié)中分別描述了一下之前的這三種方式):
- 要么就是一個(gè)純 2D 的網(wǎng)絡(luò)后面再接上一些操作(比如 LSTM 層),從而做時(shí)間上的建模
- 或者不論是用 2D 網(wǎng)絡(luò)還是 3D 網(wǎng)絡(luò),都配備上光流,一旦有了光流之后,就有了時(shí)間上或者局部的運(yùn)動(dòng)信息的建模能力
- 或者直接用 3D 網(wǎng)絡(luò),直接學(xué)習(xí) Special Temporal 的時(shí)空特征
最后經(jīng)過大量的對(duì)比,作者提出了 Two-Stream Inflated 3D 網(wǎng)絡(luò)
- Two-stream:之所以使用雙流就是簡(jiǎn)單的 a + b 了,因?yàn)樽髡甙l(fā)現(xiàn)雙流的使用是有效的,所以作者就使用了雙流
- Inflated:之所以用 inflated 是因?yàn)橹暗?3D 網(wǎng)絡(luò)的參數(shù)量實(shí)在是過于巨大,但是又沒有合適的或者足夠的視頻數(shù)據(jù)做預(yù)訓(xùn)練,最終就導(dǎo)致 3D 網(wǎng)絡(luò)不能太深(ICCV 15 的時(shí)候就有一個(gè)非常著名的工作叫 C3D,只有八層,而且效果也比較一般,當(dāng)時(shí)沒有超過雙流網(wǎng)絡(luò)的結(jié)果,所以作者這里在使用了 inflated 這個(gè)操作之后就可以直接啟用特別深的最近表現(xiàn)比較好的網(wǎng)絡(luò),而且在使用了這些 2D 網(wǎng)絡(luò)預(yù)訓(xùn)練參數(shù)作為初始化之后,I3D 網(wǎng)絡(luò)也不需要很多的視頻數(shù)據(jù)做預(yù)訓(xùn)練了)
具體來說,本文所使用的網(wǎng)絡(luò)結(jié)構(gòu)是從 Inception V1 經(jīng)過一些改造得來的
- 為什么使用 Inception 而不是使用 ResNet ?因?yàn)楫?dāng)時(shí)在 16 年的時(shí)候有很多論文做過消融實(shí)驗(yàn)發(fā)現(xiàn),至少在當(dāng)時(shí)的視頻分類任務(wù)上,Inception 的結(jié)構(gòu)比 ResNet 稍微好一些,所以在這篇論文中,作者就直接從 Inception 開始了
- 但是因?yàn)?ResNet 的統(tǒng)治地位,所以在一年之后的 non local 論文中,作者就已經(jīng)把 I3D 網(wǎng)絡(luò)用 ResNet 進(jìn)行實(shí)現(xiàn)了,從那時(shí)起,每當(dāng)大家再提起 I3D ,其實(shí)很多時(shí)候指的是 ResNet 基礎(chǔ)的 I3D 網(wǎng)絡(luò)
圖2

1、卷積神經(jīng)網(wǎng)絡(luò) + LSTM

這種方式其實(shí)還是把一個(gè)視頻更多地看成了是一個(gè)圖像分類的問題,因?yàn)閺囊曨l幀 1 開始一直到視頻幀 k,對(duì)于視頻來說是一張圖片一張圖片地通過卷積神經(jīng)網(wǎng)絡(luò)(整個(gè)特征抽取的過程是完全分開的),在抽取完特征之后,再將抽取的特征全部輸入進(jìn) LSTM 網(wǎng)絡(luò)(LSTM 網(wǎng)絡(luò)可以進(jìn)行時(shí)序建模,所以它可以將每個(gè)時(shí)間戳上的特征融合起來,從而去理解整個(gè)視頻內(nèi)容),經(jīng)過一系列的計(jì)算之后,將最后一個(gè)時(shí)間戳上出來的結(jié)果后面加上一個(gè)全連接層,然后進(jìn)行分類任務(wù)
- 這種方式其實(shí)是一種非常合理的方式,圖像每一幀分開做,然后用一個(gè) LSTM 網(wǎng)絡(luò)模擬時(shí)序信息
- 但是這種方法至少在之前的數(shù)據(jù)集上表現(xiàn)并不是非常好,所以很快這種方式就被拋棄了,基本上留下來的就是兩個(gè)比較主流的框架: 3D 卷積神經(jīng)網(wǎng)絡(luò)、雙流神經(jīng)網(wǎng)絡(luò)
2、3D 卷積神經(jīng)網(wǎng)絡(luò)

這種方式就是將視頻劈成一個(gè)一個(gè)的視頻段,每個(gè)視頻段中有從 1 到 k 張圖片,然后將這些圖片當(dāng)成一個(gè) volume ,這樣就能將整個(gè)視頻輸入到網(wǎng)絡(luò)中了
- 同時(shí)也就意味著網(wǎng)絡(luò)能夠進(jìn)行時(shí)空學(xué)習(xí),也就是說卷積核必須是三維的,不光要處理二維上的圖像,還需要處理時(shí)間維度,也就是 3 * 3 * 3,但是這樣會(huì)導(dǎo)致參數(shù)量變得很大,相當(dāng)于所有的參數(shù)層都多了一個(gè)維度
- 在之前視頻數(shù)據(jù)集比較少的情況下不是很好訓(xùn)練,效果也比較 一般,但是在這篇論文中,在給定數(shù)據(jù)集足夠的情況下,該網(wǎng)絡(luò)的威力就顯現(xiàn)出來了
- 事實(shí)上也確實(shí)如此,作者在最后提出的 Two-Stream I3D 網(wǎng)絡(luò)其實(shí)也就是一個(gè) 3D 的神經(jīng)網(wǎng)絡(luò),但是在圖 2(b) 中就是將一個(gè)視頻小段輸入到一個(gè) 3D 神經(jīng)網(wǎng)絡(luò)中,在這個(gè) 3D 神經(jīng)網(wǎng)絡(luò)中經(jīng)過一些 3D 卷積、3D 池化之后,最后返回一個(gè)特征,并在這個(gè)特征之上做全連接,最后做分類就可以了
3、雙流網(wǎng)絡(luò)
如果不想使用 LSTM 做時(shí)序的模擬,也不想訓(xùn)練一個(gè) 3D 網(wǎng)絡(luò)去做時(shí)空學(xué)習(xí),怎樣能夠抓住時(shí)序信息呢?一個(gè)非常簡(jiǎn)單的方式就是提前抽取好光流(這里的光流值的是光的流動(dòng),也就是視頻中每個(gè)物體的運(yùn)動(dòng)軌跡),它自身蘊(yùn)含了非常準(zhǔn)確的而且非常強(qiáng)大的物體運(yùn)動(dòng)信息,所以它就是一種變相的視頻中時(shí)序信息的特征表示。
所以只需要先從視頻中抽取光流圖,然后學(xué)習(xí)一個(gè)從光流到最后的動(dòng)作之間的一個(gè)映射關(guān)系就可以了,而卷積神經(jīng)網(wǎng)絡(luò)本身并不需要知道運(yùn)動(dòng)是如何發(fā)生的,也不需要具有時(shí)序模擬建模的能力,這些只需要光流就足夠了,所以這個(gè)網(wǎng)絡(luò)非常的簡(jiǎn)單,而且因?yàn)樗鼘?duì)模型的要求比較低,所以訓(xùn)練起來也比較容易,結(jié)果也非常好。
所以在 15 、16 年的時(shí)候,雙流網(wǎng)絡(luò)是遠(yuǎn)遠(yuǎn)優(yōu)于 3D 神經(jīng)網(wǎng)絡(luò)的,這個(gè)階段基本上 90% 的工作都是基于雙流網(wǎng)絡(luò)
具體來講,雙流網(wǎng)絡(luò)就是有兩個(gè) 2D 的卷積神經(jīng)網(wǎng)絡(luò)

- 左邊的網(wǎng)絡(luò)叫做空間流,它的輸入是一幀或者多幀的視頻幀,主要負(fù)責(zé)學(xué)習(xí)場(chǎng)景信息
- 右邊的網(wǎng)絡(luò)叫做時(shí)間流,它的輸入是光流圖像,主要負(fù)責(zé)學(xué)習(xí)物體的運(yùn)動(dòng)信息
這兩個(gè)神經(jīng)網(wǎng)絡(luò)最后都會(huì)得到特征最后做分類,在得到這個(gè)分類結(jié)果之后,再進(jìn)行 later fusion(指的是不同的特征使用不同的分類器,得到基于每個(gè)特征的分類結(jié)果,再對(duì)所有結(jié)果進(jìn)行融合(可能是投票、加權(quán)平均等),這個(gè)融和發(fā)生在不同特征分類結(jié)果之間的融合),最后再將兩個(gè) logist 加權(quán)平均一下就可以了
4、3D-Fused Two-Stream
- LSTM基本上是沒有什么后續(xù)工作,主要是 3D 卷積神經(jīng)網(wǎng)絡(luò)和雙流網(wǎng)絡(luò),所以在 CVPR 16 的時(shí)候有一篇論文有機(jī)地將 3D 卷積神經(jīng)網(wǎng)絡(luò)和雙流網(wǎng)絡(luò)結(jié)合到一起,也就是 3D-Fused Two-Stream

剛開始的時(shí)候是按照雙流網(wǎng)絡(luò)的做法,結(jié)構(gòu)的前半段和雙流網(wǎng)絡(luò)相同
- 左邊是一個(gè)輸入為圖像的 2D 卷積神經(jīng)網(wǎng)絡(luò)
- 右邊是一個(gè)輸入為光流的 2D 卷積神經(jīng)網(wǎng)絡(luò)
但是有研究者認(rèn)為在雙流網(wǎng)絡(luò)中最后取了一個(gè)加權(quán)平均過于簡(jiǎn)單,很有可能不利于抓住視頻中特別復(fù)雜的場(chǎng)景變換,所以 3D-Fused Two-Stream 這篇文章中就把最后的加權(quán)平均用一個(gè)比較小的 3D 卷積神經(jīng)網(wǎng)絡(luò)替代
- 如果將雙流網(wǎng)絡(luò)中之前的方式叫做 later fusion:在 Logist 層面融合時(shí)間流和空間流的結(jié)果
- 3D-Fused Two-Stream 中使用的方式叫做 early fusion:在還未出結(jié)果的情況下,就將這兩個(gè)特征先融合在一起,然后用一個(gè) 3D 卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行處理,最后直接得到分類結(jié)果(這里的 3D 卷積神經(jīng)網(wǎng)絡(luò)也可以用 LSTM 代替,但是因?yàn)樾Ч缓?,所以基本上都是用?3D 卷積神經(jīng)網(wǎng)絡(luò))
后續(xù)還有一些工作順著 3D-Fused Two-Stream 又做了一些研究:到底應(yīng)該剛開始用 2D 后面用 3D,還是剛開始用 3D 后面用 2D?2D 和 3D 的計(jì)算復(fù)雜度和訓(xùn)練難度都是不一樣的,所以如何去找到一個(gè)好的折中的網(wǎng)絡(luò)設(shè)計(jì)方案十分關(guān)鍵。后續(xù)的結(jié)果證明:前面用 2D 卷積神經(jīng)網(wǎng)絡(luò)后面用 3D 卷積神經(jīng)網(wǎng)絡(luò)的方式最好,容易訓(xùn)練而且能夠得到比較好的結(jié)果
5、雙流 I3D 網(wǎng)絡(luò)
- 前面 4 種都是之前的方法,作者在自己提出的 K400 數(shù)據(jù)集上進(jìn)行復(fù)現(xiàn),得到結(jié)果之后然后進(jìn)行反復(fù)對(duì)比,作者就提出了第五種模型設(shè)計(jì)方案
作者認(rèn)為,只要在足夠多的數(shù)據(jù)集的情況下,其實(shí)使用 3D 卷積神經(jīng)網(wǎng)絡(luò)明顯是要比 2D 卷積神經(jīng)網(wǎng)絡(luò)的效果要好
但是 3D 卷積神經(jīng)網(wǎng)絡(luò)也不是萬能的,還有一些東西學(xué)不到,所以使用光流進(jìn)行輔助效果會(huì)更好,所以作者還是采取了雙流網(wǎng)絡(luò),但是每一個(gè)分支都使用的是 3D 卷積神經(jīng)網(wǎng)絡(luò)
- 因?yàn)槊恳粋€(gè)分支都是 3D 卷積神經(jīng)網(wǎng)絡(luò),也就不存在 early fusion 或者 late fusion,所以就沒有必要在后面再加一個(gè) 3D 卷積神經(jīng)網(wǎng)絡(luò)去做 fusion,于是直接進(jìn)行加權(quán)平均,最后得出結(jié)果就可以了
具體細(xì)節(jié)
第一部分:Inflating 2D ConvNets into 3D
就是將一個(gè) 2D 卷積網(wǎng)絡(luò)直接暴力地變成了 一個(gè) 3D 卷積網(wǎng)絡(luò)
以 Res 50 為例,剛開始有一個(gè)卷積層,然后接一個(gè)最大池化層,后面有四個(gè)階段:Res 2 3 4 5,每個(gè)階段分別有 3、4、6、3個(gè) Residual block,如何將一個(gè) 2D 的 Res 50 變成一個(gè) 3D 的 Res 50 ?
- 整體的架構(gòu)保持不變,只要遇到一個(gè) 2D 的卷積核,就將它變成一個(gè) 3D 的卷積核,只要遇到一個(gè) 2D 的池化層,就把它變成一個(gè) 3D 的池化層就可以了
- Residual block 還是 Conv-BN-ReLU 的結(jié)構(gòu),并且數(shù)量不變
- 還是分成了四個(gè)階段
以上的這種轉(zhuǎn)變方式就是 inflate ,這樣做的好處是
- 因?yàn)椴挥迷僦匦略O(shè)計(jì)網(wǎng)絡(luò),所有設(shè)計(jì)好的 2D 網(wǎng)絡(luò)都可以直接拿來使用,以后如果有設(shè)計(jì)的更好的效果更好的 2D 網(wǎng)絡(luò)也可以采用同樣的方式轉(zhuǎn)變成為 3D 網(wǎng)絡(luò)
之后的 Non-Local Network 中,作者也是采用了這種方式將 2D 網(wǎng)絡(luò) inflate 成為 3D 網(wǎng)絡(luò)的;在最新的 TimeSformer 中也是將 ViT 從 2D inflate 到 3D;現(xiàn)在最近的 Video Swin Transformer(CVPR 22)也是將 Swin Transformer 從 2D inflate 到 3D
第二部分:Bootstrapping 3D filters from 2D Filters
- 得到一個(gè)合理的做視頻理解的網(wǎng)絡(luò)結(jié)構(gòu)其實(shí)只是第一步,接下來更難的問題是如何能更好地將這個(gè) 3D 網(wǎng)絡(luò)訓(xùn)練起來
bootstrapping 的字面意思是引導(dǎo),也就是說當(dāng)已經(jīng)有一個(gè)東西之后,在此基礎(chǔ)上再去做一些改進(jìn),從而讓這個(gè)東西變得更好。這里的意思是說如何能從 2D 的在 ImageNet 上已經(jīng)訓(xùn)練好的模型出發(fā),去初始化 3D 模型,然后在這個(gè)初始化好的 3D 模型上繼續(xù)進(jìn)行訓(xùn)練使他變得更好
- 具體實(shí)現(xiàn)上還是有難度的,因?yàn)槿绻胗靡粋€(gè)已經(jīng)預(yù)訓(xùn)練好的參數(shù)來做初始化,最簡(jiǎn)單或者說最好來說,這兩個(gè)網(wǎng)絡(luò)應(yīng)該是一模一樣的,這樣就能夠直接將預(yù)訓(xùn)練好的參數(shù)搬過來就可以了
- 但是現(xiàn)在預(yù)訓(xùn)練好的網(wǎng)絡(luò)是一個(gè) 2D 網(wǎng)絡(luò),而即將要訓(xùn)練并且最后要使用的網(wǎng)絡(luò)是一個(gè) 3D 網(wǎng)絡(luò),雖然這兩個(gè)網(wǎng)絡(luò)整體的架構(gòu)是一樣的,但是具體到每一步操作都是不同的
如何用一個(gè) 2D 的預(yù)訓(xùn)練好的模型初始化一個(gè) 3D 的模型?
- 平時(shí)在用別的預(yù)訓(xùn)練模型初始化自己的模型時(shí),通常會(huì)進(jìn)行以下操作來驗(yàn)證初始化是否正確:給定同樣的輸入,用這個(gè)輸入在原來的模型上面跑一遍,然后再在初始化后的模型上跑一遍,兩次所得到的輸出按道理來講應(yīng)該是完全一樣的(如果參數(shù)搬運(yùn)是正常的話,這兩個(gè)模型是完全對(duì)等的,如果是同樣的輸入、同樣的模型,那么它們的輸出就應(yīng)該相等)
- 作者受此啟發(fā),使用同樣一張圖片反復(fù)地進(jìn)行復(fù)制粘貼最后變成了一個(gè)視頻,也就是說這個(gè)視頻中全是同樣的視頻幀,如果進(jìn)行播放的話是沒有任何的變化的,也就是作者所說的 boring video
- 用什么方式能夠?qū)?2D 已經(jīng)訓(xùn)練好的網(wǎng)絡(luò)參數(shù)用來初始化 3D 模型(最后如果能夠使得這兩個(gè)模型的輸出一致,就能從側(cè)面驗(yàn)證這個(gè) 3D 模型是從 2D 模型初始化而來的)?具體的做法就是將所有的 2D Filter 全都在時(shí)間維度上復(fù)制粘貼 n 次,就和輸入視頻對(duì)應(yīng)起來了
- 原來是一張圖片對(duì)應(yīng)一個(gè) 2D 神經(jīng)網(wǎng)絡(luò),假設(shè)入是 X ,網(wǎng)絡(luò)是 W 的話,最后就會(huì)得到輸出 X × W;現(xiàn)在輸入變成了一個(gè)視頻,視頻里面有 n 個(gè) X,3D 神經(jīng)網(wǎng)絡(luò)的參數(shù)也是 W × n,那么最后的結(jié)果就相當(dāng)于得到了 n 份的 W × X
- 如果想讓 2D 神經(jīng)網(wǎng)絡(luò)和 3D 神經(jīng)網(wǎng)絡(luò)的輸出保持一致,就需要做一些 rescaling (在所有的 2D Filter 上都除以 n),這樣 n 倍的 W × X 除以 n 之后就又變成了 W × X,也就是說,最后輸入為圖像的 2D 神經(jīng)網(wǎng)絡(luò)的輸出是 W × X ,輸入為視頻的 3D 神經(jīng)網(wǎng)絡(luò)的輸出也是 W × X
- 這樣就保證了無論是在網(wǎng)絡(luò)的哪一層,不論輸入是圖片還是視頻,分別對(duì)應(yīng)通過一個(gè) 2D 神經(jīng)網(wǎng)絡(luò)和一個(gè) 3D 神經(jīng)網(wǎng)絡(luò)之后,最后得到的輸出都是一樣的,這樣再向后面的層進(jìn)行傳遞的時(shí)候,后面的層也能接的住這個(gè)輸入,因?yàn)樗鼈兪峭耆粯拥?,也就是說可以用預(yù)訓(xùn)練好的參數(shù)來做進(jìn)一步的計(jì)算
使用 gluon-cv 中的 I3D 為例來解釋具體的 inflate 和 bootstrap 是如何用代碼實(shí)現(xiàn)的
- 代碼文件:https://github.com/dmlc/gluon-cv/blob/master/gluoncv/model_zoo/action_recognition/i3d_resnet.py
- 具體的實(shí)現(xiàn)是文件中的 init_weights 函數(shù)(line 539)
def init_weights(self, ctx): ???"""Initial I3D network with its 2D pretrained weights.""" ???self.first_stage.initialize(ctx=ctx) ???self.res_layers.initialize(ctx=ctx) ???self.head.initialize(ctx=ctx) ???""" ???首先下載 2D 網(wǎng)絡(luò)的預(yù)訓(xùn)練參數(shù),Res 50 或者是 Res 101 ???""" ???if self.pretrained_base and not self.pretrained: ?????if self.depth == 50: ???????resnet2d = resnet50_v1b(pretrained=True) ?????elif self.depth == 101: ???????resnet2d = resnet101_v1b(pretrained=True) ?????else: ???????print('No such 2D pre-trained network of depth %d.' % (self.depth)) ?????""" ??? 通過 collect_params 函數(shù)就能得到 2D 網(wǎng)絡(luò)所有的參數(shù), ??? 并將其存儲(chǔ)在 weights2d 變量中 ??? """ ?????weights2d = resnet2d.collect_params() ?????if self.nonlocal_cfg is None: ???????weights3d = self.collect_params() ?????else: ???????train_params_list = [] ???????raw_params = self.collect_params() ???????for raw_name in raw_params.keys(): ?????????if 'nonlocal' in raw_name: ???????????continue ?????????train_params_list.append(raw_name) ???????init_patterns = '|'.join(train_params_list) ???????""" ??? 通過 collect_params 函數(shù)得到新建立的 3D 網(wǎng)絡(luò)所有的模型參數(shù), ??? 并將其存儲(chǔ)在 weights3d 變量中 ??? """ ???????weights3d = self.collect_params(init_patterns) ?????""" ??? 進(jìn)行 assert 操作是因?yàn)?2D 網(wǎng)絡(luò)和 3D 網(wǎng)絡(luò)的結(jié)構(gòu)(層數(shù))應(yīng)該是一樣的, ??? 所以 weights2d 和 weights3d 的長(zhǎng)度應(yīng)該是一樣的 ??? """ ?????assert len(weights2d.keys()) == len(weights3d.keys()), 'Number of parameters should be same.' ?????dict2d = {} ?????for key_id, key_name in enumerate(weights2d.keys()): ???????dict2d[key_id] = key_name ?????dict3d = {} ?????for key_id, key_name in enumerate(weights3d.keys()): ???????dict3d[key_id] = key_name ?????dict_transform = {} ?????for key_id, key_name in dict3d.items(): ???????dict_transform[dict2d[key_id]] = key_name ?????cnt = 0 ??????""" ??? 在 for 循環(huán)中一步一步地將 2D 網(wǎng)絡(luò)中每一層的參數(shù)轉(zhuǎn)移給 3D 網(wǎng)絡(luò) ??? """ ?????for key2d, key3d in dict_transform.items(): ???????if 'conv' in key3d: ?????????temporal_dim = weights3d[key3d].shape[2] ?????????temporal_2d = nd.expand_dims(weights2d[key2d].data(), axis=2) ?????????""" ?????????inflate_2d 這一行其實(shí)就是在做 bootstrapping: ?????????在知道了時(shí)間維度上的值(temporal_2d)假設(shè)為 n , ?????????先將 2D 網(wǎng)絡(luò)的參數(shù)復(fù)制粘貼 n 次, ?????????然后再進(jìn)行 rescale 操作(除以 n ), ?????????這樣就完成了 bootstrapping 的操作 ??? """ ?????????inflated_2d = nd.broadcast_to(temporal_2d, shape=[0, 0, temporal_dim, 0, 0]) / temporal_dim ?????????assert inflated_2d.shape == weights3d[key3d].shape, 'the shape of %s and %s does not match. ' % (key2d, key3d) ?????????weights3d[key3d].set_data(inflated_2d) ?????????cnt += 1 ?????????print('%s is done with shape: ' % (key3d), weights3d[key3d].shape) ???????if 'batchnorm' in key3d: ?????????assert weights2d[key2d].shape == weights3d[key3d].shape, 'the shape of %s and %s does not match. ' % (key2d, key3d) ?????????weights3d[key3d].set_data(weights2d[key2d].data()) ?????????cnt += 1 ?????????print('%s is done with shape: ' % (key3d), weights3d[key3d].shape) ???????if 'dense' in key3d: ?????????cnt += 1 ?????????print('%s is skipped with shape: ' % (key3d), weights3d[key3d].shape) ?????assert cnt == len(weights2d.keys()), 'Not all parameters have been ported, check the initialization.'
第三部分:Pacing receptive field growth in space,time and network depth
第四部分:Two 3D Streams
實(shí)驗(yàn)細(xì)節(jié)
圖3

左邊是一個(gè)標(biāo)準(zhǔn)的 Inception-V1 的結(jié)構(gòu),只不過經(jīng)過了 inflate 處理過了
當(dāng)視頻輸入進(jìn)來之后,首先經(jīng)過一個(gè) 7×7×7 的卷積層(步幅為 2 ):在 Inception-V1 或者是 Resnet中,剛開始是經(jīng)過一個(gè) 7×7 的卷積層,現(xiàn)在只不過是變成 3D 了
接下來經(jīng)過一個(gè)最大池化層:這里的最大池化層作者進(jìn)行了一些改動(dòng),原來的最大池化層是 3×3 (步幅為 2 ),如果按照文章中的 inflate 的處理方式的話,這里應(yīng)該變成 3×3×3 (步幅為 2 2 2),但是作者發(fā)現(xiàn)時(shí)間維度上,最好不要進(jìn)行這種下采樣(事實(shí)上在最近幾年的文章中,大家也都發(fā)現(xiàn)了這個(gè)問題,甚至從 SlowFast 開始,基本上在時(shí)間維度上是完全不做任何的下采樣,比如輸入是 64 幀,輸出的時(shí)候還是 64 幀,因?yàn)?64 幀對(duì)應(yīng)的時(shí)間本來就已經(jīng)很短了,可能只有 2、3 秒鐘,所以對(duì)于描述動(dòng)作來講,就不要再做下采樣了),所以在剛開始的時(shí)候做了 1×3×3 的池化操作(步幅為 1 2 2)
然后又做了兩次卷積和一次池化(這個(gè)池化操作依舊是 1×3×3 ,步幅為 1 2 2 ,在時(shí)間維度上依舊是沒有做下采樣)
在后面的幾個(gè)階段中做了幾個(gè)下采樣:



Inflated Inception-V1 中的 Inception model 如圖右邊所示,和之前的 Inception model 是完全一致的,只不過是將所有的 1×1 變成 1×1×1 了,3×3 變成了 3×3×3 ,其他的都沒有變化,整體上改動(dòng)還是非常小的
表1

表 1 中總結(jié)了之前所提到的五種形式,以及它們訓(xùn)練和測(cè)試的時(shí)候輸入輸出的大小、模型大小
模型大小
- 3D 卷積神經(jīng)網(wǎng)絡(luò)的模型參數(shù)是非常巨大的,為 80 M ,遠(yuǎn)高于其它四種形式
- 如果只是用 2D 的卷積神經(jīng)網(wǎng)絡(luò) + LSTM 或者使用雙流網(wǎng)絡(luò)的這種形式的話,網(wǎng)絡(luò)規(guī)模就會(huì)大大減小,大概只有 9 M 和 12 M(這也能夠解釋為什么在 15 、16 年的時(shí)候大家普遍使用雙流網(wǎng)絡(luò),因?yàn)樗粌H效果好,而且模型小,都能玩得動(dòng))
- Two-Stream I3D 的模型大小大概是 25 M,也不算大,所以還算是比較經(jīng)濟(jì)實(shí)惠
訓(xùn)練的輸入
- 2D 的卷積神經(jīng)網(wǎng)絡(luò) + LSTM 模型的輸入是 25 幀的視頻幀,時(shí)間跨度是 5 秒(為什么是 5 秒?因?yàn)檫@里所有視頻的幀率都是每秒 25 幀,對(duì)于LSTM 這種方式來說,作者是每隔 5 幀選擇一幀,這樣的話一秒就是 5 幀,25 幀的話就是 5 秒)
- 對(duì)于 3D 卷積神經(jīng)網(wǎng)絡(luò)來說,因?yàn)楸仨毷且B續(xù)的幀輸入,所以如果輸入是 16 幀的話,其實(shí)就不到一秒鐘(因?yàn)橐幻胧?25 幀,而這里只有 16 幀,所以大概是 0.64 秒)
- 對(duì)于雙流網(wǎng)絡(luò)來說,是先任選一幀,然后用接下來的 10 幀計(jì)算出 10 個(gè)光流圖,所以時(shí)間跨度就是 11 幀,11 幀其實(shí)是半秒都不到的,只有 0.4 秒
- 對(duì)于 3D-Fused 模型來說,使用了 5 個(gè) RGB 幀和 50 個(gè)光流圖像,所以跨度比較長(zhǎng),一秒 25 幀的話,50 個(gè)光流圖就相當(dāng)于是 2 秒
- 對(duì)于 Two-Stream I3D 模型來說,因?yàn)樽髡呤褂玫氖?64 幀和 64 個(gè)光流圖像,所以是 2.56 秒,從這個(gè)意義上來講,它的輸入最大但同時(shí)設(shè)計(jì)的時(shí)間跨度也最長(zhǎng),這對(duì)于視頻理解來講算是一個(gè)好處
測(cè)試
- 在測(cè)試的時(shí)候其實(shí)這幾種方式都差不多,因?yàn)闇y(cè)試的時(shí)候?yàn)榱吮M量公平地去比較,所以最好是將整個(gè)視頻都囊括在內(nèi)的,對(duì)于 K400 數(shù)據(jù)集來說每個(gè)視頻都是 10 秒鐘,所以這里都是 10 秒
- 至于為什么 3D 卷積網(wǎng)絡(luò)是 9.6 秒,是因?yàn)樗看蔚妮斎攵际?16 幀,對(duì)于一個(gè) 250 幀的視頻來講除不盡,所以最后只能覆蓋 240 個(gè)視頻幀,所以就是 9.6 秒
實(shí)驗(yàn)結(jié)果
表 2

- 作者先在 UCF-101 、HMDB-51 和 Kinetics 400 數(shù)據(jù)集上分別進(jìn)行了訓(xùn)練和測(cè)試,最后發(fā)現(xiàn)雙流 I3D 網(wǎng)絡(luò)是這五個(gè)結(jié)構(gòu)中表現(xiàn)最好的
表 2 中對(duì)比了五個(gè)網(wǎng)絡(luò)結(jié)構(gòu)在上述三個(gè)數(shù)據(jù)集上的效果
- 雙流 I3D 網(wǎng)絡(luò)在所有的設(shè)置下都能夠達(dá)到最好的效果
- LSTM 和 3D 卷積神經(jīng)網(wǎng)絡(luò)的效果普遍都比較差,和雙流網(wǎng)絡(luò)的結(jié)構(gòu)是完全沒法比的
- 另外,不論時(shí)間流比空間流的效果好還是壞,最后將這兩個(gè)分支用 later fusion 的方式結(jié)合起來以后,它的效果都能夠得到大幅度的提升,這就說明了光流始終對(duì)視頻理解是有幫助的,這也是為什么作者在這篇文章中即使已經(jīng)用了一個(gè) 3D 卷積神經(jīng)網(wǎng)絡(luò),但是想用光流,所以最后還是設(shè)計(jì)了一個(gè)雙流 I3D 網(wǎng)絡(luò)
表 3

- 表 3 證明如果視頻網(wǎng)絡(luò)只用 K400 數(shù)據(jù)集做預(yù)訓(xùn)練而不需要 ImageNet ,最終的效果也是不錯(cuò)的
表4

- 表 4 中說明了如何在小數(shù)據(jù)集上做微調(diào)(遷移學(xué)習(xí)):到底應(yīng)不應(yīng)該將骨干網(wǎng)絡(luò)鎖住,還是說整個(gè)網(wǎng)絡(luò)一起進(jìn)行微調(diào)
- 因?yàn)樘岢?K400 數(shù)據(jù)集主要是用來做遷移學(xué)習(xí)的,所以作者更關(guān)注遷移學(xué)習(xí)的效果,尤其是遷移到之前的 UCF-101 和 HMDB-51 上的結(jié)果
- 表 4 中的 Original 這一欄指的是在 UCF-101 或者 HMDB-51 上訓(xùn)練,然后進(jìn)行測(cè)試,完全不用 K400 數(shù)據(jù)集,從表中可以發(fā)現(xiàn)這一欄還是普遍偏低的
- 表 4 中的 Fixed 這一欄和 Full-FT 這一欄都用了 k400 數(shù)據(jù)集, Fixed 這一欄是將骨干網(wǎng)絡(luò)凍住了; Full-FT 是整個(gè) end-to-end 去訓(xùn)練,整個(gè)網(wǎng)絡(luò)的參數(shù)都可以改變。通過表中的數(shù)據(jù)可以發(fā)現(xiàn), Full-FT 的情況下的結(jié)果是最好的(這個(gè)結(jié)果其實(shí)并不奇怪,雙流網(wǎng)絡(luò)早在 2014 年的時(shí)候就已經(jīng)證明整體微調(diào)的形式效果一般是會(huì)好一些的)
表 5

- 表 5 是全文最重要的一個(gè)表格,它列出了之前的所有方法,最后證明雙流 I3D 網(wǎng)絡(luò)的效果最好,遠(yuǎn)遠(yuǎn)超過了之前最好方法的表現(xiàn)
作者將整個(gè)表格分成了三部分:
1、第一部分是雙流網(wǎng)絡(luò)
- 相比而言,雙流網(wǎng)絡(luò)的方法更加好用,之前雙流網(wǎng)絡(luò)最好的方法已經(jīng)能夠達(dá)到 94 , 70 的水平了,和 I3D 差的也不是特別遠(yuǎn)
- 之前在 15 、16 年的時(shí)候,大家有的時(shí)候還會(huì)去和傳統(tǒng)的方法去比較,或者和手工的特征相結(jié)合達(dá)到最好的效果,雙流網(wǎng)路有關(guān)的的論文基本上都匯報(bào)了和 IDT 的特征結(jié)合的效果,但是在 17 年之后其實(shí)已經(jīng)很少有人會(huì)這么做了,都是只跟深度學(xué)習(xí)的方法進(jìn)行比較,而且很少做和之前傳統(tǒng)特征的融合了
2、第二部分是 3D 卷積神經(jīng)網(wǎng)絡(luò)
- 這部分其實(shí)就 C3D 和 Deep Video
- Deep Video 其實(shí)都不能算是一個(gè)純 3D 的網(wǎng)絡(luò),也可以從側(cè)面說明,在 I3D 這篇論文出來之前,其實(shí) 3D 神經(jīng)網(wǎng)絡(luò)是一點(diǎn)都不流行的,因?yàn)椴缓糜?xùn)練,而且效果非常的差,在其他形式的結(jié)果都是 80 , 90 左右的情況下, 3D 卷積神經(jīng)網(wǎng)絡(luò)只能達(dá)到 60 , 80 左右,差的還是比較遠(yuǎn)
3、第三部分是作者自己提出來的雙流 I3D 網(wǎng)絡(luò)
- 作者先是單獨(dú)展示了一下每一個(gè)分支的結(jié)果:如果只用視頻幀的話能達(dá)到 95.6 ;如果用光流的分支的話能達(dá)到 96.7 ;如果將這兩個(gè)結(jié)合到一起的話在 UCF-101 數(shù)據(jù)集上能達(dá)到 98 ,在HMDB-51 數(shù)據(jù)集上能達(dá)到 80.7 ,效果非常好
- 為了驗(yàn)證作者之前在引言剛開始的時(shí)候所說的一個(gè)觀點(diǎn):視頻模型最好是在視頻數(shù)據(jù)集上訓(xùn)練,而且為了驗(yàn)證 K400 數(shù)據(jù)集足夠大,達(dá)到足以用來做預(yù)訓(xùn)練,所以作者在第 4 、5 、 6 組實(shí)驗(yàn)只用了 K400 數(shù)據(jù)集做預(yù)訓(xùn)練,而不用 ImageNet 預(yù)訓(xùn)練的模型。最終得到的效果其實(shí)和前三組的效果差不多:在 UCF-101 數(shù)據(jù)集上稍微低了 0.2 個(gè)點(diǎn),但是在 HMDB-51 數(shù)據(jù)集上又高了 0.2 個(gè)點(diǎn),基本不分伯仲
- 自從有了 K400 數(shù)據(jù)集, 3D 網(wǎng)絡(luò)的設(shè)計(jì)就有了更大的設(shè)計(jì)空間,因?yàn)檫@意味著可以從頭開始訓(xùn)練,而不一定非要借助于一個(gè) ImageNet 預(yù)訓(xùn)練好的模型了。所以像接下來的 R(2+1)D 網(wǎng)絡(luò)、SlowFast 模型、 I3D 模型都是可以從頭開始訓(xùn)練的,只不過訓(xùn)練的 epoch 可能會(huì)多一點(diǎn):從 80 或者 100 個(gè) epoch 可能要增加到 200 個(gè) epoch,訓(xùn)練時(shí)間會(huì)增加,但是完全不需要一個(gè) ImageNet 預(yù)訓(xùn)練模型
結(jié)論
- 作者在引言的時(shí)候提出了一個(gè)問題:遷移學(xué)習(xí)到底在視頻領(lǐng)域有沒有用?通過這篇論文中的一系列實(shí)驗(yàn),尤其是表 5 可以發(fā)現(xiàn),非常明顯,其實(shí)這種在大規(guī)模的視頻數(shù)據(jù)集上做預(yù)訓(xùn)練完之后得到的效果是非常好的
- 作者謙虛地說,他只是探索了一下在 K400 上做預(yù)訓(xùn)練 ,然后再在 UCF-101 和 HMDB 51 上去做遷移學(xué)習(xí),但是只是視頻分類,得到的結(jié)論也不一定準(zhǔn)確,如果接下來能夠進(jìn)一步驗(yàn)證在 K400 數(shù)據(jù)集上做預(yù)訓(xùn)練,然后在其他任務(wù)(比如說視頻分割、視頻物體檢測(cè)或者說光流計(jì)算)上在 K400 的預(yù)訓(xùn)練都能提供幫助的話,就能證明 K400 數(shù)據(jù)集確實(shí)很厲害,而且它的影響力也會(huì)大不少。但是作者因?yàn)闀r(shí)間和計(jì)算的關(guān)系,所以下游的任務(wù)就沒有一一去做了,最好是將這個(gè)數(shù)據(jù)集開放出來,大家可以一起進(jìn)行探索
- 除了做更多的下游任務(wù)之外,作者在模型上的探索也沒有做的非常全面,比如說沒有考慮最近比較火熱的 action tubes 或者 attention mechanism ,也為其他人提供了跟進(jìn)的方向,所以在 CVPR 18 的時(shí)候 NonLocal Network 就出來了,其實(shí)就是在 I3D 的后面使用了自注意力(Self-Attetion)而取得了更好的效果(所以當(dāng)沒有選定研究課題或者不知道接下來該做什么的時(shí)候,其實(shí)可以多看一下最近的一些論文,重點(diǎn)關(guān)注一下這些論文的未來展望或者有什么東西是還沒有完成的一般就可以了,因?yàn)檫@些方向或者說這些課題一定是非常值得做的,所以說作者才會(huì)在最后的結(jié)論部分將它加進(jìn)來,才會(huì)對(duì)它進(jìn)行展望,如果是不值得一提的課題,作者根本就不會(huì)浪費(fèi)空間來寫這些東西,這些課題可能也比較難,所以作者沒有精力,或者說也不知道該怎么做,所以將它寫到了未來工作中。但是從研究方向上來說,往往寫在結(jié)論中的未來工作都是非常好的研究方向)
論文總結(jié)
I3D 這篇論文一共有兩個(gè)貢獻(xiàn):
1、新模型——雙流 I3D
2、新數(shù)據(jù)集—— K400 數(shù)據(jù)集
之所以 I3D 這篇論文這么火,而且有這么多的人去跟進(jìn),是因?yàn)樗?strong>從兩個(gè)方面上全面解決了訓(xùn)練的問題
1、如果沒有數(shù)據(jù),如果又想用 ImageNet 上預(yù)訓(xùn)練好的模型參數(shù),可以用論文中提出來的 Inflate 的操作將 2D 的網(wǎng)絡(luò)變成 3D 的網(wǎng)絡(luò),這樣不僅不用設(shè)計(jì) 3D 網(wǎng)絡(luò),而且還可以直接用預(yù)訓(xùn)練的模型參數(shù)進(jìn)行初始化,最后微調(diào)的結(jié)果往往都會(huì)比較好
- 接下來的工作(比如 P3D 、 R(2+1)D 、 SlowFast 、 TimeSformer 、 Video Transformer 等)都有用到 Inflate 和 Bootstrapping 這兩個(gè)操作,簡(jiǎn)單但是實(shí)用
2、如果不想用已有的 2D 框架,而想要從頭開始設(shè)計(jì)一個(gè) 3D 網(wǎng)絡(luò),可以天馬行空地進(jìn)行網(wǎng)絡(luò)的設(shè)計(jì),設(shè)計(jì)完網(wǎng)絡(luò)之后,就需要一個(gè)大規(guī)模的視頻數(shù)據(jù)集來進(jìn)行網(wǎng)絡(luò)的預(yù)訓(xùn)練,這篇論文所提出的 K400 數(shù)據(jù)集足夠大,可以在這個(gè)數(shù)據(jù)集上從頭訓(xùn)練一個(gè)網(wǎng)絡(luò),而不需要依賴于 IMageNet 預(yù)訓(xùn)練的參數(shù)
- 所以說,接下來 SlowFast 、 X3D 、 MViT 這些工作都是直接從頭開始訓(xùn)練,只不過訓(xùn)練的 epoch 數(shù)多了一些(從 100 漲到了 200)
所以說 I3D 這篇論文從兩個(gè)方面將所有的用戶基本上都考慮到了,接下來如果所研究的方向是視頻分類,無論怎么做可能多多少少都要用到 K400 這個(gè)數(shù)據(jù)集或者是 Inflate 操作
自從有了 I3D 這篇論文,接下來對(duì) 3D 卷積神經(jīng)網(wǎng)絡(luò)的研究如雨后春筍一般全都冒出來了,雙流網(wǎng)絡(luò)瞬間就不香了。
- 所以說從 2017 年到 2020 年的這三年,3D 卷積神經(jīng)網(wǎng)絡(luò)基本上霸占了整個(gè)視頻理解領(lǐng)域一直到 Vision Transformer 的出現(xiàn)
- 而且因?yàn)?K400 數(shù)據(jù)集的提出,所以從 2017 年開始,基本上都會(huì)在 K400 數(shù)據(jù)集上匯報(bào)結(jié)果,一直持續(xù)到今天
所以說,I3D 是視頻分類領(lǐng)域不可不讀的一篇論文
----end----
其它參考