2014 年,深度學習已經(jīng)在圖像識別上打得對手找不到北。AlexNet 橫空出世兩年后,卷積網(wǎng)絡幾乎統(tǒng)治了靜態(tài)圖片的分類比賽,識別一只貓、一輛車、一棟房子,交給深度網(wǎng)絡基本沒有懸念。
但如果給你的不是一張照片,而是一段視頻呢。一個人從椅子上站起來,一個人揮手打網(wǎng)球,一個人跳進泳池,這些動作光看一幀畫面根本看不出來。你需要看到畫面怎么隨時間變化。
(資料圖)
奇怪的事情發(fā)生了。在這個問題上,深度學習居然打不過一種叫做"密集軌跡"的手工設計方法。
密集軌跡*:一種傳統(tǒng)的視頻動作識別方法,通過跟蹤視頻中密集分布的點隨時間移動的軌跡,并計算軌跡周圍的手工設計特征來判斷動作類別。
具體差多少?在當時最具挑戰(zhàn)性的 UCF-101 數(shù)據(jù)集上,密集軌跡這類手工特征方法能做到 87% 左右的準確率,而已有的深度學習嘗試,比如直接把 3D 卷積網(wǎng)絡懟上去的方法,只能做到 65% 上下。整整 20 個百分點的差距,意味著什么?意味著每 5 個動作里,深度學習就要比手工方法多認錯 1 個。這在圖像識別領域是不可想象的差距,AlexNet 當年也沒輸給傳統(tǒng)方法這么多。
這篇論文的兩位作者,Karen Simonyan 和 Andrew Zisserman,來自牛津大學的 VGG 組。沒錯,就是那個幾個月后發(fā)表了 VGGNet、把圖像分類刷到新高度的團隊。這兩篇論文幾乎是同期的工作,一個在攻克圖片,一個在攻克視頻,而攻克視頻這一仗,打得比想象中艱難。
他們要回答一個問題:為什么深度學習在圖片上這么強,到了視頻上反而不靈了。
問題出在哪:網(wǎng)絡學不好"動"這件事
先說說當時的深度學習方案是怎么做視頻識別的。最直接的想法是把 2D 卷積網(wǎng)絡擴展成 3D,讓卷積核不僅在圖像的長寬方向滑動,還在時間維度上滑動,指望網(wǎng)絡自己從連續(xù)幀里學出運動的規(guī)律。
這個想法聽起來很合理,但實際效果很差。原因也不難理解。圖像識別的成功建立在一個基礎上,那就是有海量標注數(shù)據(jù),ImageNet 有超過一百萬張標注圖片。而視頻數(shù)據(jù)集小得多,動作識別常用的數(shù)據(jù)集只有幾千到一萬多個視頻片段。讓一個本來就參數(shù)龐大的 3D 卷積網(wǎng)絡,從這么少的數(shù)據(jù)里,自己學會什么是"運動",這相當于要求一個學生只看了幾頁教材就要總結出整個學科的規(guī)律,學不好是必然的。
Simonyan 和 Zisserman 的思路是,既然網(wǎng)絡自己學不好運動信息,那就不要讓它自己學,直接把運動信息喂給它。
這就引出了整篇論文最核心的設計,光流。
光流*:描述圖像中每個像素點在連續(xù)兩幀之間的運動方向和速度的一種表示方法,用一張"運動圖"來記錄畫面里哪里在往哪個方向移動、移動了多快。
光流不是什么新東西,計算機視覺里研究了幾十年,專門用來描述畫面里的運動。它把每一幀圖像里每個像素的位移,編碼成一張類似圖片的東西,橫向位移和縱向位移各占一個通道。這樣一來,運動信息不再需要網(wǎng)絡自己從像素變化里費力推測,而是被預先計算好,直接擺在網(wǎng)絡面前。
這里就要問一個問題了,如果不用光流,網(wǎng)絡能不能自己學到同等質(zhì)量的運動信息?論文用實驗回答了這個問題,答案是不能,或者說,非常難,需要多得多的數(shù)據(jù)和更復雜的結構才能勉強逼近。這也是為什么在數(shù)據(jù)有限的情況下,把光流這種領域知識直接注入網(wǎng)絡,比讓網(wǎng)絡從零開始摸索要劃算得多。
雙流架構:把一個問題拆成兩個網(wǎng)絡來解決
既然運動信息要單獨處理,那靜態(tài)的外觀信息呢?比如畫面里有沒有網(wǎng)球拍,有沒有游泳池,這些信息其實也很重要,一個人揮拍的動作旁邊有球拍,這個先驗信息本身就是很強的線索。
于是論文提出了雙流卷積網(wǎng)絡這個核心架構。
雙流卷積網(wǎng)絡*:一種把視頻動作識別拆分成兩個獨立卷積網(wǎng)絡的架構,一個網(wǎng)絡專門處理單幀靜態(tài)畫面(叫空間流),另一個網(wǎng)絡專門處理連續(xù)幀之間的光流場(叫時間流),兩個網(wǎng)絡最后的判斷結果做融合,得出最終的動作類別。
![論文中的雙流架構示意圖,展示了空間流網(wǎng)絡接收單幀RGB圖像,時間流網(wǎng)絡接收多幀光流疊加,兩條支路分別輸出softmax分數(shù)后融合]
空間流很好理解,輸入就是視頻里隨便抽出來的一幀圖像,網(wǎng)絡結構和普通的圖像分類網(wǎng)絡差不多,負責判斷畫面里有什么物體、什么場景。
時間流是這篇論文的重點,輸入不是圖像,而是連續(xù)多幀計算出來的光流場,堆疊在一起,形成一個多通道的輸入,論文里用的是連續(xù) 10 幀的光流,橫向和縱向各一個通道,一共 20 個通道堆在一起喂給網(wǎng)絡。這個網(wǎng)絡專門學習"動作模式",比如揮拍這個動作在光流場上呈現(xiàn)出什么樣的運動軌跡。
兩個網(wǎng)絡訓練好之后,分別對同一個動作片段給出一個預測分數(shù),最后把兩個分數(shù)加權融合,誰給出的置信度更高,權重就更大一些,融合方式論文里試了簡單平均和用支持向量機學習權重兩種,后者效果更好一點。
這個設計其實映射了人類大腦處理視覺信息的一個已知事實,神經(jīng)科學上早就發(fā)現(xiàn),人的大腦視覺皮層里存在兩條相對獨立的通路,一條處理"這是什么"(物體識別),一條處理"這在往哪動"(運動感知)。這兩位作者顯然是借鑒了這個思路,讓機器也用兩套"眼睛"分別看靜止的和動態(tài)的信息,而不是塞進一個網(wǎng)絡里讓它自己去分辨。
這里可以做一個類比。想象你在看一場足球比賽的回放,如果只給你一張定格的畫面,你可能能看出這是個球場,有球員在場上,但你猜不出下一秒球往哪兒飛,誰要射門了。如果只給你一段沒有畫面內(nèi)容、純粹標注了每個點往哪個方向移動的運動軌跡圖,你能看出有東西在快速移動,但你分不清到底是球還是人。你必須同時結合"這是什么"和"它怎么動",才能準確判斷出這是一次射門還是一次傳球。如果只用一條通路去處理,等于讓你蒙著眼睛只憑運動軌跡猜比賽內(nèi)容,或者盯著一張靜態(tài)照片猜下一秒的動作,兩種情況下你都會經(jīng)常猜錯。雙流網(wǎng)絡的設計,就是不讓機器也陷入這種信息缺失的困境。
時間流網(wǎng)絡怎么設計:光流該怎么堆疊
時間流網(wǎng)絡具體怎么處理光流數(shù)據(jù),這里面還有幾個值得展開的設計細節(jié)。
第一個問題是光流怎么計算。論文用的是傳統(tǒng)的光流算法,不是深度學習方法(當時深度學習做光流估計還不成熟),計算出來的光流場每個像素點有橫向和縱向兩個分量。為了讓網(wǎng)絡看到一段時間內(nèi)的運動趨勢,而不是單幀之間的瞬時運動,論文把連續(xù) 10 幀的光流疊在一起,變成一個 20 通道的輸入(10 幀乘以橫縱兩個方向)。
第二個問題是要不要考慮攝像機本身的移動。很多視頻是手持拍攝或者運鏡的,整個畫面都會有一個整體的位移,這個位移和動作本身無關,是噪聲。論文嘗試了減去這個整體運動的版本,效果確實有提升,說明網(wǎng)絡確實會被這種無關的全局運動干擾,這也提示了一個更深層的問題,光流這種表示雖然比原始像素更貼近"運動"的本質(zhì),但它依然不是純粹的,里面混雜了背景運動和物體運動,需要額外處理才能把真正有用的信號提取出來。
第三個問題是怎么應對數(shù)據(jù)量不足。前面說過,視頻數(shù)據(jù)集比圖像數(shù)據(jù)集小得多,UCF-101 一共只有一萬多個片段。論文采用了一個巧妙的辦法,用兩個數(shù)據(jù)集聯(lián)合訓練,把動作類別少但樣本相對充足的數(shù)據(jù)集和目標數(shù)據(jù)集放在一起訓練,共享網(wǎng)絡的大部分參數(shù),只在最后分類層做區(qū)分。這個做法某種程度上是數(shù)據(jù)不夠,借別處的數(shù)據(jù)來湊,類似于一個學生主科的練習題不夠,就去借用相近科目的習題來鞏固基礎知識,雖然題目不完全對口,但鍛煉的底層能力是相通的。如果不這么做,單獨在小數(shù)據(jù)集上訓練,過擬合會非常嚴重,網(wǎng)絡記住的是訓練集里的個別樣本特征,而不是動作本身的規(guī)律。
結果:深度學習終于贏了一次
說了這么多設計,數(shù)據(jù)說話才是硬道理。論文在兩個標準數(shù)據(jù)集上做了測試,UCF-101 和 HMDB-51,這是當時動作識別領域最常用的兩個基準。
| 方法 | UCF-101 準確率 | HMDB-51 準確率 |
| 只用空間流網(wǎng)絡 | 72.6% | 40.5% |
| 只用時間流網(wǎng)絡 | 81.0% | 54.6% |
| 雙流網(wǎng)絡融合 | **88.0%** | **59.4%** |
| 同期最好的手工特征方法 | 87.9% | 57.2% |
先看只用空間流會怎樣。準確率只有 72.6%,比雙流融合的 88% 低了 15 個百分點還多。這說明單看靜態(tài)畫面確實丟失了大量信息,一個揮拍的動作,如果只看一幀,網(wǎng)絡很容易和別的手臂動作搞混。
再看只用時間流。81% 已經(jīng)比空間流高出一大截,這本身就很說明問題,運動信息對判斷動作類別的重要性,可能超過靜態(tài)外觀信息。但即便只看運動信息,也比不上兩者融合的效果。
融合之后的 88%,第一次讓深度學習方法在 UCF-101 上追平甚至略微超過了手工設計的密集軌跡類方法。這是一個歷史節(jié)點,深度學習在視頻動作識別這個子領域,第一次不再是被手工特征按在地上打的那一方。這句話放在 2014 年,分量不亞于兩年前 AlexNet 在圖像識別上掀起的那場革命,只是這次戰(zhàn)場換到了視頻。
值得多說一句的是 HMDB-51 上的結果,雙流網(wǎng)絡拿到 59.4%,超過手工方法的 57.2%,差距不算大,但這個數(shù)據(jù)集樣本量更小、動作更難區(qū)分,深度學習能在這種小樣本條件下也追上甚至反超,說明雙流架構確實抓住了問題的本質(zhì),而不是靠堆數(shù)據(jù)蠻力取勝。
這篇論文之后:光流思路被繼續(xù)放大
雙流網(wǎng)絡提出之后,光流加靜態(tài)畫面的這個思路成了后續(xù)很多工作的起點。
3 年后,F(xiàn)eichtenhofer 等人在 2017 年提出了時空融合網(wǎng)絡,把雙流網(wǎng)絡里兩個獨立訓練、最后簡單融合的做法改成了更早期就開始交互融合,讓空間流和時間流在網(wǎng)絡的中間層就開始信息交換,而不是等到最后一步才合并結果,這個改進進一步提升了準確率,也證明了兩條流之間不應該是完全割裂的,中間層的信息共享能帶來額外收益。
同樣在 2017 年前后,Carreira 和 Zisserman(還是同一位作者)提出了 I3D 網(wǎng)絡,這個工作干脆放棄了單獨計算光流的思路,而是把 2D 卷積網(wǎng)絡直接膨脹成 3D 卷積網(wǎng)絡,讓網(wǎng)絡在一個更大規(guī)模的視頻數(shù)據(jù)集 Kinetics 上直接學習時空特征,某種程度上是回到了最初"讓網(wǎng)絡自己學運動"的思路,但這次因為有了 Kinetics 這種規(guī)模大得多的數(shù)據(jù)集做支撐,3D 卷積終于跑贏了雙流網(wǎng)絡。這個轉折也挺耐人尋味,雙流網(wǎng)絡當年之所以要引入光流這種手工先驗,本質(zhì)上是因為數(shù)據(jù)不夠,一旦數(shù)據(jù)規(guī)模上來了,先驗知識的必要性反而下降了,這某種程度上印證了深度學習領域一直存在的一個規(guī)律,數(shù)據(jù)量足夠大的時候,很多手工設計的技巧會顯得沒那么關鍵。
再往后,各種基于雙流思路的變種持續(xù)涌現(xiàn),光流這個概念也被質(zhì)疑過是否必要,一些研究開始嘗試用更輕量、計算更快的運動表示方式來替代傳統(tǒng)光流,因為計算光流本身是很耗時的一步,會拖慢整個系統(tǒng)的實際部署速度。這也是雙流網(wǎng)絡留下的一個明顯短板,光流計算這一步?jīng)]法端到端訓練,必須先用傳統(tǒng)算法算好光流再喂給網(wǎng)絡,整個流程不是一體化的,訓練和部署都因此變得更麻煩。
寫在后面
讀這篇論文最讓我意外的一點,是深度學習在視頻領域曾經(jīng)輸?shù)眠@么徹底。習慣了深度學習一路碾壓的敘事,很容易忘記它也有過被傳統(tǒng)方法按住打的階段,而且不是輸一點點,是輸了 20 個百分點的量級。
另一個值得琢磨的地方是,這篇論文解決問題的方式不是"設計一個更大更深的網(wǎng)絡硬train一發(fā)",而是先想清楚問題的結構,運動信息和外觀信息本質(zhì)上是兩類不同的東西,再設計架構去匹配這個結構。這種"先理解問題再設計模型"的思路,比單純堆參數(shù)堆算力更值得學習。
論文里還有一個小細節(jié)挺有意思,融合空間流和時間流的時候,用支持向量機去學融合權重,效果比簡單平均要好,這說明"兩個信息源誰更可信"這件事本身也是可以學出來的,不需要人為拍死一個固定比例。這個小設計后來被很多多模態(tài)融合的工作繼承了下來。
Q&A
Q1:雙流卷積網(wǎng)絡是什么?
A:雙流卷積網(wǎng)絡是牛津大學團隊在2014年提出的視頻動作識別方法,把識別任務拆成兩個獨立的卷積網(wǎng)絡,一個處理單幀靜態(tài)畫面判斷場景和物體,另一個處理連續(xù)幀的光流場判斷運動模式,兩者結果融合得出最終動作類別,在UCF-101上準確率達到88%。
Q2:雙流卷積網(wǎng)絡為什么要用光流而不是讓網(wǎng)絡自己學運動信息?
A:因為當時視頻數(shù)據(jù)集規(guī)模太小,只有幾千到一萬多個樣本,網(wǎng)絡很難僅從原始像素變化中自己學出運動規(guī)律,直接把傳統(tǒng)算法計算好的光流場喂給網(wǎng)絡,相當于把運動信息預先處理好,大幅降低了網(wǎng)絡的學習難度。
Q3:雙流卷積網(wǎng)絡后來被哪些工作超越了?
A:2017年前后,時空融合網(wǎng)絡讓兩條流在中間層就開始交互,而不是等到最后才融合結果;同期的I3D網(wǎng)絡則用更大規(guī)模的Kinetics數(shù)據(jù)集直接訓練3D卷積網(wǎng)絡,跳過了光流計算這一步,最終在準確率上反超了雙流網(wǎng)絡。