2014年之前,如果你想讓電腦看懂一段影片裡的人在做什麼,最可靠的辦法不是深度學習。
這句話現在聽起來有點奇怪。畢竟深度學習在圖像識別領域已經槓槓的了,2012年AlexNet橫掃ImageNet比賽,把錯誤率從26%砍到15%,整個學術圈都被震了一下。但這股風潮吹到影片領域,卻撞了牆。
當時影片動作識別領域最強的方法,叫做**密集軌跡**
> 密集軌跡(Dense Trajectories):一種手工設計的特徵提取方法,通過跟蹤影片裡密集分布的點隨時間的運動軌跡,再手工計算這些軌跡周圍的圖像特徵,來判斷影片裡發生了什麼動作。
在標準測試集UCF-101上,密集軌跡能做到88%左右的準確率,而當時能找到的深度學習方案,普遍卡在65%到70%之間,差了將近20個百分點。
20個百分點是什麼概念?意味著每5個動作里,深度學習就要比手工方法多認錯1個。這在學術圈是很難看的差距,尤其是深度學習在圖像上已經證明了自己。大家開始懷疑,影片這個領域是不是有什麼深度學習學不來的東西。
牛津大學的Karen Simonyan和Andrew Zisserman盯上了這個問題。他們倆當時同在VGG實驗室,幾個月後就發表了後來大名鼎鼎的VGGNet。也就是說,他們一邊在死磕如何把卷積網路做得更深更強,一邊在琢磨影片這個更難的戰場怎麼打。這兩件事不是巧合,是同一批人在同一時間段,從兩個角度攻打深度學習的邊界。
問題出在哪:影片比圖片多了一個維度
要理解他們的解法,得先搞清楚影片到底比圖片難在哪。
一張圖片,卷積網路要學的是空間資訊:這裡有個輪子的形狀,那裡有個人臉的輪廓,靠這些空間模式拼出"這是一輛車"或者"這是一個人"的判斷。
影片不一樣。影片除了空間資訊,還有時間資訊,也就是畫面是怎麼隨時間變化的。同樣一張"人抬起腿"的靜止畫面,你根本判斷不出這個人是在踢球、在跨欄、還是剛從椅子上站起來。要分辨這些動作,你必須看到腿是往哪個方向移動、移動得多快。
早期把卷積網路搬到影片上的做法,通常是把影片的多幀圖像堆疊起來,直接扔給一個3D卷積網路,讓網路自己去學習時間和空間的規律。聽起來挺合理,但效果不好。原因很簡單:從原始像素堆疊里,直接學出"運動"這個概念,對網路來說太難了。像素的變化里混雜了太多噪聲,光照變化、攝像機抖動、背景雜物移動,網路很難從這堆資訊里提煉出真正有用的運動模式。
這就好比讓一個從沒學過物理的人,直接看著一堆散亂的連續照片,去推算出物體的速度和加速度。理論上資訊都在那兒,但如果沒人告訴他"你可以先算算兩張照片之間每個點挪動了多遠",他很可能永遠也理不出頭緒來。密集軌跡這類手工方法的優勢就在這裡,它們不需要網路自己去發現運動的存在,而是直接把運動資訊用光流的形式餵給了後續的處理流程。
核心思路:把運動直接餵給網路,而不是讓網路自己去發現運動
Simonyan和Zisserman的解法說出來其實很樸素:既然網路自己學運動這麼費勁,那就不要讓它自己學,直接把運動資訊算好了餵給它。
具體怎麼做?他們設計了兩條獨立的卷積網路通路,一條叫**空間流**
> 空間流(Spatial Stream):一個專門處理單幀靜止圖像的卷積網路分支,輸入是影片裡的某一幀RGB圖片,負責識別畫面里的物體、場景、人物外觀等靜態資訊。
另一條叫**時間流**
> 時間流(Temporal Stream):一個專門處理運動資訊的卷積網路分支,輸入不是原始圖像,而是預先計算好的光流場,負責捕捉畫面里物體的運動方向和速度。
這裡最關鍵的一步,是時間流的輸入不是影片幀本身,而是**光流**
> 光流(Optical Flow):描述影片裡每個像素點從一幀到下一幀移動方向和速度的向量場,可以理解成給畫面里每一個點都畫一個箭頭,指出它接下來往哪兒動、動了多遠。
光流是提前用傳統算法計算好的,不是靠網路自己學出來的。這一步相當於把"運動"這個抽象概念,提前翻譯成了一種網路更容易理解的具體數據格式,即一堆方向箭頭。
這個設計思路可以類比成教小孩看地圖。如果你直接把一張沒有任何標註的衛星航拍圖丟給一個從沒接觸過地圖的孩子,讓他自己去分辨哪裡是馬路哪裡是河流,他大概率會一頭霧水,因為原始圖像里資訊太雜,解析度也不勻。但如果你先幫他把馬路用紅線標出來,河流用藍線標出來,他立刻就能看懂地圖在說什麼。光流做的就是這件"預先標註"的工作,它把最重要的運動資訊提前提煉出來,用清晰的箭頭形式呈現給網路,而不是讓網路從原始像素的混沌里自己去摸索。
如果不這麼做會怎樣?論文裡做了對比實驗,答案很直接。單獨只用空間流,也就是只看靜止畫面判斷動作,在UCF-101上的準確率是72.6%。這個數字和當時那些直接堆疊影片幀硬訓3D網路的方法差不多,說明只看靜態外觀確實學不出運動的門道。而把空間流和時間流結合起來,準確率跳到了88.0%,直接追平甚至反超了密集軌跡這個手工方法的戰績。
單看這15個百分點的躍升,就知道運動資訊在動作識別里有多重要,而光流這種顯式提供運動資訊的方式,比讓網路自己瞎猜要有效得多。
雙流網路具體長什麼樣
整個架構後來被稱為**雙流卷積網路**
> 雙流卷積網路(Two-Stream Convolutional Networks):由空間流和時間流兩個獨立的卷積網路分支組成的架構,兩條通路各自處理不同類型的輸入,最後把兩邊的預測結果融合起來,給出最終的動作分類判斷。
兩條通路的網路結構基本是照搬當時圖像分類領域效果最好的架構,跟AlexNet那套卷積加池化再加全連接層的路子差不多。區別只在於輸入不同:空間流吃的是單張RGB圖,通道數是3;時間流吃的是光流場,通常會把連續多幀的光流疊在一起作為輸入,比如把10幀光流的水平和垂直分量堆成20個通道,一次性餵給網路。
兩條流各自獨立訓練,各自輸出一個動作類別的概率分布,最後用簡單的加權平均或者再訓練一個小分類器,把兩邊的結果融合成最終答案。
這裡有個細節值得說一說。研究者在做時間流訓練的時候發現一個問題:標註好的影片動作數據集,數據量不算大,直接拿光流去訓練一個較深的卷積網路,很容易過擬合。他們採用了一個叫**多任務學習**
> 多任務學習(Multi-task Learning):讓同一個網路同時在多個相關任務上訓練,共享底層特徵,以此利用不同數據集的資訊,緩解單一數據集數據量不足的問題。
的技巧,把兩個不同的動作識別數據集合併起來一起訓練時間流網路,共享大部分網路參數,只在最後分類層區分是哪個數據集的任務。這個做法有效緩解了數據不足帶來的過擬合問題。
這就好比一個廚師同時給兩家口味相近的餐廳打工,雖然兩家餐廳的菜單不完全一樣,但基礎的刀工、火候這些底層功夫是通用的。廚師在兩邊輪流練習,反而比只在一家餐廳練習練得更紮實,因為練習的樣本總量變多了。如果沒有這個多任務的技巧,單靠一個數據集的量去餵飽一個較深的網路,大概率會出現網路記住了訓練集裡的特定畫面,卻學不到真正泛化的運動規律。
光流該怎麼表示才好用
時間流具體輸入什麼形式的光流,論文裡也做了細緻的探索。他們對比了好幾種方案。
一種是直接用光流場的原始形式,每個像素點給出水平和垂直兩個方向的位移量。另一種是把光流做歸一化處理,還有一種嘗試是用軌跡堆疊的方式,把光流沿著物體的運動軌跡進行採樣,而不是簡單地在固定網格位置採樣。
實驗發現,用簡單的密集光流疊加多幀的方案,效果已經相當不錯,比更複雜的軌跡對齊方案省事,效果也沒差太多。這也說明了一個道理,有時候簡單粗暴的方案不一定比精巧設計的方案差,尤其是在深度網路本身已經具備一定學習能力的情況下。
論文裡還觀察了一個有意思的現象。他們把光流場的方向做了正反兩種處理,也就是把每個箭頭都反過來看看會怎樣,發現這樣做能進一步提升一點效果,因為這相當於變相擴充了訓練數據,讓網路看到了同一個動作正著來和倒著來的兩種版本,加強了網路對運動方向本身的敏感度而不是死記硬背某個具體方向。
結果和意義:這是深度學習第一次在影片動作識別上贏過手工特徵
把所有實驗數據放在一起看,雙流網路在UCF-101數據集上做到了88.0%的準確率,在另一個常用的HMDB-51數據集上做到了59.4%。這兩個數字,雙雙超過或者追平了當時最強的密集軌跡方法。
| 方法 | UCF-101準確率 | HMDB-51準確率 |
|---|---|---|
| 密集軌跡(手工特徵) | 88.0% | 57.2% |
| 僅空間流 | 72.6% | 40.5% |
| 僅時間流 | 81.2% | 47.1% |
| **雙流網路融合** | **88.0%** | **59.4%** |
這張表格里最能說明問題的是時間流單獨跑出來的81.2%,已經明顯超過空間流的72.6%,證明了運動資訊確實是識別動作的關鍵線索,比單純的外觀資訊更管用。而兩者融合之後,在HMDB-51上比手工特徵還高出了2.2個百分點。
這是深度學習在影片動作識別這個具體任務上,第一次真正打贏手工特徵。這句話放在2014年的語境裡,分量不亞於兩年前AlexNet在圖像識別上的橫空出世。區別是,影片領域這場勝利沒有那麼乾淨利落,深度學習沒有靠一個端到端的網路暴力取勝,而是靠"承認自己在時間維度上學不好,乾脆借用傳統算法算好的光流"這種務實的妥協,才勉強追平戰績。這種帶著妥協色彩的勝利,反而更值得琢磨,它說明了一個道理:深度學習不是萬能鑰匙,有時候和傳統方法結合,效果比硬碰硬要好。
後續的故事:雙流網路開啟了一整條研究路線
雙流網路這個思路一開炮,後面幾年整個影片理解領域基本是沿著這條路往前走。
2015年,Feichtenhofer等人發表了改進雙流網路融合方式的工作,探索了在網路的不同層級把空間流和時間流的特徵提前融合,而不是等到最後才融合兩邊的預測結果,這個改動進一步提升了準確率,證明了兩條流之間的資訊如果能更早地互相交流,效果會更好。
2016年,Wang等人提出了**時間分段網路**
> 時間分段網路(Temporal Segment Networks,TSN):把一段影片切成若干個時間片段,從每個片段里各抽取一幀和一段光流,分別跑雙流網路,再把所有片段的結果匯總,用來解決長影片裡動作發生在哪個時間段不確定的問題。
這個方法把雙流網路的處理範圍從幾幀擴展到了整段影片,進一步把UCF-101的準確率推到了94%以上。
再往後,Carreira和Zisserman(同一個Zisserman)在2017年發表了**I3D網路**
> I3D(Inflated 3D ConvNets):把雙流網路里的2D卷積核直接膨脹成3D卷積核,讓空間流和時間流都能同時處理時間和空間維度,並且藉助大規模影片數據集Kinetics進行預訓練。
I3D把雙流網路的思想和3D卷積結合起來,加上大規模數據集的加持,把這條技術路線的準確率又往上推了一大截,成為後續很長一段時間裡影片理解領域的標準基線模型。
從密集軌跡到雙流網路,再到時間分段網路、I3D,這條脈絡清晰地展示了一個領域是怎麼一步步從手工特徵過渡到深度學習,又是怎麼在深度學習內部不斷疊代改進的。雙流網路在這條脈絡里的位置,是那個關鍵的分水嶺:它證明了深度學習完全可以打贏影片理解這場仗,只是需要找到合適的輸入表示方式。
寫在後面
讀這篇論文最觸動我的一點,是研究者沒有執著於"端到端"這個當時深度學習圈子裡近乎信仰的原則。他們直接承認,網路自己從像素里學運動學不好,乾脆借用傳統算法算好的光流塞進去。這種務實的妥協,在追求純粹端到端學習的年代裡,其實需要一點勇氣去承認。
還有一個細節值得琢磨。反轉光流方向能提升效果這件事,說明網路學到的很可能不是某個具體方向的運動模式,而是運動這件事本身的結構。這讓我想到人類學外語語法的過程,死記硬背例句效果差,理解規律之後隨便換個例子都能套用。網路在這裡似乎也在往"理解規律"的方向靠,而不是單純記住訓練集裡出現過的畫面。
雙流網路沒有解決的問題是,長時間跨度的動作依賴關係,一個持續幾十秒的複雜動作,光靠幾幀光流很難捕捉全貌。這也是後來時間分段網路要解決的事。如果一個動作發生在十分鐘的影片裡,網路要怎麼知道該往哪個時間點看?這個問題現在有了更好的答案,但2014年的雙流網路還沒來得及觸碰它。
Q&A
Q1:雙流卷積網路是什麼?
A:雙流卷積網路是Simonyan和Zisserman在2014年提出的影片動作識別模型,由空間流和時間流兩個獨立的卷積網路分支組成,空間流處理單幀圖像捕捉外觀資訊,時間流處理光流場捕捉運動資訊,兩者結果融合後進行動作分類。
Q2:雙流網路為什麼要用光流而不是直接用影片幀訓練?
A:因為直接讓網路從原始像素堆疊里學習運動模式效果不好,網路很難從噪聲中提煉出真正的運動規律。光流提前用傳統算法算好了每個像素的運動方向和速度,相當於把運動資訊預先翻譯成網路容易理解的格式,實驗證明這樣做能把準確率從72.6%提升到88%。
Q3:雙流網路後來被哪些方法超越了?
A:2015年Feichtenhofer等人改進了融合方式,2016年Wang等人提出時間分段網路把準確率推到94%以上,2017年Carreira和Zisserman提出I3D網路,結合3D卷積和大規模數據集預訓練,成為後續影片理解領域的標準基線模型。






