2014年之前,如果你去問一個做影片動作識別的研究者:深度學習能不能用在影片上,大概會得到一個礧尬的笑。
不是因為沒人試過。是因為試了,效果不好。
當時最強的影片識別方法,用的是一種叫做密集軌跡的手工特徵。
**密集軌跡**:一種手工設計的影片特徵提取方法,通過追蹤影片畫面中密集分布的點在時間上的運動軌跡,並統計軌跡周圍的圖像和運動資訊來描述動作。
在權威的UCF-101動作識別數據集上,這類手工方法能做到接近88%的準確率。而當時人們嘗試直接把圖像分類用的卷積網路搬到影片上,效果只有可憐的三四十個百分點,差了一大截。
這就好比一個剛學會下棋規則的新手,直接去挑戰下了三十年棋的老棋手。規則一樣,但經驗和直覺完全不在一個量級上。深度學習在圖片識別上已經把傳統方法打得潰不成軍,AlexNet 2012年的成功讓整個學界沸騰,可這套辦法搬到影片上卻完全失靈。這中間到底發生了什麼?
這就是Karen Simonyan和Andrew Zisserman在2014年那篇論文要回答的問題。論文題目叫《Two-Stream Convolutional Networks for Action Recognition in Videos》,中文可以譯作《用於影片動作識別的雙流卷積網路》。這篇論文最後做到了什麼程度?在UCF-101上把深度學習的準確率從三四十分直接拉到88%,第一次追平甚至超過了手工特徵的方法。
這是深度學習在影片動作識別領域第一次真正打贏手工特徵。在2014年,這句話的分量不亞於兩年前AlexNet在圖像識別上引發的震動。
順便說一句,Simonyan和Zisserman當時都在牛津大學同一個視覺幾何組(VGG組),他們幾個月後又合作發表了VGGNet,那篇論文後來成為深度學習歷史上最常被引用的圖像分類網路之一。這兩篇論文幾乎是同期完成的工作,一篇解決靜態圖片,一篇解決動態影片,出自同一個團隊的手。
問題到底難在哪:影片比圖片多了什麼
要理解這篇論文的巧妙之處,得先搞清楚為什麼直接把圖像識別的網路搬到影片上會失敗。
圖片識別網路學的是什麼?是空間結構。一張貓的照片,網路學會識別毛髮的紋理、耳朵的輪廓、眼睛的位置,這些都是空間資訊,在一幀畫面里就能看全。
但動作是什麼?動作是隨時間展開的東西。你看一張照片,靜止的一幀,很難判斷這個人是在揮手還是在擋陽光,是在跳躍還是剛摔倒。真正定義"動作"這個概念的,是畫面隨時間的變化,是運動本身。
早期直接把2D卷積網路套在影片幀序列上,或者簡單地把很多幀堆疊起來輸入網路,本質上還是在讓網路學空間紋理,網路並沒有被專門設計去捕捉運動資訊。這就像讓一個只會看照片的人去評價一段舞蹈,他能說出舞者穿了什麼衣服、站在什麼背景前,但很難判斷舞蹈動作本身是流暢還是笨拙的,因為流暢和笨拙這些資訊藏在幀與幀之間的變化里,不在單張照片裡。
那怎麼才能讓網路"看到"運動呢?
核心思路:把運動資訊直接餵給網路
Simonyan和Zisserman想到的辦法,說出來其實很樸素:既然運動資訊藏在幀與幀的變化里,那就別讓網路自己去猜這個變化,直接算出來,餵給它就行。
這個"算出來的運動",用的是一種叫光流的技術。
**光流**:描述影片中每個像素點從一幀到下一幀移動方向和速度的向量場,可以理解為給畫面里每個點都畫一個箭頭,箭頭指向它接下來會往哪兒動、動多快。
於是論文提出了一個叫雙流網路的架構,這也是整篇論文最核心的設計。
**雙流網路**:由兩個獨立的卷積神經網路組成,一個專門處理原始的影片幀畫面(叫空間流),另一個專門處理算出來的光流場(叫時間流),最後把兩邊的判斷結果融合起來做最終決策。
空間流網路吃的輸入就是普通的RGB圖片,網路架構和當時做圖像分類的網路幾乎一樣,學的是畫面里的物體、場景、人物姿態這些靜態資訊。比如看到游泳池,就能猜到這個人可能在游泳;看到球拍,就能猜到可能在打網球。這部分資訊其實很多時候光靠一張靜止畫面就能提供不少線索。
時間流網路吃的輸入不是圖片,而是提前算好的光流場,通常是連續十幀左右計算出來的運動向量堆疊在一起。這部分網路專門學習運動模式,比如揮拍的弧線軌跡、走路和跑步在腿部擺動頻率上的區別。
這兩路網路各自獨立訓練,各自輸出一個針對動作類別的預測分數,最後用一個簡單的加權平均把兩邊的分數融合起來,得到最終結果。
為什麼要分成兩路,而不是想辦法用一個網路同時學空間和時間資訊?
原因其實很實際。空間資訊和運動資訊在統計規律上差別很大,一個是關於物體外觀和場景語義的,一個是關於像素位移的幾何量,硬塞進同一個網路里學,網路很難兼顧好兩頭,尤其是在當時訓練數據還很有限的情況下(UCF-101一共才101類動作,幾千個影片片段,對深度網路來說數據量並不算大)。讓兩個網路各自專注一件事,學習目標更清晰,也更容易訓練好。
這有點像團隊分工。如果讓一個人同時負責設計產品外觀和調試後台算法,這個人可能兩頭都做得不夠精。但如果拆成兩個人,一個專門摳界面細節,一個專門摳性能優化,各自做深做透,最後拼在一起往往效果更好。如果不拆分,讓一個網路同時扛兩種完全不同性質的資訊,在當時數據量有限、算力有限的條件下,網路很可能顧此失彼,這也正是之前直接套用圖像網路到影片上會失敗的原因之一。
時間流網路:光流怎麼被餵進卷積網路
時間流這一部分的設計還有些值得展開的細節。
首先,光流不是算一幀和下一幀之間的一個箭頭場就完了,論文裡是把連續多幀(論文實驗裡用到10幀)的光流場堆疊在一起作為輸入,這樣網路能看到的不是某一個瞬間的運動,而是一小段時間窗口內運動的演變過程。這就好比你要判斷一個人是在揮手還是僅僅是手抖了一下,看一瞬間的動作很難分辨,但看連續十幾幀,趨勢就很清楚了。
論文還測試了兩種光流表示方式。一種是常規的光流,直接描述像素怎麼移動;另一種叫"軌跡堆疊光流",是沿著運動軌跡去採樣光流值,而不是簡單地在固定像素位置堆疊。實驗發現兩種方式效果相差不大,說明網路對這種細節上的差異並不敏感,只要運動資訊被合理編碼進輸入里,網路就能學出來。
另外論文還處理了一個實際問題:相機本身的運動。如果拍攝的人在移動鏡頭,那麼整個畫面里所有像素都會有一個整體的位移,這個位移和被拍攝對象真正的動作沒關係,是噪聲。論文裡做了處理,減去相機運動帶來的平均位移,讓光流更純粹地反映對象自身的運動。這一步聽起來細枝末節,但對準確率有實際幫助,說明魔鬼真的在細節里。
數據不夠怎麼辦:借用圖像識別的數據
這篇論文還有一個不那麼起眼但很關鍵的貢獻,就是怎麼解決訓練數據不足的問題。
當時的影片動作數據集都很小,UCF-101一共只有大約13000個影片片段。相比圖像識別領域動輒百萬張圖片的ImageNet,這個規模差了兩個數量級。深度網路是數據饑渴的模型,數據不夠,很容易過擬合,學出來的東西泛化能力差。
**過擬合**:模型在訓練數據上表現很好,但因為記住了太多訓練集特有的細節而沒有學到普遍規律,導致在沒見過的新數據上表現變差。
論文對空間流網路採取的策略是,用在ImageNet上預訓練好的網路權重做初始化,然後在動作識別數據集上做微調。這個思路現在看是深度學習的標準操作,但在2014年,把圖像分類學到的視覺特徵直接遷移到影片動作識別任務上,還是一個相對新鮮且被驗證有效的做法。
對於時間流網路,因為光流數據和圖像數據長得完全不一樣,沒法直接借用ImageNet的預訓練權重,論文就用了多個數據集聯合訓練的辦法,把不同來源的動作影片數據放在一起訓練,儘量把能用的數據都用上,緩解數據不足的問題。
這就像學一門新語言。如果你已經精通一門語言,學第二門語言時會天然藉助第一門語言裡學到的語法直覺和邏輯框架,起步會快很多。但如果這門新語言用的是完全不同的書寫系統,比如從字母語言換成象形文字,你之前學的拼讀經驗就用不上了,只能靠儘量多接觸新語言本身的素材來慢慢積累語感。空間流是能借力的那門語言,時間流是幾乎要從頭學的那門,論文分別用了不同的策略去應對,這個區分本身也說明作者對問題的理解相當細緻。
實驗結果:拆開看每一塊的貢獻
論文在三個數據集上做了實驗:UCF-101、HMDB-51,還有一個更早的動作識別數據集。核心結果集中在UCF-101上。
下面這張表格是這篇論文最關鍵的數字,展示了不同配置下的準確率對比:
| 方法配置 | UCF-101準確率 |
|---|---|
| 僅空間流網路 | 72.6% |
| 僅時間流網路 | 81.0% |
| 雙流網路融合(加權平均) | **88.0%** |
| 當時最好的手工特徵方法 | 87.9% |
這組數字資訊量很大,值得一條一條說。
先看僅用空間流會怎樣。準確率是72.6%,比雙流融合掉了15個百分點還多。這說明單靠畫面里的物體和場景資訊,確實能猜出不少動作類別,但天花板很明顯,因為很多動作光靠背景和物體是分不出來的,比如各種不同的舞蹈動作,背景可能都差不多,物體也可能都沒有,區分點全在動作本身的運動模式上。
再看僅用時間流。準確率反而比空間流更高,達到81.0%。這個結果在當時其實有點反直覺,因為傳統認知里運動資訊一般被認為是輔助性的,主要資訊應該來自畫面內容。但實驗證明,對於"動作識別"這個具體任務,運動本身包含的判別資訊比靜態畫面更豐富,這也算是從數據角度佐證了這篇論文最初的假設:想做好動作識別,必須讓網路專門去看運動,而不是指望它從靜態畫面里隱式地猜出運動。
最後看兩者融合的結果,88.0%,比單獨任何一路都高出至少7個百分點,超過了空間流加時間流各自的表現之和的一部分,說明兩路網路學到的資訊確實有互補性,不是簡單的重複。空間流補充了時間流缺失的場景語義資訊,時間流補充了空間流缺失的運動動態資訊,兩者拼起來才是完整的畫面。
而這個88.0%,終於追平並小幅超過了當時最好的手工特徵方法(87.9%)。差距看起來只有0.1個百分點,似乎不起眼,但意義完全不同:這是深度學習方法第一次不需要依賴任何手工設計的特徵工程,單純靠端到端學習就打平了幾十年積累下來的手工方法。這個"平"來得比看起來重要得多。
如果沒有雙流設計,只靠深度學習里當時常見的單流網路硬啃影片,前面提到過,準確率只有三四十分,離88分差了一倍還多。雙流網路之所以重要,不是因為它多用了一路網路這麼簡單,而是因為它精準地識別出了影片這種數據形式里最容易被忽略、又最關鍵的一部分資訊:運動本身。
這篇論文之後:誰接著往下走
雙流網路這個思路提出之後,很快被後續研究大量借鑑和擴展。
2016年,Feichtenhofer等人發表了一篇論文,把雙流網路里兩路特徵融合的位置從最後的分類層提前到了網路中間層,讓空間和時間資訊能在更早的階段就互相交流,進一步提升了準確率。
2017年,DeepMind團隊提出了一個叫I3D的網路(論文題目是《Quo Vadis, Action Recognition?》),把雙流網路里的2D卷積換成了3D卷積,讓網路能直接在時間維度上做卷積操作,同時提出了一個更大規模的動作識別數據集Kinetics,把整個領域的數據規模從萬級別推到了幾十萬級別。I3D基本延續了雙流的框架,只是把每一路網路本身升級成了3D卷積網路,在Kinetics上預訓練之後再遷移到別的小數據集,效果大幅超過了2014年雙流網路的表現。
這兩篇後續工作分別從"怎麼融合兩路資訊"和"怎麼讓每一路網路本身更強"這兩個方向,把雙流網路的思路繼續往前推。可以說雙流網路定義了一個框架,後來者大多是在這個框架內做優化,直到後來Transformer架構在影片理解領域興起,才出現了不完全依賴雙流思路的新範式。
寫在後面
讀這篇論文時最讓我意外的一點是,時間流單獨跑出來的準確率(81.0%)居然比空間流(72.6%)還高出接近9個百分點。這跟我們直覺里"看畫面內容更重要"的預設是反的。
這說明一件事:人類在判斷"這是什麼動作"時,可能高度依賴動作本身的運動軌跡,而不是場景背景。想想看,蒙住一個人的眼睛只給他一段動作的骨架運動軌跡,他可能真的能猜出這是在打網球還是在游泳,即使完全看不到球拍或水池。這個實驗結果某種程度上是給"動作的本質是運動模式而非場景語義"這句話提供了一個數據證據。
論文裡另一個沒有被過多強調,但我覺得值得單獨拿出來說的細節是處理相機自身運動的那一步。很多論文會忽略這種"看起來是工程細節"的處理,但恰恰是這類細節決定了一個方法能不能在真實場景里落地,而不只是在乾淨的實驗數據集上好看。
如果雙流網路里兩路資訊本可以融合得更早、更深,那當年為什麼沒有直接這麼做?可能答案很樸素:算力和數據都不允許更複雜的聯合訓練。這提醒我一件事,很多"經典"設計未必是當時能想到的最優解,而是當時條件下能落地的最優解。
Q&A
Q1:雙流卷積網路是什麼?
A:雙流卷積網路是2014年由Simonyan和Zisserman提出的影片動作識別方法,由兩個獨立的卷積神經網路組成,一個處理原始影片畫面(空間流),一個處理光流場(時間流),最後融合兩邊結果做出判斷,在UCF-101數據集上準確率達到88%,首次讓深度學習方法追平當時最好的手工特徵方法。
Q2:為什麼要把空間資訊和運動資訊分成兩個網路處理?
A:因為空間資訊(物體、場景)和運動資訊(動作軌跡)在統計規律上差異很大,合併進一個網路學習會讓網路難以兼顧,尤其在當時訓練數據有限的情況下。分成兩路各自訓練,學習目標更清晰,效果也更好,實驗顯示融合後準確率比單獨任何一路高出至少7個百分點。
Q3:光流在這個方法裡起什麼作用?
A:光流是描述畫面中每個像素點運動方向和速度的向量場,相當於給運動資訊拍了一張"專屬快照"。論文把連續多幀光流堆疊起來輸入時間流網路,讓網路專門學習動作的運動模式,實驗顯示僅用光流網路的準確率(81.0%)甚至比僅用原始畫面的空間流網路(72.6%)更高。






