2014年,深度學習已經在圖像識別上打得風生水起了。
AlexNet橫空出世才兩年,卷積神經網路在ImageNet上把傳統方法按在地上摩擦,準確率一路飆升。按理說,這套打法拿到影片上應該也能橫掃一切才對,畢竟影片不就是一張張圖片疊起來的嗎。
但事實很打臉。
在動作識別這個領域,深度學習整整兩年沒能打過一個叫"密集軌跡"的老派手工特徵方法。不是差一點點,是實打實地落後。當時最好的深度學習方法在UCF-101數據集上準確率大概是65%左右,而手工特徵方法能做到87%左右,差了20多個百分點。
20個百分點是什麼概念。意味著每5個動作影片裡,深度學習就要比手工方法多認錯1個。這在圖像識別領域是不可想像的差距,AlexNet當年橫掃ImageNet靠的就是碾壓級的優勢,怎麼到了影片這裡反而成了弟弟。
這篇發表於2014年NeurIPS的論文,題目叫《Two-Stream Convolutional Networks for Action Recognition in Videos》,作者是Karen Simonyan和Andrew Zisserman,來自牛津大學。這兩個名字你可能覺得眼熟,沒錯,他們幾個月後就發表了VGGNet,同一個實驗室,同一個時間段的工作。這篇論文就是要回答一個問題:深度學習到底能不能在影片動作識別上翻身。
答案是能,而且翻身的方式很巧妙。
影片到底難在哪
先說說這件事為什麼難。
圖片識別很直觀,一張貓的照片,網路學會識別耳朵、鬍鬚、毛髮紋理這些視覺特徵就夠了。但影片不一樣,影片的核心資訊是動作,動作是隨時間展開的,一個人揮手和一個人舉手不動,單看某一幀圖像可能長得幾乎一樣,區別只在於"接下來發生了什麼"。
如果直接把影片的每一幀當成獨立圖片扔給卷積神經網路,網路確實能學到一些東西,比如場景、物體、顏色這些靜態資訊。但動作本身的動態特徵,網路學不到,因為網路看到的永遠是孤立的靜態畫面,不知道這些畫面之間發生了什麼變化。
之前也有人嘗試用3D卷積直接在時間和空間兩個維度上做卷積,想讓網路自己從原始像素里學出動態特徵。但這個思路當時效果並不好,一個關鍵原因是數據量不夠,網路很難從有限的影片數據里自己學出複雜的運動模式。這就像讓一個從沒學過物理的人,光看幾張連續照片就總結出牛頓運動定律,太難了。
光流:把運動本身畫出來
這篇論文的核心思路,是不讓網路自己去猜運動資訊,而是先把運動資訊計算出來,直接餵給網路。
這個計算出來的運動資訊叫光流。
> 光流:描述影片中每個像素點在相鄰兩幀之間移動方向和速度的一種表示方法,本質上是一張張記錄了運動向量的圖。
光流圖長什麼樣,你可以想像成給每個像素點畫一個箭頭,箭頭指向它在下一幀里移動到的方向,箭頭的長短代表移動的速度。把這些箭頭拆成水平方向和垂直方向兩個分量,就得到了兩張圖,分別記錄了每個像素的橫向運動和縱向運動。
這樣一來,影片裡的動作資訊就被提前"翻譯"成了一種網路更容易學習的形式。網路不需要自己去對比前後兩幀圖像找差異,這些差異已經被計算好擺在面前了。
這就好比你想教一個剛學英語的孩子理解一篇很難的古文,直接把古文甩給他,他大概率一頭霧水。但如果你先把古文翻譯成白話文再給他看,理解難度立刻降了一大截。光流做的就是這個翻譯工作,把"動作"這種網路不擅長直接理解的原始信號,翻譯成"運動向量"這種網路更擅長處理的結構化信號。如果不做這個翻譯,直接讓網路硬啃原始像素序列,網路就得同時兼顧學習"什麼是運動"和"這是什麼運動"兩件事,任務難度直接翻倍,這也是為什麼之前3D卷積的路子走得比較艱難。
兩條流,一條看空間一條看時間
有了光流這個工具,論文提出的架構就順理成章了,這也是這篇論文最核心的貢獻,叫雙流網路。
> 雙流網路:一種把影片資訊拆成兩路分別處理再融合結果的卷積神經網路架構,一路處理單幀靜態圖像,另一路處理光流運動圖。
具體來說,網路分成兩個完全獨立的卷積神經網路分支。
第一條叫空間流,輸入是影片裡的單獨一幀RGB圖像,負責識別畫面里的場景、物體、人物外觀這些靜態資訊。比如你要判斷影片裡的動作是"打籃球"還是"踢足球",光看一幀圖像,能不能看到籃球場、籃筐這些場景元素,就是很強的線索。
第二條叫時間流,輸入是連續多幀計算出來的光流圖,堆疊在一起形成一個多通道的輸入,負責捕捉動作本身的運動模式。比如"揮手"和"鼓掌"這兩個動作,畫面場景可能長得差不多,但手部運動的軌跡完全不同,這就得靠時間流來分辨。
兩條流各自訓練各自的卷積網路,最後把兩邊的預測結果融合起來,可以簡單加權平均,也可以再訓練一個支持向量機來組合兩邊的輸出特徵。
> SVM(支持向量機):一種經典的機器學習分類算法,這裡用來把兩條流各自輸出的特徵分數組合成最終的判斷結果。
為什麼要分成兩條獨立的網路而不是揉在一起訓練一個大網路?這背後是研究者的一個判斷,靜態外觀資訊和動態運動資訊,它們的統計規律差別很大,一個是關於"像素顏色紋理怎麼分布",一個是關於"像素怎麼隨時間移動",硬塞進一個網路里讓它自己去分辨這兩種截然不同的模式,不如乾脆分開,各自用最適合的網路結構和數據去學。
這個設計思路你可以類比成一個團隊解決案子。偵探需要同時觀察現場留下的物證(相當於空間流看到的場景線索)和監控錄像里的行動軌跡(相當於時間流看到的運動線索),這兩種線索的性質完全不同,一個是靜態的物理證據,一個是動態的行為模式。如果強迫一個偵探同時用同一套思維方式去處理這兩類完全不同的資訊,效果往往打折扣,更好的做法是讓擅長看物證的專家和擅長看錄像的專家分別分析,最後再碰頭匯總結論。雙流網路的兩個分支就是這兩位專家,分別專精,最後融合。
如果只用空間流會發生什麼?論文裡做了對比實驗,只用空間流,在UCF-101上的準確率是72.6%。加上時間流融合之後,準確率提升到88.0%,整整多了15個百分點。這說明動作識別里光看畫面長什麼樣是遠遠不夠的,運動資訊本身攜帶的判別力非常強,甚至比靜態外觀更關鍵。

論文裡的架構圖畫得很清楚,影片輸入之後被拆成兩路,上面一路是單幀圖像進空間流卷積網路,下面一路是多幀光流疊加進時間流卷積網路,兩邊獨立跑完各自的卷積層和全連接層,輸出的分類分數在最後做融合,給出最終的動作類別判斷。
多幀光流疊加:給時間流更長的記憶
時間流具體怎麼處理光流數據,這裡還有一個值得展開的細節設計。
單獨一幀的光流資訊其實很有限,只能反映相鄰兩幀之間瞬間的運動。但一個完整的動作往往需要更長的時間窗口才能看清楚,比如"起跳"這個動作,如果你只看某個瞬間的運動向量,可能看起來只是"往上移動一點",很難和別的動作區分開。
論文的解法是把連續多幀(論文裡用的是10幀)的光流圖堆疊在一起,作為時間流網路的輸入,讓網路能看到一個更長的運動軌跡片段,而不是孤立的一瞬間。
這就好比看一段慢動作回放來判斷裁判該不該判罰,如果只給你一張截圖,你很難判斷球員是不是真的犯規了,但給你連續十幾張連拍照片拼在一起看整個過程,動作軌跡就清楚多了。堆疊多幀光流,本質上就是給網路多看幾張"連拍照片",讓它能捕捉到一個動作從開始到結束的完整運動模式,而不是被單一瞬間的資訊誤導。
論文還比較了兩種光流的表示方式,一種是常規的光流,另一種叫軌跡疊加光流,是把光流沿著物體運動軌跡重新採樣對齊後再疊加,理論上能更好地消除相機自身晃動帶來的干擾。實驗發現兩種方式效果相差不大,常規光流已經夠用,這也說明了論文方法的魯棒性,不需要過分複雜的預處理就能拿到不錯的效果。
數據不夠怎麼辦:多任務訓練
深度學習一個老生常談的問題是數據饑渴,越複雜的網路越需要海量數據才能訓好,而當時能用的影片動作識別數據集規模都不大,比如UCF-101隻有101類動作,幾千段影片,跟ImageNet動輒百萬級的圖片量比起來差得遠。
論文用了一個技巧來緩解這個問題,叫多任務學習。
> 多任務學習:讓同一個網路同時在多個相關但不完全相同的數據集或任務上訓練,共享底層特徵,分別輸出對應任務的結果。
具體做法是把網路最後的分類層拆成兩個分支,一個對應UCF-101的101個類別,一個對應另一個數據集HMDB-51的51個類別,底層的卷積特徵是共享的,兩個數據集的樣本混在一起訓練,反向傳播的時候各自只更新自己對應的輸出分支和共享的底層參數。
這麼做的好處是相當於把兩個小數據集拼成了一個更大的訓練資源,底層的通用運動特徵可以從兩份數據里一起學,雖然兩個數據集的類別定義不完全一樣,但都是關於人體動作的影片,共享的底層規律是相通的。
這有點像一個學生同時準備兩門相關的考試,比如物理和數學,雖然考試內容不完全重疊,但很多基礎的邏輯推理能力、計算能力是通用的,同時準備反而能讓這些通用能力練得更紮實,不會因為單科題量太少而練不出手感。多任務訓練之後,論文報告在HMDB-51上準確率從54.6%左右提升到59.4%,提升幅度相當可觀,證明了這個"資源拼湊"的思路確實管用。
最終成績單
那麼這套雙流網路最後打得怎麼樣。
在UCF-101數據集上,雙流網路融合後的準確率達到88.0%,這個數字終於追平甚至超過了當時最好的手工特徵方法(比如密集軌跡特徵約87.9%)。在HMDB-51上,準確率是59.4%,也是當時具有競爭力的水平。
| 方法 | UCF-101準確率 | HMDB-51準確率 |
|---|---|---|
| 僅空間流 | 72.6% | 40.5% |
| 僅時間流 | 81.0% | 54.6% |
| **雙流融合(SVM融合)** | **88.0%** | **59.4%** |
| 當時最好的手工特徵方法 | 約87.9% | 約57%左右 |
這是深度學習第一次在影片動作識別這個具體任務上,打平甚至反超手工特徵方法。在2014年,這句話的分量不亞於兩年前AlexNet在圖像識別上的橫空出世。區別是AlexNet那次贏得乾脆漂亮,雙流網路這次贏得來之不易,足足晚了兩年,而且靠的不是純粹的端到端學習,是巧妙地把光流這個手工設計的運動表示嵌進了深度學習的框架里。
這個"不完全端到端"的特點後來也成了爭議點和改進方向。
後來發生的事
這篇論文之後,雙流網路成了影片動作識別領域接下來好幾年的標準範式,大量後續工作都是在這個骨架上做改進。
2016年,Feichtenhofer等人發表了論文,提出了更好的雙流融合方式,讓空間流和時間流在網路中間層就開始交互融合,而不是等到最後才融合分類分數,這個改進讓準確率進一步提升。
2017年,Carreira和Zisserman(沒錯,還是Zisserman)發表了I3D(Inflated 3D ConvNets)論文,把雙流的思路和3D卷積結合起來,同時提出了大規模影片數據集Kinetics,用海量數據直接訓練3D卷積網路,某種程度上驗證了雙流網路當年繞過的那個數據不足問題,只要數據量真的上去了,3D卷積也能學出很好的時空特徵,不一定非要依賴手工計算的光流。這也從另一個角度說明了雙流網路當年的設計選擇,是那個數據稀缺時代下的一個聰明妥協。
這兩篇後續工作都在用不同方式,嘗試解決雙流網路本身的一個軟肋,光流的計算本身很耗時,而且是獨立於分類任務之外單獨算出來的,沒有真正做到端到端優化。這條改進的線一直延續到後來的SlowFast網路等更新的架構設計里。
寫在後面
讀這篇論文最觸動我的地方,是它沒有執著於"深度學習必須端到端"這個信念。
2014年那會兒,端到端學習正是深度學習最引以為傲的招牌,不需要手工設計特徵,讓網路自己從原始數據里學一切。但Simonyan和Zisserman很務實地承認,在數據不夠的情況下,硬要端到端反而學不好,不如把光流這個前人已經研究得很成熟的手工工具直接嵌進網路里用。
這種"該妥協就妥協"的態度,反而換來了當時最好的結果。這讓我想起很多工程問題里的一個共同規律,理論上最優雅的方案,不一定是當下條件最可行的方案。雙流網路能被後來的I3D等純數據驅動方法部分取代,恰恰印證了這一點,方法本身沒有絕對的對錯,只有匹配不匹配當下的資源約束。
如果現在的數據和算力放到2014年,雙流網路這個中間方案還會被提出來嗎?這個問題留給你想。
Q&A
Q1:雙流網路是什麼?
A:雙流網路是2014年Simonyan和Zisserman提出的一種影片動作識別方法,把影片資訊拆成空間流和時間流兩條獨立的卷積神經網路分支分別處理,空間流處理單幀靜態圖像識別場景外觀,時間流處理多幀堆疊的光流圖捕捉運動模式,最後融合兩邊的預測結果。
Q2:雙流網路里的光流有什麼用?
A:光流是描述影片中每個像素點在相鄰幀之間運動方向和速度的表示方法,相當於提前把動作資訊翻譯成網路更容易學習的運動向量形式,讓時間流網路不需要自己從原始像素里摸索運動規律,直接學習已經計算好的運動資訊,大大降低了學習難度。
Q3:雙流網路和後來的I3D網路有什麼關係?
A:I3D是2017年Carreira和Zisserman提出的後續工作,把雙流思路和3D卷積結合,並配合大規模Kinetics數據集直接訓練,某種程度上驗證了雙流網路當年靠光流繞開數據不足問題的判斷,一旦數據量足夠大,3D卷積也能自己學出好的時空特徵。






