2014年秋天,如果你問電腦視覺圈子裡的人一個問題:深度學習能不能識別影片裡的動作,比如區分一個人是在揮手還是在鼓掌,大概率會得到一個謹慎的搖頭。
這聽起來有點奇怪。畢竟就在兩年前,2012年,AlexNet已經在圖像分類上把傳統方法打得潰不成軍,深度學習的旗子插遍了整個電腦視覺領域。可是到了影片動作識別這個子領域,情況完全不一樣。
當時最好的深度學習方法,在UCF-101
這個標準動作識別測試集上,準確率大概在65%左右。而一個叫做"密集軌跡
"的手工設計方法,用的是完全傳統的思路,靠人工設計的特徵加上編碼技巧,能做到超過85%的準確率。
這個差距接近20個百分點。什麼概念?意味著每5個動作影片,深度學習模型就要比手工方法多認錯1個。深度學習在圖像上稱王稱霸,在影片動作識別上卻像個初學者,被一個"老古董"方法按在地上摩擦了整整兩年。
這篇文章要講的,就是Karen Simonyan
和Andrew Zisserman
在2014年發表的論文,《用雙流卷積網路
進行影片中的動作識別》,這是深度學習第一次在動作識別任務上打贏手工特徵的方法。這個時間點的分量,不亞於兩年前AlexNet在圖像分類上的橫空出世。
問題出在哪裡:影片比圖片難在哪
要理解這篇論文的巧思,得先搞清楚一件事:為什麼給深度學習一張圖片,它能認得又快又准,可給它一段影片,它就變得笨手笨腳?
圖片識別本質上是個靜態問題。一張貓的照片,貓就在那裡,輪廓、毛色、姿態全部凝固在一幀里,卷積網路只需要學會識別形狀和紋理的組合模式。
影片動作識別不一樣。一個"揮手"動作,光看單獨一幀,你可能只看到一隻舉起的手,跟"舉手提問"或者"投籃"這些動作的某一幀長得幾乎一樣。動作的本質資訊不在某一幀的靜態畫面里,而在幀與幀之間的變化里,是那個手臂從下往上又左右擺動的運動軌跡,才讓這個動作變成"揮手"而不是別的什麼。
這就是問題的核心矛盾:卷積網路天生擅長處理空間資訊,一張圖里什麼東西長什麼樣、在哪個位置,但它並不擅長處理時間資訊,也就是東西是怎麼隨著時間變化的。
在這篇論文之前,研究者們試過很多辦法讓卷積網路理解時間資訊。最直接的想法是,把好幾幀圖像堆疊起來,一起塞進一個3D卷積網路里,讓網路自己去學習幀與幀之間的運動規律。這個思路聽起來合理,但實驗結果一直不理想,訓練出來的模型效果始終追不上手工特徵。
問題出在哪?後來人們意識到,直接從原始像素里學習運動資訊,對網路來說太難了。原始像素堆疊在一起,運動資訊被攝像機抖動、背景變化、光照差異這些噪音淹沒了,網路很難從中提煉出真正有用的運動模式。
這就好比讓一個剛學開車的新手,同時盯著方向盤、後視鏡、路況和儀錶盤去判斷車速,他的注意力會被分散得七零八落。反過來,如果你直接把一個"車速表"擺在他眼前,告訴他現在時速多少,他立刻就能做出準確判斷。手工設計的運動特徵,某種程度上就是這樣一個提前算好的"車速表",而讓網路從原始像素里自己去悟出運動規律,則是讓新手同時處理所有原始資訊,自然就慢了、也容易出錯。
雙流架構:把一個難題拆成兩個簡單題
Simonyan和Zisserman想到的辦法,說出來其實很樸素:既然讓一個網路同時學會空間外觀和時間運動太難,那就乾脆用兩個網路,一個專門負責看"長什麼樣",另一個專門負責看"怎麼動的",最後把兩邊的判斷結果合併起來。
這就是雙流卷積網路*,Two-Stream Convolutional Networks,一種用兩條獨立的卷積網路分支分別處理靜態外觀資訊和動態運動資訊,再融合兩者輸出結果的架構。
第一條流叫空間流,Spatial Stream,它的輸入很簡單,就是影片裡的單獨一幀RGB圖像。這條流本質上跟普通的圖像分類網路沒什麼區別,它學習的是場景里有什麼物體、什麼背景、人物的姿態大致是什麼樣,說白了,它捕捉的是"這個動作發生在什麼場景里",比如游泳這個動作,背景往往是水,籃球運動背景往往是球場。
第二條流叫時間流,Temporal Stream,它的輸入不是原始圖像,而是光流場
*,Optical Flow Field,一種描述圖像中每個像素點在連續兩幀之間移動方向和速度的向量場,可以理解成一張"運動地圖"。
光流場這個概念需要多解釋一下。想像你在看一段影片,人的手從畫面左邊移動到右邊,光流算法會計算出,畫面里手所在的那些像素,在下一幀里往右邊移動了多少距離。整段影片裡每一個像素點都會算出一個類似的運動向量,這些向量拼在一起,就構成了光流場。它本質上是一張只記錄"運動方向和速度"的地圖,完全不關心顏色和紋理是什麼。
時間流網路吃進去的不是一幀圖像,而是連續多幀計算出來的光流場堆疊在一起,通常是10幀,對應20張光流圖,因為每一幀要拆成水平方向和垂直方向兩張圖。這樣網路看到的輸入里,已經把"運動資訊"從背景噪音里剝離出來了,它不需要再費力氣從像素變化里猜測運動模式,因為光流算法已經把這個活幹完了。
這個設計背後有一個很清楚的判斷:與其逼著一個網路同時學會兩件不相關的事,不如把任務拆開,讓每個網路專注做一件事,這樣每一件事都變得簡單很多。
這就像一個餐廳後廚,如果讓一個廚師同時負責炒菜和記賬,他大概兩件事都做不好,炒菜的時候心裡想著賬本,算賬的時候鍋里的菜可能糊了。但如果把炒菜和記賬分給兩個人,廚師專心炒菜,會計專心記賬,最後兩邊配合起來出一份完整的營業報表,效率反而更高。如果不這樣拆分,硬讓一個網路又要看懂場景又要看懂運動,網路的注意力會被兩種性質完全不同的資訊互相干擾,學習效果會打折扣,這也正是之前那些直接堆疊幀數據訓練3D網路效果不好的原因之一。
論文裡給出的原始架構圖上,可以清楚看到兩條並行的卷積網路分支,最後在softmax層之後做融合,兩條線各自獨立訓練,幾乎沒有中間的資訊交換,這也是"雙流"這個名字的來源,兩條河流各自流淌,最後匯入同一片大海。
融合兩條流:簡單粗暴但有效
兩條流分別訓練好之後,怎麼把它們的判斷結果合起來?
論文裡試了兩種融合方式。一種是直接對兩條流輸出的類別概率做平均,另一種是用一個支持向量機
*,SVM,Support Vector Machine,一種經典的機器學習分類算法,通過尋找最優分類邊界來區分不同類別,把兩條流的輸出分數當作特徵,重新訓練一個分類器去決定最終結果。
實驗發現,用SVM做融合比簡單平均效果更好,這說明兩條流的輸出資訊並不是簡單地"各打五十分"就夠了,不同動作類別里,空間資訊和時間資訊的相對重要性是不一樣的。比如游泳這個動作,背景里的水面已經提供了很強的線索,空間流可能貢獻更大;而像"揮手"和"鼓掌"這類背景相似但動作細節不同的類別,時間流的貢獻會更關鍵。SVM能夠學習到這種權重上的差異,而簡單平均做不到。
這裡還有一個技術細節值得說一說。時間流網路的訓練數據是提前用傳統算法計算好的光流場,而不是讓網路自己去學習計算光流,這個決定其實相當保守,甚至可以說是向"手工特徵"妥協了一部分。但恰恰是這種妥協,讓時間流網路有了一個高質量、乾淨的輸入,訓練起來更容易收斂,如果不這樣做,非要end-to-end從原始像素學到運動特徵,效果反而可能更差,因為當時的網路結構和訓練數據量都還不足以支撐這麼困難的自學習任務。
結果說話:20個點是怎麼被追上的
理論說得再好,最終還是要看數字。
論文在兩個標準數據集上做了測試,UCF-101和HMDB-51
,兩個數據集都是動作識別領域公認的基準測試集,前者包含101類動作,後者包含51類。
| 方法 | UCF-101準確率 | HMDB-51準確率 |
|---|---|---|
| 僅空間流 | 72.6% | 40.5% |
| 僅時間流 | 81.0% | 54.6% |
| 雙流平均融合 | 86.9% | 58.0% |
| **雙流SVM融合** | **88.0%** | **59.4%** |
| 同期最好的手工特徵方法 | 87.9% | 61.1% |
這張表格里最能說明問題的對比是僅空間流和僅時間流的差距。僅用空間流,也就是只看單幀圖像不看運動資訊,UCF-101上只有72.6%,比雙流完整方案低了整整15個百分點。這個數字直接證明了一件事:靜態外觀資訊遠遠不夠,動作識別真正依賴的核心資訊藏在運動軌跡里。
反過來,僅時間流已經能做到81.0%,比僅空間流高出將近9個點,這說明光流場裡蘊含的運動資訊本身就非常強大,甚至單獨拿出來用都比只看圖像外觀更有效。
當兩條流融合之後,UCF-101上的準確率衝到了88.0%,第一次超過了同期最好的手工特徵方法。這個突破的意義不在於贏了多少個百分點,而在於這是一個信號:深度學習不是不能處理時間資訊,只是之前的做法用錯了方式,一旦把光流這個專門表達運動的信號交給網路,網路立刻就能把這部分資訊用好。
有意思的是,在HMDB-51數據集上,雙流網路的59.4%還是略低於手工特徵的61.1%。這說明這個方法並不是在所有場景下都能完全碾壓傳統方法,HMDB-51這個數據集本身樣本量更小、動作類別更細粒度,深度學習方法通常在這種小數據集上更容易吃虧,因為神經網路需要大量數據才能學到穩定的特徵表示。這也從側面印證了後來深度學習在影片領域持續發展的一個核心方向:如何在數據有限的情況下依然訓練出強大的模型。
意義:一次關於"如何拆解問題"的示範
這篇論文最值得記住的地方,不是某個具體的網路結構細節,而是它展示的一種解決問題的思路:當一個任務里混雜著兩種性質完全不同的資訊時,試著把它們拆開來分別處理,而不是硬塞給同一個模型。
這個思路後來被證明極其有生命力。三年後,2017年,Carreira和Zisserman(還是Zisserman)在論文裡提出了I3D網路
*,Inflated 3D ConvNet,一種把2D卷積核"膨脹"成3D卷積核的網路結構,用來更好地處理影片裡的時空資訊,把雙流網路的思想和3D卷積結合起來,在Kinetics這個更大規模的數據集上進一步提升了準確率,也讓"雙流+3D卷積"成為後續幾年影片理解領域的主流範式之一。
再往後,2018年,Facebook AI Research
團隊發表了SlowFast網路,這個名字本身就很直白地體現了雙流思想的延續:一條"慢"通路用較低的幀率捕捉空間語義資訊,一條"快"通路用較高的幀率捕捉運動細節,本質上仍然是把空間資訊和時間資訊拆成兩條路徑分別處理,只是拆分的維度從"圖像vs光流"變成了"低幀率vs高幀率"。這個設計在動作識別任務上進一步刷新了準確率記錄。
從這兩個後續工作可以看出,雙流網路提出的核心思想,拆分處理不同性質的資訊再融合,已經變成了整個影片理解領域一個基礎性的設計範式,即便具體實現方式在不斷演化,這個底層邏輯一直被沿用。
值得一提的是,Simonyan和Zisserman幾個月後又發表了VGGNet,這篇論文裡用到的空間流和時間流網路結構,其實借鑑了同一批研究者正在打磨的深層卷積網路設計經驗。兩篇論文幾乎是同期完成的工作,這也解釋了為什麼雙流網路里的單流分支設計會顯得如此紮實和成熟,這批研究者當時正在同時打磨兩套東西,圖像分類和影片動作識別互相之間在網路設計上有著經驗上的借力。
Q&A
Q1:雙流卷積網路是什麼?
A:雙流卷積網路是Simonyan和Zisserman在2014年提出的一種影片動作識別方法,用兩條獨立的卷積網路分支,一條處理單幀圖像捕捉外觀資訊,空間流,另一條處理光流場捕捉運動資訊,時間流,最後融合兩條流的輸出結果,第一次讓深度學習在動作識別任務上超過了傳統手工特徵方法。
Q2:為什麼當時深度學習在動作識別上一直打不過手工特徵?
A:因為直接從原始像素堆疊的幀序列里學習運動資訊太難了,運動資訊容易被攝像機抖動、背景變化等噪音淹沒,網路難以提煉出穩定的運動模式,導致訓練效果一直不如人工設計的密集軌跡等特徵方法,當時差距接近20個百分點。
Q3:光流場為什麼對識別動作這麼重要?
A:光流場是一張記錄每個像素點在連續幀之間運動方向和速度的地圖,它把運動資訊從顏色紋理等背景噪音里剝離出來,讓網路不用再費力從像素變化里猜測運動模式,實驗中僅用光流場訓練的時間流網路準確率就達到81%,比僅用單幀圖像的空間流高出近9個百分點。
寫在後面
讀這篇論文的時候,最讓我意外的一個細節是,時間流網路的輸入光流場是提前用傳統算法算好的,不是網路自己學出來的。這在當時看起來有點不夠"純粹",深度學習的賣點本來就是端到端自動學習,可這裡卻主動向傳統方法妥協了一部分。
但正是這個妥協讓整個方案跑起來了。這讓我想到一個更普遍的問題:很多時候一個系統的突破,不是靠把所有環節都換成最新技術,而是靠搞清楚哪個環節該用新方法,哪個環節暫時還是老辦法更可靠,把兩者接對了口子。
雙流網路自己也沒解決的問題是,兩條流是分開訓練、事後融合的,網路沒有在訓練過程中主動學習"什麼時候該多信空間資訊,什麼時候該多信時間資訊"。這個問題後來被更複雜的時空融合結構慢慢啃了下去,但當年這個簡單的拆分方案,已經足夠把手工特徵時代畫上一個句號。






