2014年秋天,如果你去問電腦視覺領域的研究者,深度學習能不能用來識別影片裡的動作,大概率會得到一個尷尬的回答。
不是不能用,是用了效果不好。
圖像識別領域,深度學習已經把傳統方法打得節節敗退。2012年AlexNet橫空出世,把ImageNet圖像分類的錯誤率從26%砍到15%,整個學術圈都在往卷積神經網路這條路上沖。可是影片動作識別這塊地,深度學習死活攻不下來。
當時最強的方法叫密集軌跡
> 密集軌跡(Dense Trajectories)*:一種手工設計的特徵提取方法,通過追蹤影片裡密集採樣的點,統計它們的運動軌跡、方向、光流
變化,拼成一個描述動作的特徵向量。
這套手工方法在標準測試集UCF-101上能拿到87.9%的準確率,而當時最好的深度學習方法只有65%左右,差了20多個百分點。
20個百分點的差距意味著什麼?意味著每5個動作里,深度學習就要比手工方法多認錯1個。這在學術圈是災難性的差距,足以讓人懷疑深度學習這條路在影片領域根本走不通。
牛津大學的Karen Simonyan和Andrew Zisserman盯著這個問題,琢磨出了一個答案。他們後來做的另一件事更出名,幾個月後發表了VGGNet,直接把圖像分類的卷積網路結構變成了教科書標準。但在影片這件事上,他們先解決的是一個更棘手的問題:影片不是一張圖片,它是一堆圖片加上時間。
問題到底難在哪
先說清楚一件事,為什麼直接把圖像識別的CNN搬到影片上不好用。
一個卷積神經網路看一張靜止的照片,能學到"這是一隻貓""這是一輛車"。可是一個動作,比如"揮手"和"招手"在單張照片裡可能長得幾乎一樣,區別只在於手接下來往哪個方向動。
單張圖片能告訴你場景里有什麼東西,卻沒法告訴你東西正在怎麼運動。
這就好比你給一個從沒見過跳繩的人看一張照片,照片裡有個人手裡拿著繩子,雙腳離地。這人可能會以為這是在拍照留念,也可能猜是跳繩,單看一張圖猜不准。你得看連續幾張照片,才能看出繩子在畫圓,人在有節奏地起跳,這才叫跳繩這個動作。
早期研究者試過一個簡單粗暴的辦法,把影片的多幀圖像直接堆疊起來餵給卷積網路,讓網路自己從像素的時間變化里學運動資訊。結果很失望,效果沒比單幀好多少。網路在原始像素層面學時間變化,信號太弱太雜,學不出個所以然。
這就是2014年之前,深度學習在影片動作識別上遲遲不能超越手工特徵的根本原因。
核心思路:把運動資訊餵給網路,而不是讓網路自己找
Simonyan和Zisserman的關鍵決定是,不要指望網路從原始像素堆疊里學運動,直接把運動資訊計算出來,餵給網路。
這個運動資訊用的是光流
> 光流(Optical Flow)*:描述影片裡每個像素點從上一幀到下一幀移動方向和速度的一種表示方法,通常用兩張圖分別表示水平方向和垂直方向的位移量。
光流場本質上就是一張"運動地圖"。圖上每個點的顏色深淺或箭頭方向,代表這個位置的像素正往哪個方向、以多快速度移動。這種表示方式把"運動"這件抽象的事,變成了一張可以直接輸入卷積網路的圖像。
於是論文提出了一個雙流結構
> 雙流網路
(Two-Stream Network)*:由兩個獨立的卷積神經網路組成,一個處理靜止的RGB圖像叫空間流,專門學習畫面里有什麼物體和場景;另一個處理光流場叫時間流,專門學習物體是怎麼運動的。兩條網路各自輸出一個動作分類的概率,最後把兩邊的結果加權融合,得到最終判斷。
空間流網路輸入是單幀的彩色圖像,結構和當時做圖像分類的CNN幾乎一樣,負責認場景、認物體、認背景。比如看到泳池就大概猜到可能是游泳,看到球場就大概猜到可能是打球。
時間流網路輸入是連續多幀計算出來的光流場,通常是10幀的光流堆疊在一起,變成一個20通道的輸入(10幀×水平垂直兩個方向)。這條網路專門學習動作本身的模式,不看背景是什麼,只看東西怎麼動。
為什麼要拆成兩條獨立的網路,而不是揉在一起訓練一個大網路?
這裡有個很實際的原因:數據不夠。當時能用來訓練的影片動作數據集規模很小,UCF-101一共才1萬多個影片片段,根本餵不飽一個既要學外觀又要學運動的複雜網路。研究者想了個辦法,時間流網路可以先在一個專門做光流預測的數據集上單獨預訓練,把外觀學習和運動學習這兩個任務徹底分開,讓每條網路專注做好一件事,再各自用儘可能多的數據餵飽它。
這就好比一個廚房要同時處理食材的味道和火候兩件事。如果讓一個廚師同時盯著調味和控制火候,很容易兩頭都做不精。更好的辦法是找兩個廚師,一個專門負責調味,一個專門負責火候,兩人各自練精了手藝,最後端上桌前再把兩道半成品拼在一起,出來的菜反而更好。如果硬要把兩件事塞給一個人一次性搞定,在食材(數據)本來就不多的情況下,很可能兩頭都學得半生不熟。
這個設計直接回應了前面提到的根本矛盾。網路自己從像素堆疊里學運動學不動,那就不讓網路學,直接算好光流餵給它。這是一種巧妙的"減負",把網路最難學的部分提前用傳統電腦視覺的方法算出來,網路只需要在已經算好的運動資訊上做分類判斷,難度一下降低了一大截。
如果不這麼拆分,會發生什麼?論文裡做了對照實驗。只用空間流網路單獨跑,UCF-101上的準確率是72.6%。只用空間流,意味著網路只能靠畫面里的場景物體去猜動作,完全忽視了動作本身的運動軌跡,這個數字比最好的手工方法低了15個百分點還多。而加上時間流之後,雙流融合的最終結果達到88.0%,一舉反超了當時最強的手工特徵方法87.9%。
這是深度學習第一次在影片動作識別上打贏手工特徵,時間是2014年,分量不亞於兩年前AlexNet在圖像分類上掀起的那場革命。
數據說話:雙流結構到底強在哪
論文在幾個標準數據集上做了詳盡的對照實驗,數據擺出來能看得很清楚。
| 方法 | UCF-101準確率 | HMDB-51準確率 |
|---|---|---|
| 手工特徵(改進的密集軌跡) | 87.9% | 57.2% |
| 僅空間流CNN | 72.6% | 40.5% |
| 僅時間流CNN | 81.2% | 47.1% |
| **雙流CNN融合** | **88.0%** | **59.4%** |
這張表格里最值得琢磨的一行是"僅時間流"。單獨看時間流網路的表現,81.2%,已經比單獨的空間流網路高了將近9個百分點。這說明一件事,對於識別動作而言,運動資訊比外觀資訊更關鍵。
這個發現某種程度上有點反直覺。很多人下意識覺得,要認出一個人在做什麼,先得看清這個人所處的場景和物體,背景資訊應該很重要。但實驗數據說明,單純的運動模式,哪怕完全不知道場景里有什麼東西,已經能猜對八成以上的動作。這也印證了之前那個跳繩的類比,真正決定這是不是跳繩的,是繩子和人的運動軌跡,不是背景里有沒有健身房的鏡子。
融合兩條流之後的88.0%,比單獨任何一條流都高,說明兩種資訊確實是互補的,不是重複的。空間流知道"這大概是個游泳池場景",時間流知道"這個動作是循環往復的划水運動",兩者疊加起來,判斷的把握就更大了。
再看HMDB-51這個數據集,雙流方法的優勢更明顯,59.4%對比手工特徵的57.2%,雖然領先幅度不如UCF-101那麼誇張,但HMDB-51本身是個更難的數據集,影片質量更差、動作類別更細,能在這種更難的場景下依然反超,說明雙流結構的優勢不是靠某個數據集的特殊性湊出來的,是真實的能力提升。
一個容易被忽略的細節:時間流的預訓練
這篇論文裡有個技術細節,很多後續複述這篇工作的文章會略過,但其實很關鍵。
時間流網路要學好光流特徵,需要大量數據,可當時公開的帶光流標註的動作影片數據集非常有限。研究者的解決辦法是,先用ImageNet這種海量圖像分類數據集,把網路在圖像識別任務上訓練出一個初始的參數,再拿這套參數去初始化時間流網路,最後用影片動作數據做微調。
這個操作放到今天來看平平無奇,遷移學習早就是標配。但在2014年,把一個圖像分類任務學出來的網路權重,拿去初始化一個處理光流場的網路,這個嘗試本身帶著不小的風險。光流場和自然圖像的像素分布差異很大,一個是彩色照片,一個是運動向量場,理論上直接遷移未必work。但實驗證明這套辦法確實有效,大幅緩解了數據量不足帶來的訓練困難。
這就像是讓一個已經學會開手動擋車的人去學開自動擋,雖然踏板邏輯不一樣,但對方向盤的手感、對路況的判斷力這些底層能力是相通的,不用從零開始學。如果非要找一個從沒摸過車的新手直接學自動擋,在教練資源(數據)稀缺的情況下,學習效率會低得多。
這篇論文之後發生了什麼
雙流網路這個思路一炮打響之後,後續幾年整個影片理解領域幾乎都在這個框架上做擴展和改進。
2015年,Wang等人在這篇論文基礎上提出了TDD(Trajectory-Pooled Deep-Convolutional Descriptor),把深度學習特徵和傳統的軌跡跟蹤結合起來,進一步把UCF-101的準確率往上推。
2016年,牛津團隊自己(Feichtenhofer, Pulli, Zisserman)發表了後續工作,提出用更深的網路結構(基於VGG-16和ResNet)重新實現雙流架構,同時改進了兩條流之間的融合方式,不再是簡單的最後一層加權平均,而是在網路中間層就開始做特徵融合,這個版本把UCF-101的準確率進一步推高到92%以上。
2017年,DeepMind團隊發表了I3D(Inflated 3D ConvNet),思路上有了本質變化。他們不再滿足於用2D卷積網路分別處理空間和時間兩條流,而是把整個網路結構從2D"膨脹"成3D,讓卷積核本身就能同時感知空間和時間維度。這個改進背後依然保留了雙流的思想框架,仍然是一條流處理RGB,一條處理光流,但底層的網路結構完全升級了,在Kinetics這個規模更大的數據集上,I3D把準確率進一步刷新。
從這條脈絡能看出來,雙流網路提出的"分開處理外觀和運動"這個核心思想,在後續三年裡被反覆驗證、反覆沿用,只是具體的網路結構在不斷疊代升級。這也是評判一篇論文影響力的一個樸素標準,看它提出的核心想法有沒有被後來者一直用下去,而不是被一次性推翻。
寫在後面
讀到這篇論文時,最觸動我的不是雙流架構本身,而是那個"僅時間流網路表現優於僅空間流網路"的實驗數據。它說明在很多動作識別任務里,你根本不需要知道背景是什麼,光看運動軌跡就能猜對大半。這多少打破了一個直覺,以為理解一個場景必須先理解場景里的物體是什麼。
另一個值得單獨說的細節是,這篇論文的兩位作者幾個月後就發表了VGGNet,那篇論文後來成了整個卷積網路設計的標準教材。同一批人,同一個時間段,一邊在圖像分類上定義標準結構,一邊在影片領域捅破了深度學習打不過手工特徵這層窗戶紙。這種時間上的重合讓人挺感慎,好的研究者手頭往往同時在推進幾件看似不相關、實則共享底層直覺的工作。
這篇論文沒解決的問題也很明顯,光流本身的計算需要傳統算法預先跑一遍,不是端到端訓練出來的,這意味著整套系統的效果會被光流算法的好壞卡住上限。後來的3D卷積網路某種程度上就是想繞開這個限制,直接讓網路自己從原始幀序列里學出運動模式。這條路走沒走通,是不是真的比雙流更好,值得再往後翻翻論文。
Q&A
Q1:雙流網路(Two-Stream Network)是什麼?
A:雙流網路是2014年提出的一種影片動作識別方法,由兩個獨立的卷積神經網路組成,一個叫空間流處理靜止圖像學習場景和物體資訊,另一個叫時間流處理光流場學習運動資訊,最後把兩條網路的判斷結果融合起來做最終的動作分類。
Q2:為什麼雙流網路要把空間和時間資訊分開處理,不直接用一個網路學?
A:因為當時能用於訓練的影片數據集規模很小,如果讓一個網路同時學外觀和運動會導致兩方面都學不精。分成兩條獨立網路,時間流還能先在別的數據集上單獨預訓練,讓每條網路專注做好一件事,最終效果比合在一起訓練更好。
Q3:雙流網路的效果到底比傳統手工特徵方法好多少?
A:在UCF-101數據集上,雙流網路融合後達到88.0%的準確率,超過了當時最強的手工特徵方法(改進的密集軌跡)的87.9%,這是深度學習第一次在影片動作識別任務上反超手工設計的特徵方法。






