2014 年秋天,如果你去問一個做電腦視覺的研究者「深度學習能不能識別影片裡的動作」,大概率會得到一個謹慎的搖頭。
這聽起來有點奇怪。因為就在兩年前,AlexNet
已經在圖像分類上把傳統方法打得七零八落,深度學習明明已經證明了自己。可是一旦換成影片,情況完全反轉了。
當時最強的手工特徵方法叫做密集軌跡
> 密集軌跡*:一種手工設計的影片特徵提取方法,通過跟蹤影片裡密集分布的點的運動軌跡,再結合方向梯度、光流等資訊,拼出一套描述動作的特徵。
密集軌跡在標準測試集 UCF-101
上能做到 85.9% 的準確率。而當時所有嘗試用深度學習做影片動作識別的方法,最好的也只能到 65% 左右,差了整整 20 個百分點。
20 個百分點的差距是什麼概念?意味著每 5 個動作識別任務里,深度學習就要比手工方法多認錯 1 個。這不是小數點後的差距,這是量級上的落後。深度學習在圖像上贏了,但一到影片,突然就變成了那個考試不及格的學生。
問題出在哪兒?這就是這篇論文,Karen Simonyan
和 Andrew Zisserman
在 2014 年發表的《Two-Stream Convolutional Networks for Action Recognition in Videos》,要回答的核心問題。
影片比圖片難在哪
先說清楚一件事:影片不是圖片的簡單堆疊。
一張圖片有空間資訊,誰在哪兒、長什麼樣、顏色是什麼。但一段影片除了空間資訊,還有時間資訊,誰在往哪個方向動、動得多快。
早期把深度學習用到影片上的思路很直接:把影片的每一幀當成一張圖片,或者把好幾幀疊在一起塞進一個 3D 卷積網路,讓網路自己去學習空間和時間的規律。
這個思路聽起來沒問題,但實際效果很差。為什麼?
因為卷積網路本身是為靜態圖像設計的,它擅長學習「這是什麼」,邊緣、紋理、形狀。但要讓同一個網路同時學會「這是什麼」和「這在怎麼動」,相當於讓一個人同時用左手寫毛筆字、右手彈鋼琴,還要求兩隻手配合得天衣無縫。網路的參數空間被迫承擔兩種性質完全不同的任務,結果兩頭都沒學好。
更現實的問題是數據量。圖像分類數據集 ImageNet 有上百萬張標註圖片,而當時最大的影片動作數據集 UCF-101 只有一萬三千段影片。用遠遠不夠的數據,去訓練一個既要學空間又要學時間的複雜網路,註定會過擬合,學不到真正有用的運動規律。
Simonyan 和 Zisserman 的洞察是,如果一個網路很難同時學好兩件事,那就別讓它同時學。分開練。
核心方法:把影片拆成兩條流
這篇論文的核心思路,叫做雙流網路
> 雙流網路*:把影片識別任務拆成兩個獨立的卷積網路,一個專門處理靜態畫面(空間流),一個專門處理運動資訊(時間流),最後把兩邊的判斷結果融合起來。
具體怎麼拆?
空間流網路吃的是影片裡單獨的一幀畫面,就是一張普通的 RGB 圖片。它的任務和傳統圖像分類一模一樣,識別畫面里有什麼物體、什麼場景。比如看到一片草地和一個足球,它能大概猜出這可能和踢球有關。這部分完全可以借用已經在 ImageNet 上訓練好的圖像分類網路,直接遷移過來用,這就巧妙地繞開了影片數據不夠用的問題。
時間流網路吃的不是原始畫面,而是光流場
> 光流場*:描述影片裡每個像素點從上一幀到下一幀移動方向和速度的一種圖像化表示,本質上是把「運動」這件事變成了一張可以輸入給卷積網路的圖片。
光流場把每個像素的水平位移和垂直位移分別存成兩張圖,堆疊起來形成一個多通道輸入,通常論文裡選擇堆疊 10 幀的光流,也就是 20 個通道。這個網路專門學習「動作的模式」,完全不看畫面里的物體是什麼,只看運動軌跡是怎麼展開的。
兩個網路各自算出一個分類結果,最後用一個簡單的方法把兩邊的分數融合起來,可以是直接平均,也可以是再訓練一個小的分類器(論文裡用的是支持向量機)去學習怎麼組合兩邊的輸出。
這個設計乍一聽簡單,甚至有點笨,為什麼不讓一個網路把所有事都幹了?但恰恰是這種「拆開」的笨辦法,解決了前面提到的兩個根本矛盾:一個網路學不好兩種不同性質的資訊,以及可用的影片數據量太少。
這就像一個餐廳要同時處理"這道菜好不好吃"和"上菜速度快不快"兩件事。如果讓一個大廚同時負責炒菜和跑腿送餐,結果往往是兩件事都做不好,菜可能湊合能吃,但送到桌上已經涼了,速度也快不起來。聰明的做法是分成兩個崗位,廚師專心炒菜,服務生專心送餐,最後顧客拿到的是一份又快又好的完整體驗。如果不分開,廚房效率不會提升,反而兩頭拖累。雙流網路就是把「認物體」和「認動作」分給兩個專家去干,而不是逼一個網路身兼兩職。

看這張結構圖,你會發現兩條流的網路結構其實是一樣的,都是標準的卷積網路架構,唯一的區別是輸入數據的性質不同,一個是圖像,一個是運動場。這個對稱的設計說明了一件事:作者沒有針對某一路做特殊的網路結構優化,他們把差異完全放在了輸入數據的預處理上,而不是網路架構本身。這是一種很乾淨的思路,把問題拆解到最本質的層面。
時間流網路:怎麼處理光流才最好
光流這個東西看起來簡單,實際處理起來有很多細節,論文花了大量篇幅做對比實驗,來確定「怎麼餵光流給網路效果最好」。
第一個問題是光流該怎麼表示。論文對比了兩種方式,一種是把光流當成正常的圖像,取值範圍裁剪壓縮到 0 到 255;另一種是不做壓縮,直接用原始的浮點數值。實驗發現,用未經壓縮的光流效果明顯更好。這個細節很容易被忽略,但它說明了一個道理:把連續的物理量強行塞進圖像的表示框架里,會丟失掉一些關鍵資訊,運動的細微差別可能就在這個壓縮過程中被磨平了。
第二個問題是要不要減去相機自身的運動。如果攝像機在移動,畫面里所有東西看起來都在「動」,這會干擾網路對真實動作的判斷。論文嘗試了減去平均光流來消除相機運動的影響,結果顯示這確實能提升一點效果,但提升幅度不算特別大,說明網路本身已經具備一定的抗干擾能力,但顯式地處理一下依然是有收益的。
第三個問題,也是最關鍵的一個,是要堆疊多少幀的光流。論文測試了從 5 幀到 10 幀不同的堆疊長度,發現堆疊幀數越多,效果越好,但到 10 幀左右開始收益遞減。這個結果符合直覺:動作是有持續性的,只看一瞬間的運動方向很容易被噪聲干擾,但看一小段時間窗口內的運動趨勢,資訊就穩定多了。這就跟你判斷一個人是在往前走還是不小心絆了一下類似,只看一幀的腳步動作可能判斷錯,但看連續十幾幀的軌跡,答案就清楚了。如果只用單幀光流,網路就像只看了一張照片就要猜一個人接下來要做什麼,資訊量根本不夠,論文的實驗也證實了這一點,單幀光流的效果明顯弱於堆疊多幀。
論文還測試了雙向光流,就是同時計算「上一幀到這一幀」和「這一幀到下一幀」兩個方向的運動,結果發現雙向光流比單向略有提升,說明運動資訊在時間上是雙向對稱的,動作的「來」和「去」都包含有用的線索。
實驗結果:數據說話
論文在兩個標準數據集上做了測試,UCF-101 和 HMDB-51
,這兩個都是當時動作識別領域最常用的基準數據集。
結果非常清楚。
| 方法 | UCF-101 準確率 | HMDB-51 準確率 |
|---|---|---|
| 空間流單獨 | 72.6% | 40.5% |
| 時間流單獨 | 81.0% | 54.6% |
| **雙流網路融合** | **88.0%** | **59.4%** |
| 密集軌跡(手工特徵,此前最佳) | 85.9% | 57.2% |
這組數字資訊量很大,值得拆開看。
如果只用空間流,也就是只看單幀畫面識別動作,準確率是 72.6%,這大概相當於讓一個人只看一張照片猜這是什麼運動,很多時候畫面里有個球場就猜踢球,有水就猜游泳,粗糙但也不是完全瞎猜。
如果只用時間流,也就是只看運動模式不看畫面內容,準確率反而更高,達到 81.0%。這個結果本身就很說明問題:對於動作識別這個任務,運動的模式往往比畫面內容更關鍵。跑步和走路的畫面背景可能一樣,但腿部擺動的頻率和幅度完全不同,這才是區分動作的核心線索。
而當兩條流融合起來,準確率跳到 88.0%,超過了當時最強的手工特徵方法密集軌跡的 85.9%。這就是文章開頭提到的那個時刻,深度學習在影片動作識別上第一次超過了手工設計的特徵方法。這個意義不亞於兩年前 AlexNet 在圖像分類上引發的震動,只是這次戰場換到了影片。
一個有意思的細節,Simonyan 和 Zisserman 這兩位作者,跟同年提出 VGGNet
的團隊是同一個實驗室,牛津大學的視覺幾何組
。VGGNet 那篇論文和雙流網路這篇論文差不多是同期完成的工作,都體現了這個組當時對卷積網路結構和應用的深入探索。這不是巧合,而是同一批人在圖像和影片兩條線上同時推進的結果。
這篇論文之後發生了什麼
雙流網路提出之後,成了後續很多工作的起點,幾個比較重要的延伸方向值得說一說。
3 年後,Feichtenhofer 等人在 2016 年提出了一種改進的融合方式,他們發現原始雙流網路里兩條流是在最後才融合分數,資訊交流太晚了。他們提出在網路中間層就讓兩條流相互交換資訊,這個改進進一步提升了準確率。
另一個重要的後續是 Carreira 和 Zisserman(還是 Zisserman)在 2017 年提出的 I3D 網路
> I3D*:把雙流網路的思路和 3D 卷積結合起來,用大規模影片數據集 Kinetics 做預訓練,進一步提升了動作識別的準確率和泛化能力。
I3D 本質上繼承了雙流的框架,兩條流的結構沒變,但把每條流內部的 2D 卷積換成了 3D 卷積,讓網路能夠直接在時間維度上做卷積操作,同時藉助更大規模的數據集來解決當年 UCF-101 數據量不足的老問題。這個工作把動作識別的準確率進一步推高,也成為後續很長一段時間裡的標準基準方法。
光流的計算本身也在後續工作里被重新思考。早期雙流網路依賴傳統算法計算光流,這個過程計算量很大、速度慢。後來有研究者嘗試用另一個神經網路直接學習估計光流,把整個流程變成端到端可訓練的系統,減少了對手工設計的光流算法的依賴。
這幾條脈絡說明雙流網路提出的「分而治之」思路,在後續幾年裡被不斷驗證、優化、和更大的數據、更強的算力結合,逐漸從一個巧妙的工程方案演變成了這個領域的標準範式。
寫在後面
讀這篇論文最讓我觸動的一點,是那組「時間流比空間流准得多」的數據,81% 對 72.6%。這多少打破了一個直覺:我們本能地覺得「認出畫面里是什麼」應該比「判斷東西怎麼動」更容易也更重要,畢竟人類識別物體的能力似乎是更基礎的能力。但對動作識別這個特定任務來說,動作本身的運動模式才是更強的信號,背景和物體反而是干擾項。
這讓我想到一個更普遍的問題:我們在設計任何識別系統的時候,有沒有先問過「對這個任務而言,什麼才是真正的核心信號」,還是想當然地把所有能拿到的資訊一股腦塞給模型,指望它自己去分辨主次。雙流網路的成功某種程度上是因為作者先做了這個判斷,才決定把任務拆開。
一個沒有被這篇論文解決、後來也一直在被追問的問題是:光流的計算本身依賴手工設計的算法,這個環節始終是個瓶頸。如果能有一種方式,讓網路完全端到端地從原始像素里學出等價於光流的運動表示,會不會比現在的方案更好?這個問題後來催生了不少工作,但至今也沒有一個公認的完美答案。
Q&A
Q1:雙流卷積網路是什麼?
A:雙流卷積網路是 Simonyan 和 Zisserman 在 2014 年提出的影片動作識別方法,把影片識別拆成兩個獨立的卷積網路,一個專門處理單幀畫面(空間流),一個專門處理光流場表示的運動資訊(時間流),最後融合兩邊的判斷結果,在當時首次讓深度學習方法在動作識別準確率上超過了手工特徵方法。
Q2:為什麼不用一個網路同時處理空間和時間資訊?
A:因為空間資訊(畫面內容)和時間資訊(運動模式)性質完全不同,讓同一個網路同時學習兩種任務,容易兩頭都學不好,而且當時影片數據量遠小於圖像數據量,複雜網路容易過擬合。分成兩個網路分別訓練,空間流還能直接借用已訓練好的圖像分類網路,效果更好。
Q3:雙流網路的效果具體好在哪裡?
A:在 UCF-101 數據集上,雙流網路融合後達到 88.0% 準確率,超過當時最強的手工特徵方法密集軌跡的 85.9%。單獨用時間流(81.0%)效果就比單獨用空間流(72.6%)更好,說明運動模式對動作識別比畫面內容更關鍵。






