2014 年,如果你去問任何一個做電腦視覺的研究者,深度學習能不能識別影片裡的動作,大概率會得到一個搖頭。
這聽起來有點反直覺。畢竟就在兩年前,AlexNet 已經在圖像識別上把傳統方法打得沒有還手之力,深度學習的旗號已經插滿了圖像領域的山頭。可是一旦換成影片,情況完全反過來了。當時最強的影片動作識別方法,叫做密集軌跡
> 密集軌跡*:一種手工設計的影片特徵提取方法,通過追蹤影片裡密集分布的採樣點在時間上的運動軌跡,再手工計算這些軌跡周圍的圖像和運動統計特徵,拼起來判斷影片裡發生了什麼動作。
密集軌跡在標準測試集上能做到接近 88% 的準確率,而當時人們嘗試過的深度學習方法,只能做到 65% 左右。
這個差距有多大?意味著每識別 5 個動作,深度學習就要比手工方法多認錯超過一個。整整 20 個百分點的落差,這在當時幾乎被當成了一個定論:深度學習不適合處理影片裡的運動資訊。
牛津大學的 Karen Simonyan 和 Andrew Zisserman 就是在這個背景下,拿出了一篇論文,題目叫《用於影片動作識別的雙流卷積網路》。這篇論文做的事情,說出來你可能會覺得簡單得不可思議:他們沒有去發明什麼全新的網路結構,而是想明白了一件事,影片裡其實藏著兩種完全不同性質的資訊,過去的深度學習方法,一直在用同一雙眼睛看這兩種資訊,而這雙眼睛,其實只擅長看一種。
影片裡到底藏著什麼,為什麼一個網路看不懂
先說說影片到底是什麼。
一段影片,說到底就是一幀一幀的靜止圖片連續播放。你可能會想,那深度學習既然能看懂單張圖片,把每一幀丟進去識別不就行了?
問題就出在這裡。單張圖片能告訴你的,是"這是什麼"。一個人站著,一隻手舉著,這可能是在打招呼,也可能是要打人,也可能只是伸懶腰。圖片本身回答不了這個問題,因為動作的本質不在某一幀里,而在幀與幀之間的變化里。
這就是影片識別真正難的地方,你需要的不只是空間資訊,更需要時間資訊,也就是畫面是怎麼隨著時間變化的。
在這篇論文之前,大部分深度學習方法的思路是,把連續幾幀圖像疊在一起,當成一個"厚一點的圖片"扔進卷積網路,讓網路自己去學習幀與幀之間的關係。聽起來挺合理,但效果很差,因為普通的卷積網路天生是為了識別靜態圖案設計的,邊緣、紋理、色塊,這些東西它很擅長。可是運動這件事,不是靠堆疊圖像就能學出來的,運動的本質是位移,是速度,是方向,這些概念在卷積網路的"視野"里根本不存在合適的表達方式。
這就好比讓一個只會看照片的人去判斷一場足球比賽誰進球了。你把十張連續的照片擺在他面前,他能看出球在不同位置,但要他從靜態畫面里"感覺"出球飛行的速度和軌跡,這幾乎是在為難他。他缺的不是眼力,缺的是一種專門針對運動設計的感知方式。如果不給他補上這一課,他永遠只能靠猜。
拆成兩條流,一條看形狀一條看運動
Simonyan 和 Zisserman 的思路是,既然一個網路同時處理空間資訊和時間資訊效果不好,那就乾脆拆成兩個網路,一個專門負責空間,一個專門負責時間,最後把兩邊的判斷結果合併起來。
這就是論文標題里"雙流"的來源。
> 雙流卷積網路*:把影片識別任務拆分成兩條獨立的卷積神經網路處理通道,一條處理靜態畫面資訊,一條處理運動資訊,兩條通道各自輸出預測結果,最後融合成最終判斷。
第一條流叫空間流,輸入很簡單,就是影片裡隨便抽出的一幀靜止圖片。它的任務和普通的圖片分類網路沒什麼區別,負責識別畫面里有什麼物體、什麼場景、什麼姿態。比如畫面里有游泳池,有個人在揮臂,這條流基本上能判斷出"這可能是游泳"。
第二條流叫時間流,這才是整篇論文真正的巧思所在。它的輸入不是圖片,而是光流場
> 光流場*:描述影片畫面中每一個像素點從上一幀到下一幀移動方向和移動距離的一種表示方式,可以理解成給畫面里每個點畫一個"運動箭頭"。
光流場這個概念不是這篇論文發明的,在傳統電腦視覺里早就有,通常用來做影片壓縮、機器人導航之類的任務。但把光流場餵給卷積神經網路,讓深度學習直接從運動軌跡里學特徵,這是這篇論文的關鍵一步。
具體做法是,先用傳統算法算出影片裡連續幾幀之間每個像素的位移,把水平方向的位移和豎直方向的位移分別存成兩張"圖",這兩張圖不是普通圖片,每個像素的數值代表的不是顏色,而是這個點往哪個方向移動了多遠。把連續 10 幀算出來的這些位移圖疊在一起,餵給一個和空間流結構類似的卷積網路,讓它單獨學習"運動"這件事。
這個設計背後的道理是,把不同性質的資訊交給不同的專家處理,比讓一個人同時兼顧兩件事效果好得多。
想像一家餐廳,主廚既要炒菜又要記賬,結果往往是菜炒得一般,賬也記得馬虎。但如果分成兩個人,一個專心炒菜,一個專心記賬,兩個人各自做到極致,最後菜好賬也清楚。空間流就是那個專心"看畫面"的廚師,時間流就是那個專心"看運動軌跡"的會計,他們互不干擾,各自把自己擅長的事情做到最好,最後再把結果匯總。如果硬要一個網路同時干兩件事,就像逼著那位主廚一邊顛勺一邊記賬,難免兩頭顧不上。
論文裡還有一個細節值得說一說。作者嘗試了兩種計算光流的方式,一種是讓畫面上所有點的運動都被平等對待,另一種是先把攝像機本身的移動去掉,只保留畫面里物體相對於攝像機的運動。後者的效果明顯更好,因為很多影片是手持拍攝或者鏡頭本身在移動的,如果不把鏡頭晃動這個"噪音"過濾掉,時間流學到的很可能不是動作本身,而是攝像師的手抖。這提醒我們,看似簡單的"運動資訊",其實裡面藏著好幾層需要精心剝離的成分。
數據不夠用,那就借別處的數據來湊
深度學習這套東西,吃的是數據,而 2014 年能用來訓練影片動作識別模型的數據集非常小,像 UCF-101 這樣的標準測試集,總共也就一萬多段影片,分成 101 個動作類別。這個規模放到今天簡單的圖片分類任務里都算小,更別說要訓練兩個卷積網路。
數據不夠,直接訓練容易過擬合
> 過擬合*:模型在訓練數據上表現很好,但因為訓練數據太少或模型太複雜,模型記住了訓練數據里的細節和噪音,導致在新數據上表現很差的現象。
Simonyan 和 Zisserman 想了兩招來解決這個問題。
第一招是把空間流網路放到一個更大的圖片數據集上先預訓練一遍,這個數據集就是著名的 ImageNet,裡面有上百萬張標註好的圖片。這樣空間流在正式看影片之前,已經從海量靜態圖片裡學會了怎麼識別物體和場景的基本套路,再拿相對小得多的影片數據去微調,效果自然好得多。
這一招現在回頭看是常識,但在當時的語境下,能想到用圖片數據集去"支援"影片任務,說明作者已經意識到,空間流本質上做的事情和普通圖片分類是一回事,完全可以借用圖片領域已經積累的海量數據和經驗。
第二招是找到另一個數據規模更大的影片數據集,叫 Sports-1M,裡面有一百萬段體育影片,涉及 487 種運動類別。作者先在這個更大的數據集上訓練網路,再遷移到目標數據集上做微調,這種做法叫多任務學習
> 多任務學習*:讓一個模型同時在多個相關任務或數據集上訓練,藉助任務之間的相關性,提升模型在每個任務上的表現,尤其在某個任務數據量不足時特別有用。
這兩招放在一起,本質上是同一個邏輯:數據不夠,就去借。借的方式可以是借圖片數據給空間流用,也可以是借更大的影片數據集給整體訓練用。
這就有點像準備一場重要考試,如果你手頭的真題太少,一種辦法是先做大量相關學科的基礎題打底子,再回來做真題,另一種辦法是找一份題量更大、難度相近的模擬卷先練手,最後再攻克目標考試的真題。兩種辦法都是在數據稀缺的情況下,想辦法把"經驗"從別處引進來。如果沒有這兩招,單靠一萬多段影片去從零訓練兩個深度網路,大概率會訓練出一個只會"背題"卻不會"舉一反三"的模型,遇到測試集裡沒見過的畫面立刻露餡。
兩條流合起來,效果超過了手工特徵
最後到了見真章的時刻。空間流單獨跑,在 UCF-101 上準確率是 72.6%。時間流單獨跑,能達到 81.0%。這個結果本身已經說明,運動資訊對識別動作的貢獻,比單純看畫面外觀還要大,這也印證了前面說的,動作的本質藏在時間變化里,不在某一幀的靜態內容里。
把兩條流的預測結果做加權融合以後,準確率來到了 88.0%,這個數字第一次追平甚至略微超過了當時最好的手工特徵方法。
|方法|準確率|
|---|---|
|空間流單獨|72.6%|
|時間流單獨|81.0%|
|密集軌跡(手工特徵基準)|約 88%|
|**雙流網路融合**|**88.0%**|
這個結果放在 2014 年的分量,不亞於兩年前 AlexNet 在圖片識別上的橫空出世。區別在於,AlexNet 證明了深度學習在圖片上可以碾壓傳統方法,而雙流網路證明的是,深度學習在影片上終於追上了傳統方法,而且找到了正確的路徑,接下來只會越走越遠。
如果只用空間流會怎樣?準確率停留在 72.6%,比雙流融合整整低了 15 個百分點。這 15 個點意味著什麼,意味著如果只靠看畫面內容判斷動作,每識別接近 7 個影片就要錯認接近 1 個,而這個錯誤本可以靠給網路補一雙"看運動"的眼睛來避免。
有個細節特別值得拿出來說。Simonyan 和 Zisserman 當時同屬牛津大學同一個研究組,幾個月後,這個組又發表了另一篇後來同樣載入歷史的論文,VGGNet,提出了那個後來被無數人當作基礎模型使用的網路結構。這兩篇論文幾乎是同期完成的工作,一篇解決了影片運動資訊該怎麼表示的問題,一篇把圖片卷積網路的深度和規整性推到了一個新高度。這不是巧合,這說明當時這個研究組正處在對卷積網路理解突飛猛進的階段,不同方向的思考互相印證互相促進。
這條思路後來被怎樣接著走
雙流網路這個想法,後來被證明不是一個孤立的巧思,而是打開了一整條研究路徑。
2016 年,Feichtenhofer、Pinz 和 Wildes 發表了《卷積雙流網路融合用於影片動作識別》,他們指出原始雙流網路的兩條流是完全獨立訓練、最後簡單加權融合的,這樣空間流和時間流之間沒有任何交流,資訊融合發生得太晚太淺。他們提出在網路中間層就讓兩條流互相"對話",提前融合特徵,而不是等到最後一步才拼接結果,這個改進把準確率進一步推高。
2017 年,Carreira 和 Zisserman(還是同一個 Zisserman)發表了《Quo Vadis 動作識別?一個新模型和 Kinetics 數據集》,提出了 I3D 模型,把雙流網路里的 2D 卷積換成了 3D 卷積,直接在時間維度上做卷積運算,不再需要單獨計算光流,同時配合他們發布的大規模數據集 Kinetics,把整個領域的訓練數據規模又往上推了一個量級。這篇論文裡依然保留了雙流的思路,只是把"時間流"這個角色用 3D 卷積重新實現了一遍,說明雙流的核心思想,分開處理靜態外觀和動態變化,在三年後依然被認為是對的,只是具體的實現方式在不斷進化。
這條從 2014 年延伸出去的路徑,一直影響到後來的影片理解模型設計,核心邏輯始終沒有變過:影片裡的資訊天然分成兩種性質,一種是靜態的外觀,一種是動態的變化,想讓模型學好,就得讓它有能力分別捕捉這兩種資訊,而不是囫圇吞棗地混在一起處理。
寫在後面
讀這篇論文最觸動我的地方,不是雙流這個結構本身有多複雜,恰恰相反,是它簡單到幾乎讓人懷疑,這麼直接的想法,之前怎麼沒人試過。
後來查資料才明白,光流場這個概念在傳統視覺里已經用了幾十年,真正的難點從來不是想不到,而是敢不敢把一個"老古董"技術,原封不動地塞進當時還很新潮的卷積網路里,讓兩種完全不同時代的技術手拉手工作。這種把舊工具和新框架強行拼接、居然拼出了突破的做法,讓我想起很多工程史上的創新,往往不是憑空造出一個新零件,而是發現兩個原本各自存在的零件,可以用一種沒人試過的方式裝在一起。
有一個問題這篇論文沒有回答,後來的研究者也還在持續追問:如果光流這種運動表示本身就是有損的、不完美的,那網路學到的"運動理解"到底是真的理解了運動,還是只是學會了利用光流算法本身的某些統計規律?這個問題放到今天的影片大模型身上,依然值得繼續問下去。
Q&A
Q1:雙流卷積網路是什麼?
A:雙流卷積網路是 2014 年由牛津大學 Simonyan 和 Zisserman 提出的影片動作識別方法,把影片識別拆分成空間流和時間流兩個獨立的卷積神經網路,空間流處理靜態畫面識別物體和場景,時間流處理光流場識別運動資訊,最後融合兩者結果做出判斷。
Q2:雙流網路的準確率和傳統手工特徵方法比怎麼樣?
A:在 UCF-101 數據集上,雙流網路融合後達到 88.0% 的準確率,首次追平甚至略微超過了當時最強的手工特徵方法密集軌跡(約 88%),而在此之前的深度學習方法只能做到 65% 左右,差距達 20 多個百分點。
Q3:雙流網路後來被哪些研究繼續改進?
A:2016 年 Feichtenhofer 等人提出卷積雙流融合網路,讓兩條流在中間層就開始交流特徵而不是最後簡單加權。2017 年 Carreira 和 Zisserman 提出 I3D 模型,用 3D 卷積直接處理時間維度,配合新發布的 Kinetics 大規模數據集,進一步推動了影片識別的發展。






