2014年,如果你是一個研究影片動作識別的學者,你手裡最好用的工具不是神經網路。
這句話放在今天聽起來有點荒誕。深度學習在圖像分類上已經把傳統方法打得七零八落,AlexNet 在 2012 年一戰封神,整個電腦視覺圈子都在往神經網路轉向。但影片這個領域卻是個例外。
當時公認最強的動作識別方法叫密集軌跡
密集軌跡(Dense Trajectories)*:一種手工設計的特徵提取方法,通過跟蹤影片裡密集分布的點的運動軌跡,再手工統計這些軌跡周圍的圖像和運動特徵,來判斷影片裡發生了什麼動作。
這套方法在標準測試集上能做到接近 90% 的準確率,而當時試圖用深度網路處理影片的幾個工作,準確率普遍卡在 65% 到 70% 之間,差了整整 20 個百分點。這不是小差距,這意味著深度學習在識別每 5 個動作里,就要比手工方法多認錯 1 個。
為什麼深度學習在圖像上大殺四方,到影片這裡卻啞火了?答案藏在一個容易被忽略的事實里:影片不是"會動的圖片",動作識別真正需要的資訊根本不在畫面的樣子裡,而在畫面怎麼變化。一個人揮手和放下手臂,單看某一幀的畫面可能幾乎一樣,區別只在於手在往哪個方向移動。而當時的神經網路,包括那些直接把影片幀堆起來餵進 3D 卷積網路的嘗試,都在拼命學習"畫面長什麼樣",卻沒有專門的機制去捕捉"畫面怎麼變"。
這就是 Karen Simonyan 和 Andrew Zisserman 在 2014 年那篇論文裡想解決的問題。他們提出了一個後來影響深遠的架構,叫雙流卷積網路
雙流網路(Two-Stream Convolutional Networks)*:一種把影片拆成兩條獨立處理路徑的深度學習架構,一條專門看畫面內容,一條專門看運動資訊,最後把兩條路徑的判斷結果融合起來。
把影片拆成兩條河:空間流和時間流
雙流網路的核心想法說出來其實很樸素:如果一個網路同時學"長什麼樣"和"怎麼動"太難,那就乾脆分成兩個網路,一個只負責學樣子,一個只負責學動作,最後把兩邊的判斷合併。
第一條路徑叫空間流
空間流(Spatial Stream)*:輸入是影片裡的單獨一幀靜止圖像,負責識別畫面中的物體、場景、人物姿態等靜態視覺資訊,本質上跟做圖像分類沒什麼區別。
這條路徑要做的事情,其實跟 AlexNet 在 ImageNet 上做的事情高度相似,輸入一張圖,判斷裡面有什麼。作者甚至直接借用了在圖像分類任務上預訓練好的網路權重來初始化空間流,因為靜態圖像的識別本質是相通的,沒必要從零學。
第二條路徑叫時間流
時間流(Temporal Stream)*:輸入不是原始圖像,而是光流場,專門捕捉畫面中每個像素點在相鄰幀之間的運動方向和速度。
這裡就要提到一個新概念,光流
光流(Optical Flow)*:描述影片中每一個像素點從上一幀移動到下一幀時的位移方向和幅度,通常用兩張圖表示,一張記錄水平方向的位移,一張記錄垂直方向的位移。
時間流輸入的不是普通照片,而是提前用傳統算法計算好的光流圖。這一步很關鍵,因為它相當於把"運動"這個抽象概念,提前翻譯成了一種網路能直接看懂的圖像格式。網路不需要自己去猜兩幀之間發生了什麼變化,光流已經把變化算好擺在那裡了,網路只需要從這些運動模式里學出"這是揮手"還是"這是踢腿"。
這個設計像什麼?
想像你要判斷一段監控錄像里發生了打架還是擁抱。如果只給你一張靜止的照片,兩個人抱在一起,你很難分辨這是友好的擁抱還是激烈的扭打,因為姿態可能長得很像。但如果給你的是"運動軌跡圖",顯示兩人手臂在快速大幅度擺動還是緩慢環抱,答案立刻清晰了。如果不把這兩種資訊分開處理,硬塞給一個網路同時學,網路很可能會被畫面內容帶偏,比如看到兩人靠得很近就傾向於判斷成擁抱,而忽略了真正決定性的運動線索。分流處理的代價是要訓練兩個網路,計算量翻倍,但換來的是每條路徑都能專心把自己的信號學到位,不被另一種資訊干擾。
![雙流網路架構圖]
論文裡的架構圖畫得很直白,左邊空間流吃進單幀圖像,經過一串卷積層後輸出一個動作類別的預測分數,右邊時間流吃進堆疊起來的多幀光流圖,經過類似的卷積結構後也輸出一個預測分數,最後兩邊的分數用某種方式融合成最終答案。這種"分頭判斷,最後投票"的結構,後來成了影片理解領域極其常見的範式。
為什麼要把好幾幀的光流堆在一起
單獨看一幀光流夠不夠?作者的答案是不夠。
一個完整的動作往往持續十幾幀甚至幾十幀,如果時間流每次只看相鄰兩幀算出來的一張光流圖,網路看到的運動資訊片段太短,很難把握動作的整體節奏。比如"揮手"這個動作,手臂從下往上再往下擺動,如果只截取其中極短的一瞬間,可能只捕捉到手臂正在往上抬,這和"舉手"很難區分。
所以論文裡時間流的輸入不是一張光流圖,而是把連續多幀(論文裡用的是 10 幀)計算出來的光流水平分量和垂直分量全部堆疊在一起,作為一個多通道的輸入餵給網路。這樣網路看到的是一小段時間窗口內完整的運動軌跡,而不是某個瞬間的運動快照。
這就好比你想判斷一個人在做深蹲還是摔倒了,只看他膝蓋彎曲那一瞬間的照片是不夠的,你需要看他連續幾秒鐘的動作,才能判斷這個彎曲之後是站起來了還是倒地了。如果不堆疊多幀光流,只餵給網路單幀資訊,網路就像只看了動作的一幀快照,缺乏足夠的時間上下文去判斷動作的走向,容易把節奏不同但姿態相似的動作搞混。
論文裡還專門做了實驗對比堆疊不同幀數光流的效果,發現堆疊幀數增加確實能提升準確率,但收益會逐漸變小,這提示動作識別需要的時間窗口是有限的,不是越長越好。
光流該怎麼算才可靠,作者還糾結了另一件事
時間流依賴光流的質量,如果光流算得不准,後面的網路再強也沒用。計算光流本身是電腦視覺里一個歷史悠久的經典問題,有很多現成算法。作者在論文裡對比了不同光流計算方式對最終識別準確率的影響,發現使用更精細的光流計算方法確實能帶來提升,但差距不算懸殊,說明網路本身對光流質量有一定的容錯能力,不是那種"差之毫厘謬以千里"的脆弱系統。
另外一個細節是,作者還嘗試了給光流圖做一種叫"均值消減"的簡單處理,也就是把每張光流圖減去整體的平均運動,用來消除攝像機本身晃動帶來的整體位移干擾。這個操作背後的邏輯是,很多影片是手持拍攝的,攝像機本身的抖動會給畫面里所有物體帶來一個共同的位移,這個位移和動作本身無關,是噪音。減去這個平均位移之後,剩下的才是物體相對於背景的真實運動,也就是動作本身產生的運動。
這個處理很像你在嘈雜的餐廳里想聽清對面朋友說話,餐廳里的背景噪音是所有聲音的共同底噪,如果不做任何降噪處理,你聽到的是朋友說話聲和背景噪音混在一起的結果,很難分辨清楚。而攝像機抖動造成的整體位移,就是光流場裡的"背景噪音",減去它之後,動作本身的運動信號才能更乾淨地凸顯出來。
兩條路徑的判斷怎麼合併成一個答案
空間流給出一個預測,時間流給出另一個預測,最後怎麼決定最終結果?
論文裡試驗了幾種融合方式,最簡單的是直接把兩條路徑輸出的分類分數做平均,另一種更複雜一點的方式是訓練一個小型的分類器,把兩條路徑的分數當作輸入特徵,學習一個更聰明的組合方式。實驗結果顯示,用訓練出來的融合方式比簡單平均效果更好一些,但差距不是特別大,說明簡單平均已經能捕捉到兩條路徑資訊互補的大部分價值。
這裡有個數據特別值得拎出來說。單獨用空間流,在標準測試集 UCF-101 上能達到大約 73% 的準確率,單獨用時間流能達到大約 83.7%,而把兩者融合之後,準確率跳到了 88% 左右。時間流單獨的表現居然比空間流強了整整 10 個百分點,這個結果本身就很說明問題,運動資訊對判斷動作類別的重要性,甚至超過了畫面內容本身。這也從實驗層面印證了論文最初的判斷,動作的本質是變化,不是靜態的樣子。
數據不夠怎麼辦,作者借了別人家的倉庫
深度網路出了名的"吃數據",而 2014 年的時候,專門用於動作識別的影片數據集規模都不大,最大的 UCF-101 也只有大約 13000 段影片,遠遠不夠訓練一個從零開始的深層網路。
作者的解決辦法是多數據集聯合訓練
多任務學習(Multi-task Learning)*:讓同一個網路同時在多個不同但相關的任務上訓練,共享底層特徵提取能力,只在最後輸出層區分不同任務。
具體來說,他們把 UCF-101 和另一個數據集 HMDB-51 放在一起訓練,網路的大部分結構共享,只在最後加了兩個獨立的輸出分支,分別對應兩個數據集各自的動作類別體系。這樣網路能從兩份數據里學到的運動模式互相借力,即使單個數據集數據量不夠,合在一起訓練出來的特徵也更紮實。
這有點像一個學徒同時在兩家風格不同但技藝相通的木匠鋪子裡打雜學習,單獨在一家店可能接觸到的活兒種類有限,學得慢,但同時在兩家店輪著干,接觸的木料、工具和手法更豐富,反而能更快掌握木工的通用技巧。如果不這樣做,只用單一數據集從零訓練,模型很容易因為數據量不足而過擬合,也就是在訓練集上表現很好,換到新影片上就露餡。
最終成績單和它帶來的震動
論文最後在兩個標準數據集上給出的成績,UCF-101 上達到 88.0% 的準確率,HMDB-51 上達到 59.4%。
這兩個數字放在 2014 年是什麼概念?之前提到的手工特徵方法密集軌跡,在 UCF-101 上大約是 87.9%,幾乎是打了個平手,而在有些改進版的密集軌跡方法上,手工特徵甚至還能略微領先。但這已經是歷史性的一刻,這是深度學習第一次在影片動作識別這個任務上,追平甚至開始逼近手工設計特徵的水平。要知道,在這篇論文之前,純深度學習方法在這個任務上的最好成績普遍卡在 65% 到 70%,雙流網路一下子把這個數字拉高了將近 20 個百分點。
這個分量放到當年的語境裡,不亞於 AlexNet 在 ImageNet 圖像分類比賽上橫空出世那一刻帶來的震動。區別在於,圖像分類的勝利來得更早更響亮,影片動作識別這個戰場,深度學習是晚了兩年才補上這一課。
這篇論文之後,故事怎麼繼續
雙流網路這個思路提出之後,很快成了整個影片理解領域接下來幾年的主流範式,幾乎所有後續工作都在這個骨架上做文章。
2016 年,Feichtenhofer 等人發表的論文進一步研究了空間流和時間流之間應該在網路的哪一層進行資訊交互,而不是等到最後輸出層才簡單融合,他們提出讓兩條路徑在中間層就開始互相傳遞資訊,進一步提升了準確率。
2017 年,Carreira 和 Zisserman(沒錯,Zisserman 本人也參與了這篇後續工作)發表了 I3D 網路,把雙流網路里的 2D 卷積換成了 3D 卷積,直接在三維時空維度上做卷積操作,同時還引入了一個規模遠超以往的大型影片數據集 Kinetics 用於預訓練,把動作識別的準確率又往上推了一大截,在 UCF-101 上達到了 98% 左右的水平。
這兩篇後續工作有一個共同的特點,它們都沒有推翻雙流網路提出的核心洞察,動作識別需要分別捕捉外觀和運動資訊,它們做的是在這個洞察之上,尋找更精細的實現方式。這也從另一個角度說明,雙流網路這篇論文抓住的不是一個技巧性的小改進,而是一個關於影片理解本質的判斷。
Q&A
Q1:雙流卷積網路是什麼?
A:雙流卷積網路是 Simonyan 和 Zisserman 在 2014 年提出的影片動作識別架構,把影片拆成兩條獨立處理路徑,一條空間流負責識別畫面內容,一條時間流通過光流場專門捕捉運動資訊,最後融合兩條路徑的判斷結果。
Q2:雙流網路和之前的手工特徵方法比效果怎麼樣?
A:雙流網路在 UCF-101 數據集上達到 88.0% 準確率,基本追平了當時最強的手工特徵方法密集軌跡(約 87.9%),而在此之前純深度學習方法普遍只有 65% 到 70%,差距被拉近了近 20 個百分點。
Q3:為什麼動作識別需要單獨處理運動資訊,不能只看畫面?
A:因為很多動作單看某一幀畫面幾乎一樣,區別只在於身體部位往哪個方向移動。實驗顯示單獨用時間流(運動資訊)的準確率達到 83.7%,比單獨用空間流(畫面內容)的 73% 還高出 10 個百分點,說明運動資訊對判斷動作類別更關鍵。
寫在後面
看這篇論文最觸動我的地方,是那個 10 個百分點的對比,單獨用時間流比單獨用空間流表現還好。這個結果有點反直覺,因為我們平時理解一個動作,第一反應總是"看起來像什麼",而不是"在往哪個方向移動"。但網路的表現告訴我們,至少對機器來說,運動本身攜帶的資訊量,可能比靜態的樣子更豐富、更少歧義。
這也讓我想到,人類判斷很多事情的時候,是不是也過度依賴了"表面長什麼樣",而低估了"變化的方向"?比如判斷一段關係是不是在變好,看某個瞬間的相處畫面,可能遠不如看這段關係過去幾個月的變化軌跡來得準確。
這篇論文沒解決的問題是,雙流網路的兩條路徑是完全獨立訓練的,資訊只在最後才交換,這多少是一種妥協,如果畫面內容和運動資訊能在更早的階段就互相印證呢?這個問題後來的研究者確實接著追問下去了,但那已經是另一段故事。






