2014 年,深度學習已經在圖片識別上打得手工特徵毫無還手之力。AlexNet 兩年前橫空出世,把 ImageNet 的錯誤率一下子拉低了十幾個百分點,整個電腦視覺圈子都在往深度學習轉向。
但有一個領域,深度學習死活打不過老方法:影片裡的動作識別。
你給機器看一段影片,問它這個人在幹什麼,跑步、打網球還是在切菜,當時最好的深度學習方案準確率只有 65% 左右,而一個叫做**密集軌跡**
> 密集軌跡:一種手工設計的影片特徵提取方法,通過追蹤影片中密集分布的點的運動軌跡來描述動作,在深度學習出現前是動作識別領域的主流方案。
的手工特徵方法,能做到 87% 左右。
差了 20 個百分點。這是什麼概念?意味著每 5 個動作里,深度學習就要比手工方法多認錯 1 個。這不是小差距,這是一個方向性的潰敗。圖片識別上深度學習贏得乾淨利落,影片動作識別上卻輸得莫名其妙。
問題出在哪?Karen Simonyan 和 Andrew Zisserman 這兩位來自牛津的研究者決定把這件事弄明白。他們的答案後來發表在一篇叫《Two-Stream Convolutional Networks for Action Recognition in Videos》的論文裡,論文標題已經把答案寫出來了:兩條流。
影片比圖片難在哪
先說清楚這件事到底難在哪裡。
識別一張圖片裡有沒有貓,你只需要看清楚形狀、顏色、紋理,這些都是空間資訊,卷積網路處理這類問題已經很拿手了。
但識別一段影片裡的人在做什麼,光看形狀遠遠不夠。一個人站著不動,手臂舉高,你能看出這是在做什麼嗎?如果他是在揮拍,那是打網球;如果他是在揮手,那是在打招呼。區別不在姿勢的靜態形狀,在於這個動作接下來往哪個方向、以什麼速度運動。
換句話說,動作識別的核心資訊藏在**時間維度**里,藏在畫面幀與幀之間的變化里,而不是藏在單幀畫面的空間結構里。
之前的深度學習方案,幾乎都是把影片當成一堆圖片扔進卷積網路,指望網路自己從連續的幀里學出運動的規律。這個想法聽起來合理,但實際效果很差。為什麼?因為卷積網路的卷積核感受野有限,它擅長捕捉局部的空間結構,卻很難從原始像素的時序變化里,直接學出"這個物體在往右上方移動"這種運動模式。
這就像讓一個人通過反覆看一堆沒有編號的照片,去猜出這些照片原本的播放順序和運動軌跡。如果照片本身就是雜亂的像素點,靠觀察顏色變化去反推運動方向,效率極低,你要花大量時間在「這堆像素怎麼排列才對」這件事上,反而沒功夫去想「這個動作到底是什麼」。而如果有人先幫你把每張照片之間物體挪動的方向和速度標好,你一眼就能看出這是揮拍還是揮手。
Simonyan 和 Zisserman 的洞察就在這裡:**運動資訊不該指望網路從原始像素里自己挖出來,應該提前算好,直接餵給網路。**
把動作拆成兩條流
他們的方案叫「雙流網路」
> 雙流網路:一種將影片動作識別任務拆分成兩個獨立卷積網路分別處理的架構,一條處理靜態畫面,一條處理運動資訊,最後把兩條網路的判斷結果融合起來。
具體怎麼拆?
第一條流叫**空間流**,輸入是影片裡單獨一幀的靜態圖像,負責識別畫面里有什麼東西,人、球拍、球場,這條流本質上就是一個普通的圖片分類網路,可以直接借用已經在 ImageNet 上訓練好的模型,因為識別物體這件事,圖片網路已經很擅長。
第二條流叫**時間流**,這才是整篇論文的關鍵創新。它的輸入不是原始畫面,而是**光流場**。
> 光流場:描述影片中相鄰兩幀之間,畫面里每一個點的運動方向和運動速度的一種圖像表示,本質上是一張記錄了「誰往哪兒動了多快」的地圖。
光流場是怎麼算出來的?拿兩張相鄰的影片幀,對比每個像素點的位置變化,用傳統的光流計算算法把這個變化提取出來,變成一張新的圖。這張圖里不再是顏色和形狀資訊,而是純粹的運動方向和運動強度資訊。
把光流圖餵給一個卷積網路,這個網路學的不是「這是什麼東西」,而是「這個東西在往哪個方向、以什麼方式運動」。
這裡有個特別值得展開的設計細節:他們不是只用兩幀之間的光流,而是把連續多幀,論文裡用了 10 幀,的光流場堆疊在一起,作為時間流網路的輸入。為什麼要堆疊多幀而不是用一幀就夠?因為一瞬間的運動方向可能有噪聲,或者不足以代表一個完整動作的特徵,比如揮拍這個動作,你只看其中一瞬間的手部移動,可能會跟揮手搞混,但看連續十幀的運動軌跡,揮拍的弧線和揮手的直線擺動就區分得很清楚了。
這就像你看一場足球比賽的慢動作回放,如果只給你一幀畫面,你可能猜不出這腳是要傳球還是要射門,但如果給你連續十幀的球和腳的運動軌跡,一下就能看出這是一次大力抽射還是輕輕一磕的傳球。如果不堆疊多幀,只看單張光流圖,網路就會像只看了一幀回放的觀眾,經常在動作方向相近但性質不同的動作之間犯迷糊。
兩條流怎麼合起來
空間流告訴網路畫面里有什麼,時間流告訴網路東西在怎麼動,最後這兩條網路各自輸出一個分類預測結果,然後**融合**這兩個結果,得到最終判斷。
論文裡試了幾種融合方式,最簡單的是直接平均兩條流的預測分數,另一種是訓練一個額外的分類器(比如 SVM)把兩條流的輸出特徵拼起來再判斷。實驗發現後一種效果更好一些,但差距不算特別懸殊,這說明兩條流各自已經學得足夠好,融合方式本身不是決定成敗的關鍵,兩條流的分工才是。
這裡有個很實際的問題:光流計算需要用到傳統算法,這在當時的計算條件下並不便宜,影片一多,算光流的時間成本會很高。研究者也測試了如果用更粗糙、計算更快的光流算法會怎樣,發現精度會有一些損失,但沒有想像中那麼嚴重,這說明網路對光流的精度有一定的容忍度,不需要完美的光流才能工作。
數據說話:兩條流到底誰更強
論文在兩個標準的動作識別數據集上做了實驗,UCF-101 和 HMDB-51,這是當時學術界公認的兩個動作識別基準測試集。
| 方法 | UCF-101 準確率 | HMDB-51 準確率 |
|---|---|---|
| 只用空間流 | 72.6% | 40.5% |
| 只用時間流 | 81.0% | 54.6% |
| **雙流融合(平均)** | **86.9%** | **58.0%** |
| 雙流融合(SVM) | **87.0%** | **59.4%** |
| 之前最好的手工特徵方法 | 87.9% | 61.1% |
先看單獨用空間流的效果:72.6%。這個數字比整體方案低了 14 個百分點,說明如果只看靜態畫面,網路確實抓不住動作的本質,它能認出畫面里有人有球拍,但認不出這個人到底是在發球還是接球。
單獨用時間流的效果反而更好,81.0%,比空間流高了將近 9 個百分點。這個結果本身就很說明問題:**運動資訊比靜態外觀資訊,對動作識別更重要。**
兩條流融合之後,跳到 86.9%到 87.0%,比單獨用任何一條流都高出至少 6 個百分點。這證明兩條流確實是互補的,一條負責看清是什麼,一條負責看清怎麼動,合在一起才是完整的判斷。
再看最後一行,當時最好的手工特徵方法是 87.9%,雙流網路的 87.0% 已經追到只差不到 1 個百分點,在 HMDB-51 上差距是 1.7 個百分點。
這個結果放在 2014 年,意義不亞於 AlexNet 在圖片分類上的突破。這是深度學習第一次在影片動作識別任務上追平手工特徵的水平,雖然還沒有真正超過,但差距已經小到可以忽略,而且這是一個全新的方向,還有巨大的優化空間。要知道幾個月前,深度學習在這個任務上還落後 20 個百分點,雙流網路一下把差距縮小到 1 個百分點左右,這個躍升速度本身就說明了拆分「看什麼」和「怎麼動」這個思路抓住了問題的根本。
有意思的是,Simonyan 和 Zisserman 幾個月後又發表了 VGGNet,那篇論文靠更深的卷積網路架構統治了當年的 ImageNet 圖片分類比賽。兩篇論文出自同一批人,同一個時間段,這不是巧合,他們顯然是同時在探索「更深的網路能不能帶來更好的特徵」和「不同類型的輸入該怎麼拆分處理」這兩條線,一條線走向了更深的網路,一條線走向了多流架構,殊途同歸地都在推動深度學習往前走。
這個思路後來走到哪兒了
雙流網路這個思路提出以後,被後續研究反覆驗證和擴展。
2015 年,Feichtenhofer 等人發表了《Convolutional Two-Stream Network Fusion for Video Action Recognition》,這篇論文沒有停留在最後一步簡單融合兩條流的輸出,而是探索在網路中間層就把兩條流的特徵交叉融合,讓空間資訊和時間資訊更早地互相影響,結果把 UCF-101 上的準確率進一步推高,證明了雙流架構還有很大的優化空間。
更值得一提的是 2017 年 DeepMind 團隊發表的《Quo Vadis, Action Recognition》,提出了 I3D 網路。這篇論文把雙流網路的思路和三維卷積結合起來,直接用三維卷積網路處理連續幀序列,同時保留雙流結構(一條處理 RGB 畫面,一條處理光流),在更大規模的 Kinetics 數據集上把動作識別的準確率大幅提升,也證明了雙流架構不是一個只能在小數據集上奏效的技巧,而是一個能隨著數據規模擴大繼續發揮作用的基礎設計。
這兩個後續工作有一個共同點:它們都沒有推翻雙流架構的核心假設,把靜態外觀和運動資訊分開處理這件事是對的,它們做的是在這個假設之上,用更巧妙的方式融合、用更強的網路結構去實現。這從另一個角度說明,Simonyan 和 Zisserman 當年抓住的那個方向性判斷,經受住了後續幾年的考驗。
寫在後面
這篇論文最打動我的地方,不是準確率數字本身,是那個最初的判斷:網路學不出運動資訊,那就別逼它學,直接把答案算好餵給它。
這背後有一層更普遍的思考:深度學習不是萬能的自動特徵提取器,它擅長從數據里挖掘某一類結構,但對另一類結構可能完全無能為力。承認這一點,然後針對性地幫它一把,往往比死磕「端到端全自動」更有效。後來很多領域的突破,比如給語言模型加檢索模組,給推薦系統加顯式的用戶行為特徵,某種程度上都是同一個邏輯:先搞清楚模型天生擅長什麼、不擅長什麼,再決定要不要人工介入。
論文裡空間流和時間流各自的準確率差了近 9 個點,這個差距本身也值得琢磨:一個號稱在做「動作識別」的任務,光靠看清楚畫面里有什麼東西,是遠遠不夠的。這提醒我們,很多任務的名字會誤導你對它本質的理解。
Q&A
Q1:雙流網路是什麼?
A:雙流網路是 Simonyan 和 Zisserman 在 2014 年提出的影片動作識別方法,把影片拆成兩條卷積網路分別處理,一條處理單幀靜態畫面識別物體外觀,一條處理光流場識別運動資訊,最後融合兩條網路的判斷結果。
Q2:雙流網路比之前的方法好在哪?
A:在提出之前,深度學習方法在動作識別上只有 65% 左右準確率,比手工特徵方法的 87% 低了 20 個百分點。雙流網路把準確率提升到 87% 左右,幾乎追平了當時最好的手工特徵方法,是深度學習第一次在這個任務上接近手工方法水平。
Q3:為什麼要單獨設計一條處理光流的時間流?
A:因為動作識別的核心資訊在於運動方向和速度,而不是單幀畫面的靜態外觀,卷積網路很難直接從原始像素里學出運動模式,提前計算好光流場再餵給網路,能讓網路專注學習運動特徵,效果比單純堆圖片幀好很多。






