百度工程師漫談視頻理解

語言: CN / TW / HK

作者 | FesianXu

導讀

AI算法已經滲入到了我們生活的方方面面,無論是購物推薦,廣告推送,搜索引擎還是多媒體影音娛樂,都有AI算法的影子。作為多媒體中重要的信息載體,視頻的地位可以説是數一數二的,然而目前對於AI算法在視頻上的應用還不夠成熟,理解視頻內容仍然是一個重要的問題亟待解決攻克。本文對視頻理解進行一些討論,雖然只是筆者對互聯網的一些意見的彙總和漫談,有些內容是筆者自己的學習所得,希望還是能對諸位讀者有所幫助。

全文37074字,預計閲讀時間93分鐘。

完整長文可點擊查看:百度工程師漫談視頻理解

為什麼是視頻

以視頻為代表的動態多媒體,結合了音頻,視頻,是當前的,更是未來的互聯網流量之王。 根據來自於國家互聯網信息辦公室的中國互聯網絡發展狀況統計報告[1]

截至 2018 年 12 月,網絡視頻、網絡音樂和網絡遊戲的用户規模分別為 6.12 億、5.76 億和 4.84 億,使用率分別為 73.9%、69.5%和 58.4%。短視頻用户規模達 6.48 億,網民使用比例為 78.2%。截至 2018 年 12 月,網絡視頻用户規模達 6.12 億,較 2017 年底增加 3309 萬,佔網民 整體的 73.9%;手機網絡視頻用户規模達 5.90 億,較 2017 年底增加 4101 萬,佔手機 網民的 72.2%。

其中各類應用使用時長佔比如圖Fig 1.1所示:

apps_pros

<div align='center'> <b> Fig 1.1 2018年各類應用使用時長佔比。 </b> </div>

我們很容易發現,包括短視頻在內的視頻用户時長佔據了約20%的用户時長,佔據了絕大多數的流量,同時網絡視頻用户的規模也在逐年增加。

互聯網早已不是我們20年前滴滴答答撥號上網時期的互聯網了,互聯網的接入速率與日俱增,如Fig 1.2所示。視頻作為與人類日常感知最為接近的方式,比起單獨的圖片和音頻,文本,能在單位時間內傳遞更多的信息,從而有着更廣闊的用户黏性。在單位流量日漸便宜,並且速度逐漸提升的時代,視頻,將會撐起未來媒體的大旗。

download_rate

<div align='center'> <b> Fig 1.2 固定帶寬/4G平均下載速率變化曲線 </b> </div>

的確,我們現在是不缺視頻的時代,我們有的是數據,大型公司有着廣大的用户基礎,每天產生着海量的數據,這些海量的數據,然而是可以產生非常巨大的價值的。以色列歷史學家尤瓦爾·赫拉利在其暢銷書《未來簡史》和《今日簡史》中,描述過一種未來的社會,在那個社會中,數據是虛擬的黃金,壟斷着數據的公司成為未來的umbrella公司,控制着人們的一言一行,人們最終成為了數據和算法的奴隸。儘管這個描述過於駭人和科幻,然而這些都並不是空穴來風,我們能知道的是,從數據中,我們的確可以做到很多事情,我們可以通過數據進行用户畫像描寫,知道某個用户的各個屬性信息,知道他或她喜愛什麼,憎惡什麼,去過何處,欲往何方。我們根據用户畫像進行精確的廣告推送,讓基於大數據的算法在無形中控制你的購物習慣也不是不可能的事情。數據的確非常重要,然而可惜的是,目前AI算法在視頻——這個未來媒體之王上的表現尚不是非常理想(當前在sports-1M上的R(2+1)D模型[7]的表現不足80%,不到可以實用的精度。),仍有很多問題亟待解決,然而未來可期,我們可以預想到,在視頻上,我們終能成就一番事業。

理解視頻——嗯,很複雜

利用視頻數據的最終目標是讓算法理解視頻。理解視頻(understanding the video) 是一件非常抽象的事情,在神經科學尚沒有完全清晰的現在,如果按照人類感知去理解這個詞,我們終將陷入泥淖。我們得具體點,在理解視頻這個任務中,我們到底在做什麼?首先,我們要知道對比於文本,圖片和音頻,視頻有什麼特點。視頻它是動態的按照時間排序的圖片序列,然而圖片幀間有着密切的聯繫,存在上下文聯繫;視頻它有音頻信息。因此進行視頻理解,我們勢必需要進行時間序列上的建模,同時還需要空間上的關係組織。

就目前來説,理解視頻有着諸多具體的子任務:

  1. 視頻動作分類:對視頻中的動作進行分類

  2. 視頻動作定位:識別原始視頻中某個動作的開始幀和結束幀

  3. 視頻場景識別:對視頻中的場景進行分類

  4. 原子動作提取

  5. 視頻文字説明(Video Caption):給給定視頻配上文字説明,常用於視頻簡介自動生成和跨媒體檢索

  6. 集羣動作理解:對某個集體活動進行動作分類,常見的包括排球,籃球場景等,可用於集體動作中關鍵動作,高亮動作的捕獲。

  7. 視頻編輯。

  8. 視頻問答系統(Video QA):給定一個問題,系統根據給定的視頻片段自動回答

  9. 視頻跟蹤:跟蹤視頻中的某個物體運動軌跡

  10. 視頻事件理解:不同於動作,動作是一個更為短時間的活動,而事件可能會涉及到更長的時間依賴

    ...

當然理解視頻不僅僅是以上列出的幾種,這些任務在我們生活中都能方方面面有所體現,就目前而言,理解視頻可以看成是解決以上提到的種種問題。

通常來説,目前的理解視頻主要集中在以人為中心的角度進行的,又因為視頻本身是動態的,因此描述視頻中的物體隨着時間變化,在進行什麼動作是一個很重要的任務,可以認為動作識別在視頻理解中佔據了一個很重要的地位。因此本文的理解視頻將會和視頻動作理解大致地等價起來,這樣可能未免過於粗略,不過還是能提供一些討論的地方的。

視頻分析的主要難點集中在:

  1. 需要大量的算力,視頻的大小遠大於圖片數據,需要更大的算力進行計算。
  2. 低質量,很多真實視頻拍攝時有着較大的運動模糊,遮擋,分辨率低下,或者光照不良等問題,容易對模型造成較大的干擾。
  3. 需要大量的數據標籤!特別是在深度學習中,對視頻的時序信息建模需要海量的訓練數據才能進行。時間軸不僅僅是添加了一個維度那麼簡單,其對比圖片數據帶來了時序分析,因果分析等問題。

視頻動作理解——新手村

視頻數據模態

然而視頻動作理解也是一個非常廣闊的研究領域,我們輸入的視頻形式也不一定是我們常見的RGB視頻,還可能是depth深度圖序列,Skeleton關節點信息,IR紅外光譜等。

multiple_video_modality

<div align='center'> <b> Fig 3.1 多種模態的視頻形式 </b> </div>

就目前而言,RGB視頻是最為易得的模態,然而隨着很多深度攝像頭的流行,深度圖序列和骨骼點序列的獲得也變得容易起來[2]。深度圖和骨骼點序列對比RGB視頻來説,其對光照的敏感性較低,數據宂餘較低,有着許多優點。

關於骨骼點序列的採集可以參考以前的博文[2]。我們在本文討論的比較多的還是基於RGB視頻模態的算法。


視頻動作分類數據集

現在公開的視頻動作分類數據集有很多,比較流行的in-wild數據集主要是在YouTube上採集到的,包括以下的幾個。

  • HMDB-51,該數據集在YouTube和Google視頻上採集,共有6849個視頻片段,共有51個動作類別。

  • UCF101,有着101個動作類別,13320個視頻片段,大尺度的攝像頭姿態變化,光照變化,視角變化和背景變化。

ucf101

  • sport-1M,也是在YouTube上採集的,有着1,133,157 個視頻,487個運動標籤。

sports1m

  • YouTube-8M, 有着6.1M個視頻,3862個機器自動生成的視頻標籤,平均一個視頻有着三個標籤。

  • YouTube-8M Segments[3],是YouTube-8M的擴展,其任務可以用在視頻動作定位,分段(Segment,尋找某個動作的發生點和終止點),其中有237K個人工確認過的分段標籤,共有1000個動作類別,平均每個視頻有5個分段。該數據集鼓勵研究者利用大量的帶噪音的視頻級別的標籤的訓練集數據去訓練模型,以進行動作時間段定位。

youtube8M

  • Kinectics 700,這個系列的數據集同樣是個巨無霸,有着接近650,000個樣本,覆蓋着700個動作類別。每個動作類別至少有着600個視頻片段樣本。

以上的數據集模態都是RGB視頻,還有些數據集是多模態的:

  • NTU RGB+D 60: 包含有60個動作,多個視角,共有約50k個樣本片段,視頻模態有RGB視頻,深度圖序列,骨骼點信息,紅外圖序列等。
  • NTU RGB+D 120:是NTU RGB+D 60的擴展,共有120個動作,包含有多個人-人交互,人-物交互動作,共有約110k個樣本,同樣是多模態的數據集。

在深度學習之前

視頻長度不定,一般我們不直接對整段視頻進行分析或者處理,我們一般對視頻進行採樣,比如把整段視頻分成若干個片段(clip),這些片段可能是定長的,比如每個片段都是10幀,也可能不是,我們通常會對每個片段進行處理,然後想辦法把不同片段的處理結果融合起來,形成最終對整個視頻的處理結果。不管怎麼樣,我們在接下來説的片段時,我們就應該知道這個片段是對某個視頻的採樣。

在深度學習之前,CV算法工程師是特徵工程師,我們手動設計特徵,而這是一個非常困難的事情。手動設計特徵並且應用在視頻分類的主要套路有:

特徵設計:挑選合適的特徵描述視頻

  1. 局部特徵(Local features):比如HOG(梯度直方圖 )+ HOF(光流直方圖)
  2. 基於軌跡的(Trajectory-based):Motion Boundary Histograms(MBH)[4],improved Dense Trajectories (iDT) ——有着良好的表現,不過計算複雜度過高。

集成挑選好的局部特徵: 光是局部特徵或者基於軌跡的特徵不足以描述視頻的全局信息,通常需要用某種方法集成這些特徵。

  1. 視覺詞袋(Bag of Visual Words,BoVW),BoVW提供了一種通用的通過局部特徵來構造全局特徵的框架,其受到了文本處理中的詞袋(Bag of Word,BoW)的啟發,主要在於構造詞袋(也就是字典,碼錶)等。

BoVW

  1. Fisher Vector,FV同樣是通過集成局部特徵構造全局特徵表徵。具體詳細內容見[5]

FV

要表徵視頻的時序信息,我們主要需要表徵的是動作的運動(motion)信息,這個信息通過幀間在時間軸上的變化體現出來,通常我們可以用光流(optical flow)進行描述,如TVL1和DeepFlow。

optical_flow

在深度學習來臨之前,這些傳統的CV算法在視頻動作理解中佔了主要地位,即便是如今在深度學習大行其道的時代,這些傳統的算子也沒有完全退出舞台,很多算法比如Two Stream Network等還是會顯式地去使用其中的一些算子,比如光流,比如C3D也會使用iDT作為輔助的特徵。瞭解,學習研究這些算子對於視頻分析來説,還是必要的。


深度學習時代

在深度學習時代,視頻動作理解的主要工作量在於如何設計合適的深度網絡,而不是手動設計特徵。我們在設計這樣的深度網絡的過程中,需要考慮兩個方面內容:

  1. 模型方面:什麼模型可以最好的從現有的數據中捕獲時序和空間信息。
  2. 計算量方面:如何在不犧牲過多的精度的情況下,減少模型的計算量。

組織時序信息是構建視頻理解模型的一個關鍵點,Fig 3.2展示了若干可能的對多幀信息的組織方法。[6]

  1. Single Frame,只是考慮了當前幀的特徵,只在最後階段融合所有的幀的信息。
  2. Late Fusion,晚融合使用了兩個共享參數的特徵提取網絡(通常是CNN)進行相隔15幀的兩個視頻幀的特徵提取,同樣也是在最後階段才結合這兩幀的預測結果。
  3. Early Fusion,早融合在第一層就對連續的10幀進行特徵融合。
  4. Slow Fusion,慢融合的時序感知野更大,同時在多個階段都包含了幀間的信息融合,伴有層次(hierarchy)般的信息。這是對早融合和晚融合的一種平衡。

在最終的預測階段,我們從整個視頻中採樣若各個片段,我們對這採樣的片段進行動作類別預測,其平均或者投票將作為最終的視頻預測結果。

fusions

<div align='center'> <b> Fig 3.2 融合多幀信息的不同方式。 </b> </div>

最終若干個幀間信息融合的方法在sport-1M測試集上的結果如Fig 3.3所示:

fusion_exp

<div align='center'> <b> Fig 3.3 不同幀間融合方法在sport-1M數據集上的表現。 </b> </div>

另外説句,[6]的作者從實驗結果中發現即便是時序信息建模很弱的Single-Frame方式其準確率也很高,即便是在很需要motion信息的sports體育動作類別上,這個説明不僅僅是motion信息,單幀的appearance信息也是非常重要的。

這種在單幀層面用CNN進行特徵提取,在時序方面用融合池化不同片段的預測的方式,在理論上,是分不清楚“開門”和“關門”兩種動作的,因為其本質上沒有對時序因果信息進行建模,只是融合了不同片段的預測結果而已。忽略了時間結構信息,這是融合方法的一種潛在缺點。

考慮到融合方式並不能考慮到時序因果信息,時間結構信息被忽略了[13],我們需要重新思考新的時序信息提取方式。我們知道,這些融合方法,都是手動設計的融合幀間特徵的方式,而深度學習網絡基本上只在提取單幀特徵上發揮了作用。這樣可能不夠合理,我們期望設計一個深度網絡可以進行端到端的學習,無論是時序信息還是空間信息。於是我們想到,既然視頻序列和文本序列,語音序列一樣,都是序列,為什麼我們不嘗試用RNN去處理呢?

的確是可以的,我們可以結合CNN和RNN,直接把視頻序列作為端到端的方式進行模型學習。設計這類模型,我們有幾種選擇可以挑選:

  1. 考慮輸入的數據模態:a> RGB; b> 光流; c> 光流+RGB
  2. 特徵: a> 人工設計; b> 通過CNN進行特徵提取
  3. 時序特徵集成:a> 時序池化; b> 用RNN系列網絡進行組織

時序池化如Fig 3.4所示,類似於我們之前討論的時序融合,不過在細節上不太一樣,這裏不展開討論了,具體見文章[8]。

temporal_pooling

<div align='center'> <b> Fig 3.4 不同方式的時序池化。 </b> </div>

然而,[8]的作者得出的結論是時序池化比LSTM進行時序信息組織的效果好,這個結論然而並不是準確的,因為[8]的作者並不是端到端去訓練整個網絡。

如果單純考慮CNN+RNN的端到端訓練的方式,那麼我們就有了LRCN網絡[9],如Fig 3.5所示,我們可以發現其和[8]的不同在於其是完全的端到端網絡,無論是時序和空間信息都是可以端到端訓練的。同樣的,[9]的作者的輸入同樣進行了若干種結合,有單純輸入RGB視頻,單純輸入光流,結合輸入光流和RGB的,結論發現結合輸入光流和RGB的效果最為優越。這點其實值得細品,我們知道光流信息是傳統CV中對運動motion信息的手工設計的特徵,需要額外補充光流信息,説明光靠這種樸素的LSTM的結構去學習視頻的時序信息,motion信息是不足夠的,這點也在側面反映了視頻的時序組織的困難性。

LRCNactrec_high

<div align='center'> <b> Fig 3.5 LRCN網絡應用在動作識別問題。 </b> </div>

對比之後我們將會談到的C3D網絡,CNN+RNN的這種網絡框架意味着我們可以利用ImageNet的海量標註圖像數據去預訓練CNN網絡,這樣使得我們模型性能更佳優越並且收斂更加穩定,事實上,如果完全從頭訓練LRCN網絡(from scratch),那麼按照筆者的經驗是訓練過程很不穩定,很容易發散,一般實際中我們都會採用已經經過預訓練了的CNN作為特徵提取器,然後固定住CNN後訓練LSTM直至收斂後,再用較小的學習率端到端訓練整個網絡。

LRCN當然不可避免存在缺點,採用了光流信息作為輸入意味着需要大量的預先計算用於計算視頻的光流;而視頻序列的長時間依賴,motion信息可能很難被LSTM捕獲;同時,因為需要把整個視頻分成若干個片段,對片段進行預測,在最後平均輸出得到最終的視頻級別的預測結果,因此如果標註的動作只佔視頻的很小一段,那麼模型很難捕獲到需要的信息。

結合光流信息並不是LRCN系列網絡的專利,Two Stream Network雙流網絡[10]也是結合視頻的光流信息的好手。在雙流網絡中,我們同樣需要對整個視頻序列進行採樣,得到若干個片段,然後我們從每個片段中計算得到光流信息作為motion信息描述這個動作的運動,然後從這個片段中採樣得到一幀圖像作為代表(通常是最中間的幀,片段長度通常是10),表徵整個片段的appearance信息。最終分別在motion流和appearance流都得到各自的分類結果,在最後層裏進行各自分類結果的融合得到整個片段的預測結果。這種顯式地利用光流來組織時序信息,把motion流和appearance流顯式地分割開進行模型組織的,也是一大思路。

2stream_high

<div align='center'> <b> Fig 3.6 雙流網絡的網絡示意圖,需要輸入視頻的光流信息作為motion信息,和其中某個採樣得到的單幀信息作為appearance信息。 </b> </div>

2stream_of

這裏需要注意一些其中的技術細節,不然後面討論我們可能會產生疑惑。我們的光流分別需要對x和y方向進行計算,因此對於同一張圖而言,會產生x方向的光流和y方向的光流,如上圖的(d)和(e)所示。因此,在實踐中,如果我們取片段長度$L=10$,那麼對於一個片段我們便會有20個光流通道,因此我們的motion流的輸入張量尺寸為$(batch_size, 224,224,20)$,而appearance流的輸入張量尺寸為$(batch_size, 224,224,3)$。我們發現motion流的通道數為20,不能直接用在經過ImageNet預訓練過後的模型進行初始化,因為一般ImageNet上預訓練的模型的輸入通道都是3。為了解決這個問題,我們可以用經過ImageNet預訓練的模型,比如VGG的第一層卷積層,比如為$kernel = (3,3,3,64)$,在輸入通道那個階求平均,也就是$kernel.mean(dim=2)$,然後得到一個尺寸如$(3,3,1,64)$的張量,用這個張量去初始化我們的motion流的輸入的第一層卷積,這樣雖然我們的motion流有20個輸入通道,但是這個20個輸入通道的參數是初始化為相同的。除去第一層卷積層,其他後續的層繼續沿用經過預訓練的VGG的層。因此,motion流和appearance流最後的輸出特徵圖張量尺寸都是一致的,舉個例子比如是$(batch_size, 64,64,256)$。那麼我們分別對每個流都預測一個結果,然後對這個結果進行融合,比如求平均,得到對這個片段的最後識別結果。

當然,LRCN具有的問題,雙流網絡同樣也有,包括計算光流的計算複雜度麻煩,採樣片段中可能存在的錯誤標籤問題(也就是採樣的片段可能並不是和視頻級別有着相同的標籤,可能和視頻級別的標註相符合的動作只佔整個視頻的很小一段。)對長時間依賴的動作信息組織也是一個大問題。然而,因為雙流網絡兩個流主要都是用2D卷積網絡進行特徵提取,意味着我們同樣可以使用在ImageNet上經過預訓練的模型作為良好的參數初始化,這是雙流網絡的一大優點。

到目前為止,我們都是嘗試對視頻的單幀應用2D卷積操作進行特徵提取,然後在時間軸上進行堆疊得到最終的含有時間序列信息的特徵。

2Dconv

我們自然就會想到,如果有一種卷積,能在提取空間信息的同時又能夠提取時序信息,那豈不是不需要手工去堆疊時序特徵了?一步到位就行了。的確的,我們把這種卷積稱之為3D卷積,3D卷積正如其名,其每個卷積核有三個維度,兩個在空間域上平移,而另一個在時間軸上滑動卷積。

3Dconv

這樣的工作可以追溯到2012年的文章[11],那該文章中,作者提出的網絡不是端到端可訓練的,同樣設計了手工的特徵,稱之為input-hardwired,作者把原視頻的灰度圖,沿着x方向的梯度圖,沿着y方向的梯度圖,沿着x方向的光流圖,沿着y方向的光流圖堆疊層H1層,然後進行3D卷積得到最終的分類結果。如果我們仔細觀察Fig 3.7中的3D卷積核的尺寸,我們發現其不是我們現在常見的$3\times3\times3$的尺寸。這個網絡開創了3D卷積在視頻上應用的先河,然而其也有不少缺點,第一就是其不是端到端可訓練的,還是涉及到了手工設計的特徵,其二就是其設計的3D卷積核尺寸並不是最為合適的,啟發自VGG的網絡設計原則,我們希望把單層的卷積核儘可能的小,儘量把網絡設計得深一些。

raw_3dconv

<div align='center'> <b> Fig 3.7 3D卷積網絡的最初嘗試。 </b> </div>

這些缺點帶來了C3D[12]網絡,與[11]最大的不同就是,C3D其使用的卷積核都是相同的尺寸大小,為$3\times3\times3$,並且其不涉及到任何手工設計特徵輸入,因此是完全的端到端可訓練的,作者嘗試把網絡設計得更深一些,最終達到了當時的SOTA(state-of-the-art)結果。作者發現結合了iDT特徵,其結果能有5%的大幅度提高(在ufc101-split1數據上從85.2%到90.4%)。

在這裏插入圖片描述

<div align='center'> <b> Fig 3.8 C3D網絡框圖示意。 <b/> </div>

c3d_gif

<div align='center'> <b> Fig 3.9 3D卷積動圖示意。 </b> </div>

儘管在當時C3D達到了SOTA結果,其還是有很多可以改進的地方的,比如其對長時間的依賴仍然不能很好地建模,但是最大的問題是,C3D的參數量很大,導致整個模型的容量很大,需要大量的標籤數據用於訓練,並且,我們發現3D卷積很難在現有的大規模圖片數據集比如ImageNet上進行預訓練,這樣導致我們經常需要從頭訓練C3D,如果業務數據集很小,那麼經常C3D會產生嚴重的過擬合。隨着大規模視頻動作理解數據集的陸續推出,比如Kinectics[13]的推出,提供了很好的3D卷積網絡pre-train的場景,因此這個問題得到了一些緩解。我們知道很多醫療影像都可以看成是類似於視頻一樣的媒體,比如MRI核磁共振,斷層掃描等,我們同樣可以用3D卷積網絡對醫學圖像進行特徵提取,不過筆者查閲了資料之後,仍然不清楚是否在大規模動作識別數據集上進行預訓練對醫學圖像的訓練有所幫助,畢竟醫學圖像的時序語義和一般視頻的時序語義差別很大,個人感覺可能在大規模動作識別數據集上的預訓練對於醫學圖像幫助不大。

C3D系列的網絡是完全的3D卷積網絡,缺點在於其參數量巨大,呈現的是3次方級別的增長,即便是在預訓練場景中,也需要巨大的數據才能hold住。為了緩解這個問題,有一系列工作嘗試把3D卷積分解為2D卷積和1D卷積,其中的2D卷積對空間信息進行提取,1D卷積對時序信息進行提取。典型的3D分解網絡有$F_{ST}CN$ [14], 其網絡示意圖如Fig 3.10所示。

fstcn_high

<div align='center'> <b> Fig 3.10 FstCN 網絡的結構框圖。 </b> </div>

Pseudo-3D ResNet(P3D ResNet)網絡[15]則在學習ResNet的殘差設計的路上越走越遠,其基本的結構塊如Fig 3.11所示。這個策略使得網絡可以設計得更深,參數量卻更少,然而性能表現卻能達到SOTA結果,如Fig 3.12和Fig 3.13所示。

p3d

<div align='center'> <b> Fig 3.11 組成P3D的3種基本單元,分別是P3D-A,P3D-B,P3D-C。 </b> </div>

comparison_c3d_p3d

<div align='center'> <b> Fig 3.12 P3D ResNet比C3D的模型更小,深度更深,表現性能卻更高。 </b> </div>

p3d_performance

<div align='center'> <b> Fig 3.13 在UCF101上,眾多模型的表現,P3D ResNet有着出色的表現。 </b> </div>

不僅如此,將3D分解成2D+1D的操作使得其在圖像數據集上預訓練成為了可能。(雖然這種預訓練可能並沒有LRCN和雙流網絡這種直觀)

p3d_pretrain_imagenet

在文章[7]中,作者提出了R(2+1)D網絡,作者對比了一系列不同的2D+1D的分解操作,包括一系列2D+3D的操作,如Fig 3.14所示。與P3D ResNet[15]不同的是,R(2+1)D採用了結構相同的單元,如Fig 3.15所示,而不像P3D中有3種不同的殘差塊設計。這種設計簡化了設計,同時達到了SOTA效果。 R2+1D

<div align='center'> <b> Fig 3.14 眾多結合2D卷積和3D卷積的方法,其中實驗發現R(2+1)D效果最佳。 </b> </div>

2+1D_block

<div align='center'> <b> Fig 3.15 (2+1)D conv單元示意圖,把3D卷積進行分解成了空間域卷積和時間域卷積。 </b> </div>

至此,我們討論了視頻動作識別中的若干基礎思路:1.通過CNN+RNN;2.通過雙流,顯式地分割motion信息流和appearance信息流;3.通過3D卷積進行直接空間時間信息提取。

我們的旅途就到此為止了嗎?不,我們剛出新手村吶,我們的冒險才剛剛開始,我們後續討論的網絡,或多或少受到了以上幾種模型的啟發,或者將以上幾種模型融合起來進行改造,或添加了新的亮點,比如加入了attention注意力機制,self-attention自注意力機制等。

不過我們不妨暫且在本站結尾做個小總結:視頻分析難,難在其特徵不僅僅是2D圖像中的二維特徵了,二維特徵圖像現在有着多種大規模的圖像數據集可以提供預訓練,並且對圖像進行人工標註,在很多任務中都比對視頻標註工作量要小。正因為超大規模的圖像標註數據集的推出,使得很多圖像問題在深度學習方法加持下得到了快速的發展,在某些領域甚至已經超過了人類。

然而視頻分析不同,視頻是有一系列語義上有聯繫的單幀二維圖像在時間軸上疊加而成的,而提取時序語義信息是一件不容易的事情,種種實驗證明,現存的深度網絡在提取時序語義特徵上並沒有表現得那麼好,否則就不需要人工設計的光流特徵進行加持了。深度網絡在時序特徵提取上的缺失,筆者認為大致有幾種原因:

  1. 標註了的視頻數據量不足。
  2. 時序信息的分佈變化比二維圖像分佈更為多樣,對於圖像,我們可以進行插值,採樣進行圖像的縮放,只要不是縮放的非常過分,人類通常還是能正常辨認圖像的內容。而視頻幀間插幀卻是一件更為困難的事情。因此不同長度之間的視頻之間要進行適配本身就是比較困難的事情。當然你可以進行視頻時序下采樣,但是如果關鍵幀沒有被採樣出來,那麼就會造成有效信息的丟失,相反,圖像的縮放比較少會出現這種問題。説回到時序信息的分佈的多樣性就體現在這裏,同一個動作,發生的長度可能截然不同,所造成的時序是非常複雜的,需要組織不同長度的時序之間的對齊,使得組織動作的motion變得很不容易,更別説不同人的同一個動作的motion可能千差萬別,涉及到了原子動作的分解。

標註的視頻數據量不足並不一定體現在視頻級別的標註少,帶有動作標籤的視頻級別的數據可能並不少,但是這些視頻可能並沒有進行過裁剪,中間有着太多非標註動作類別相關的內容。對視頻進行動作發生時段的準確定位需要非常多的人工,因此標註視頻變得比較困難。同時,一個視頻中可能出現多個人物,而如果我們只關注某個人物的動作,對其進行動作標註,如果在樣本不足的情況下,便很難讓模型學習到真正的動作執行人,因此對視頻的標註,單純是視頻級別的動作標註是非常弱的一種標註(weak-supervision)。我們可能還需要對一個視頻進行多種標註,比如定位,動作類別,執行人bounding-box等等。

同時,給視頻標註的信息也不一定準確,標籤本身可能是帶有噪聲的。有很多標籤可能來自於視頻分類的tag,這些tag分類信息大多數來自於視頻本身的上傳者,是上傳者自己指定的,可能存在有較大的噪聲,然而這類型的數據量非常巨大,不利用卻又過於可惜。類似於這種tag標籤,現在彈幕網站的彈幕也是一種潛在的可以利用的帶噪聲的標籤。

隨着海量的無標籤或者弱標籤,帶噪聲標籤在互聯網上的與日俱增,在視頻數據上,弱監督學習,帶噪聲的標籤的監督學習,自監督學習,半監督學習將有廣闊的空間。

視頻動作理解——更進一步

我們在上一站已經對基本的視頻動作理解的框架有了基本瞭解,考慮到模型需要對時空信息進行建模,歸結起來無非有三種大思路,如Fig 4.1所示:

  1. CNN+RNN: 這種類型的網絡以LRCN[9]為代表,利用CNN提取單幀圖片的空間特徵,然後利用RNN系列的網絡對提取好的單幀圖片特徵進行時序建模,最後得到視頻片段的預測結果。

    • 優點:可以直接自然地利用在大規模圖像數據集比如ImageNet上的預訓練結果。
    • 缺點:後端的RNN網絡是對高層次的語義特徵進行建模,對於低層次的運動motion特徵則愛莫能助,因為低層次的motion信息很多時候都取決於了前端的CNN的能力,而前端的CNN在此時並沒有motion建模的能力。

    總結: 因此,LRCN系列的網絡對於單幀appearance差別明顯的數據集,表現可能會更為理想。模型參數量在三種基本模型中最小。

  2. 3D-ConvNet : 3D卷積網絡以C3D[12]為典型代表,將2D卷積核在時間方向延伸了一個維度,自然地形成了3D卷積核,以期望用3D卷積核的層疊學習到視頻的時空語義特徵。

    • 優點:是2D卷積的自然延伸,一站式地學習motion和appearance信息,能理論上真正做到時空語義的提取。
    • 缺點:參數量是3次方級別的,參數量過大,容易導致過擬合。不能直接地利用在圖像數據集上的預訓練模型進行初始化模型參數。

    總結 : 3D卷積網絡在高維醫學圖像和視頻分析中都有廣闊的應用,其存在很多嘗試分解3D卷積成2D+1D卷積的操作,而且都有不錯的效果。模型參數量在三種基本模型中最大。

  3. Two-Stream: 雙流網絡[]顯式地分割了motion流和appearance流兩種信息,(大部分)利用人工設計的光流特徵進行視頻的motion信息建模,用RGB片段的單幀信息作為appearance信息,利用預訓練的CNN進行特徵提取後,融合不同流的預測結果得到最終視頻片段的預測。

    • 優點:可以直接自然地利用預訓練的大多數CNN網絡,如VGG,ResNet等。效果良好,現在很多工作都是基於雙流網絡進行改造而成。直接用光流信息去建模motion信息,使得在較小樣本的數據集中也能有不錯效果。
    • 缺點:大部分工作的光流信息都是需要預訓練的,這樣無法提供一個端到端的預訓練場景,同時,光流計算耗費較多的計算資源。

    總結: 雙流網絡是目前動作識別領域較為常用的基本模型,其效果良好,模型參數量在三種基本模型之間。

basic_framework

<div align='center'> <b> Fig 4.1 三種基本的對視頻動作進行分析的模型框架。 </b> </div>

以上的總結其實也闡明瞭在視頻動作理解中的幾個基本難題:

  1. 如何高效利用已經在大規模圖像數據集ImageNet上已經預訓練好了的網絡,對視頻理解模型進行初始化?
  2. 視頻長度一般是變長的,經常需要做片段採樣,那麼我們如何對樣本採樣比較合適?
  3. 光流預計算需要花費大量計算資源,並且不能進行端到端訓練。
  4. 如何更好地組織motion和appearance信息的關係?
  5. 對於雙流網絡的流信息融合來説,以什麼方式融合?在哪個層融合能取得最好效果?

那麼我們接下來的內容,基本上都是在回答這些問題。Follow my lead and go on~

雙流網絡的信息融合——如何融合,何處融合

時空域信息融合

2stream_high

我們之前談到過,我們一般的雙流網絡的輸出無論是motion流還是appearance流,其最後一層的輸出張量尺寸都是一致的,我們可以用式子(4.1)表示: $$ \mathbf{x}{t}^a \in \mathbb{R}^{H \times W \times D} \ \mathbf{x}{t}^b \in \mathbb{R}^{H^{\prime} \times W^{\prime} \times D^{\prime}} \tag{4.1} $$ 其中$\mathbf{x}t^a$表示motion流特徵輸出,$\mathbf{x}{t}^b$表示appearance流特徵輸出, $H$表示height,$W$是width, $D$表示最終輸出通道數depth。我們對兩個流的信息融合可以表示為(4.2) $$ f: \mathbf{x}_t^a, \mathbf{x}_t^b \rightarrow \mathbf{y}_t \ \mathbf{y}_t \in \mathbb{R}^{H^{\prime\prime} \times W^{\prime\prime} \times D^{\prime\prime}} \tag{4.2} $$ 其中的映射$f$就是我們需要指定的信息融合函數,通常為了方便,我們假定$H = H^{\prime}, W = W^{\prime}, D=D^{\prime}$,並且把下標$t$省略。我們期待的信息融合,如Fig 4.2所示,應該可以找到motion流和appearance流之間的對應關係,而不應該是割裂開的。在傳統的雙流網絡[10]中,因為雙流信息融合只在最後進行各自流的預測合併(比如説平均操作)的時候才體現出來,因此motion流信息其實並沒有在各個層次(hierarchy)上和appearance流信息很好地對應。我們希望的雙流信息融合應該如Fig 4.2所示。

corresponding_fusion

<div align='center'> <b> Fig 4.2 理想的motion流和appearance流特徵融合應該能找到兩個流之間的對應特徵部分。 </b> </div>

在文章[16]中,作者對若干種雙流信息融合方式進行了介紹和實驗對比,同時對何處進行信息融合進行了實驗。通過結合最佳的信息融合方式和信息融合層的位置,作者提出了所謂的雙流融合網絡(Two Stream Fused Network)。

一般,有以下幾種方式融合信息:

  1. sum fusion,加和融合,表示為$y^{sum} = f^{sum}(\mathbf{x}^a, \mathbf{x}^b)$。如果$i,j$分別表示第$d$個通道的$i,j$空間位置,那麼我們有 $y_{i,j,d}^{sum} = x^{a}{i,j,d}+x^{b}{i,j,d}$。因為通道數的排序是任意的,因此並不意味着$\mathbf{x}{i,j,1}^a$和$\mathbf{x}{i,j,1}^b$有着對應的語義含義,當然這種任意的對應關係我們可以通過後續設計網絡進行學習,以求達到最好的優化效果。

  2. max fusion,最大融合,表示為$y^{max} = f^{max}(\mathbf{x}^a, \mathbf{x}^b)$。同樣有着:$y_{i,j,d}^{max} = \max(x^a_{i,j,d}, x^b_{i,j,d})$。和sum fusion類似的,其對應關係也是任意的。

  3. Concatenation fusion,拼接融合,表示為$y^{concat} = f^{concat}(\mathbf{x}^{a},\mathbf{x}^{b})$,其疊在通道疊加了兩個流的特徵圖。同樣我們有: $$ \begin{aligned} y^{cat}{i,j,2d} &= x^{a}{i,j,d} \ y^{cat}{i,j,2d-1} &= x^{b}{i,j,d} \end{aligned} \tag{4.3} $$

    拼接融合沒有指定顯式的對應關係,因此必須通過後續的網絡設計進行學習這種對應關係。

  4. Conv fusion,卷積融合,表示為$y^{conv} = f^{conv}(\mathbf{x}^a, \mathbf{x}^b)$。首先,我們需要對兩個特徵圖進行在通道上的疊加,然後用一系列的卷積核$\mathbf{f} \in \mathbb{R}^{1 \times 1 \times 2D \times D}$和偏置$\mathbf{b} \in \mathbb{R}^{D}$進行卷積操作,有: $$ \mathbf{y}^{conv} = \mathbf{y}^{concat} * \mathbf{f}+\mathbf{b} \tag{4.4} $$ 我們發現這裏的卷積操作是1x1卷積,同時進行了通道數的縮小,保持了輸入輸出尺寸的一致。

  5. Bilinear fusion,雙線性融合,表示為$y^{bil} = f^{bil}(\mathbf{x}^a, \mathbf{x}^b)$,其在每個像素位置,計算了兩個特徵圖的矩陣外積,定義為: $$ \mathbf{y}^{bil} = \sum^{H}{i=1}\sum{j=1}^{W}(\mathbf{x}^{a}{i,j})^{\mathrm{T}}\mathbf{x}^{b}{i,j} \tag{4.5} $$ 這個產生的融合特徵輸出為$\mathbf{y}^{bil} \in \mathbb{R}^{D^2}$,具有過高的維度,容易導致過擬合,因此在實際中比較少應用。

作者對這幾種融合方式進行了實驗,得出了其模型準確度和模型參數量的實驗結果。如Fig 4.3所示。

fusion_params_number

<div align='center'> <b> Fig 4.3 各種不同的雙流信息融合方式的實驗結果和模型參數量。 </b> </div>

我們發現,Conv fusion能在較少的模型參數量下,達到最好的實驗性能。

where_to_fuse

同時,如上圖所示,作者探索了在雙流網絡的哪個層進行融合效果會最好,最後得出實驗結果如Fig 4.4所示。我們發現ReLU5+FC8的這個配置能達到最好的性能。

fusion_loc

<div align='center'> <b> Fig 4.4 在雙流網絡的各個層進行融合取得的效果和模型大小實驗結果。 </b> </div>

時序信息融合

我們之前談到的是時空信息融合,指的是將motion流和appearance流融合起來的方式探索。而這個一般是在單個的片段中進行的操作,考慮到如何融合視頻中不同片段之間的信息,形成最終的對整個視頻的分類結果,我們就需要考慮時序特徵建模了。考慮到如何將不同時間$t$的特徵圖$\mathbf{x}_t$融合起來,一般也可以稱之為時序信息建模或者時序特徵集成,我們接下來繼續探索時序信息融合。

當然一種最為簡單的方式,正如在原始的雙流網絡[10]中提到的,直接對不同時刻的網絡預測結果進行平均,這種平均操作忽略了具體的時序結構,理論上,網絡無法分清楚“開門”和“關門”的區別。在這種平均的情況下,這種模型框架只是對空間上的像素或者特徵進行了2D池化,如Fig 4.5 (a)所示。

現在,讓我們將$T$個空間特徵圖$x^{\prime} \in \mathbb{R}^{H \times W \times D}$進行堆疊,那麼我們就有了時序池化層的輸入特徵張量$\mathbf{x} \in \mathbb{R}^{H \times W \times T \times D}$。我們接下來定義兩種不同的時序池化層,它們可以對時序信息進行集成。

  1. 3D pooling,在堆疊的特徵圖$\mathbf{x}$上作用以池化核尺寸為$W^{\prime} \times H^{\prime} \times T^{\prime}$的max-pooling池化核,如Fig 4.5 (b)所示。注意到,在不同通道$D$上沒有進行任何的池化。

  2. 3D Conv+3D Pooling,用一系列卷積核大小為$\mathbf{f} \in \mathbb{R}^{W^{\prime\prime} \times H^{\prime\prime} \times T^{\prime\prime} \times D \times D^{\prime}}$的卷積核和尺寸為$\mathbf{b} \in \mathbb{R}^{D^{\prime}}$的偏置對堆疊的特徵圖 $\mathbf{x}$ 進行卷積後,進行3D池化,如Fig4.5 (c)所示,有: $$ \mathbf{y} = \mathbf{x}_t *\mathbf{f} + \mathbf{b} \tag{4.6} $$

temporal_pooling_3d2d

<div align='center'> <b> Fig 4.5 三種不同的時序池化方式,留意圖中的座標軸的標籤。 </b> </div>

如Fig 4.6所示,作者接下來對以上提到的若干種時序特徵建模進行了實驗,發現3D conv+3D pooling效果最好。

which_temporal_pooling_better

<div align='center'> <b> Fig 4.6 作者嘗試了若干種時序特徵建模的方式,發現3D conv+3D pooling的方式效果最好。 </b> </div>

雙流融合網絡

基於之前的討論,作者根據Fig 4.7所示的基本框架提出了雙流融合網絡(Two-Stream Fusion Network),這個網絡在雙流信息融合上花了一番心思設計。作者在conv5層後進行雙流信息的3D conv fusion融合,同時,作者並沒有截斷時間流信息(這裏的時間流信息是多張RGB幀層疊而成,見Fig 4.7的右半部分),而是用剛才提到的時序信息融合,用3D Conv+3D Pooling的方式融合了時序信息流,於是我們有兩個分支:一個是時間-空間雙流融合信息,一個是時序特徵流。如Fig 4.8的spatia-temporal loss和temporal loss所示。

2stream_fused_network_framework

<div align='center'> <b> Fig 4.7 雙流融合網絡的主幹框架。 </b> </div>

two_stream_fused_network

<div align='center'> <b> Fig 4.8 雙流融合網絡的網絡框圖,主要有時空損失和時序損失組成,其前端和傳統的雙流網絡沒有太大區別,主要是在時序融合上採用了3D conv+3D pooling的方式。 </b> </div>

整個網絡的實驗結果如下圖所示:

two_stream_fusiong_expresult

雙流融合網絡在用少於C3D的參數量的同時,提高了模型性能,是雙流信息融合網絡系列的開山鼻祖。我們之後的很多網絡,包括I3D等,都是由它啟發而來。

將2D卷積網絡預訓練模型擴展到3D卷積網絡上

還記得我們之前談到3D卷積網絡有個很大的缺點是啥嗎?3D卷積網絡很難直接應用在圖像數據上預訓練的結果,導致經常需要大規模的標註視頻數據集進行預訓練,然而這種數據遠比圖片數據難收集。文獻[13]的作者發現了這個問題,提出了兩個解決方案:

  1. 採集大規模標註視頻數據集Kinetics ——這點很直接粗暴,但是很有用。
  2. 採用將已經預訓練好了的2D卷積網絡的2D卷積核“膨脹”(inflate)到對應的3D卷積核的操作,利用了預訓練的CNN模型。這個模型作者稱之為I3D(Inflated 3D ConvNets)。

如果把之前已經介紹過了的幾種模型都列成一個簡圖,那麼我們有Fig 4.9。其中(a)-(d)我們在之前的內容中介紹過了,而(e) Two-Stream 3D-ConvNet也就是本節所説的I3D網絡。我們可以發現,這種網絡的基本框架還是利用了雙流網絡的結構,不過改變了以下幾個要點:

  1. 完全採用3D ConvNet作為特徵提取器,提取時空信息。
  2. RGB輸入不再是單幀了,而是把整個視頻輸入3D卷積網絡進行特徵提取,同樣的,光流motion流的輸入也不再是片段的長度了,而是整個視頻的長度。

5types_networks

<div align='center'> <b> Fig 4.9 五種動作識別的網絡簡圖,前四種我們已經介紹過了。其中的K代表的是整個視頻的長度,N表示的是某個幀周圍的鄰居的長度,比如某個時間幀t,如果N=10,那麼就會在[t-5,t+5]的範圍內對視頻採樣。 </b> </div>

我們先不關心作者是怎麼採集大規模數據集的,我們關心作者是怎麼對2D卷積核進行“膨脹”的。我們考慮到一個2D卷積核,其尺寸為$(N \times N)$,那麼我們為它添加一個時間維度,得到尺寸為$(N \times N \times 1)$的卷積核,將這個卷積核在第三個維度複製N次,我們就有了$(N \times N \times N)$的3D卷積核。這個結論其實可以推導:

假設我們想要找ImageNet上訓練3D卷積網絡,我們可以考慮一種最簡單的方式,[13]的作者稱之為boring-video fixed point。我們把一張圖片,複製M次,層疊形成一個視頻,只不過這個視頻並沒有時序上的信息,所有幀都是重複的,然後用這個視頻去訓練3D卷積網絡。由於線性性,我們可以將整個過程簡化為將2D卷積核進行時間維度的複製。這種方式使得I3D網絡可以在ImageNet上進行預訓練,如Fig 4.10所示,這種策略的確產生了不錯的效果。

pretrain_i3d

<div align='center'> <b> Fig 4.10 在ImageNet上預訓練對於I3D網絡的性能提升。 </b> </div>

目前而言,I3D網絡在各個benchmark數據集上的表現都不錯,是一個不錯的baseline基線網絡。

此外,在工作[20]中,作者提到了一種有趣的方法,其可以將2D pretrain的卷積網絡的參數擴展到3D卷積網絡上。如Fig 4.11所示,這種方法採用了類似於Teacher-Student Learning的方法,主要有兩個分支,第一個分支是藍色顯示的預訓練好了的2D卷積網絡,第二個分支是綠色顯示的需要進行遷移參數的3D卷積網絡,我們的藍色分支對輸入的RGB單幀進行處理,綠色分支對視頻片段進行處理,我們的綠色和藍色分支的輸入可能來自於同一個視頻,稱之為正樣本對,也可能來自於不同視頻,稱之為負樣本對,我們的網絡目標就是判斷這兩個輸入是否是正樣本還是負樣本,用0/1表示。通過這種手段,我們可以讓3D卷積網絡學習到2D卷積預訓練網絡的知識。

T3D_2d3d_weights

<div align='center'> <b> Fig 4.11 T3D中提到的利用2D卷積網絡的預訓練模型去初始化3D卷積網絡參數的方法。 </b> </div>

內嵌光流計算的深度網絡

我們之前談到的網絡利用了光流信息,而這裏的光流信息無一例外是需要通過人工設計的方法進行預計算的,能不能考慮一種方法可以利用深度網絡提取光流信息呢?[17]的作者提出了MotionNet,如Fig 4.12所示,在基於雙流網絡的主幹上,採用深度網絡提取光流信息。作者將光流提取問題視為圖形重建(image reconstruction)問題,利用bottleneck的網絡結構,對給定的RGB輸入$I_{RGB}$,給定其光流作為輸出標籤(可以通過傳統算法計算得到)記為$I_{flow}$,經過監督學習可以單獨訓練MotionNet,待其獨立訓練完後,可以聯合起整個網絡端到端訓練。

motionnet

<div align='center'> <b> Fig 4.12 MotionNet的網絡框圖。 </b> </div>

其他模態的視頻序列動作分析

之前介紹的都是RGB視頻或者結合了根據RGB視頻計算得到的光流信息作為輸入模態,進行視頻動作理解的一些方法。筆者本身的研究方向是多視角動作識別,數據輸入模態多是骨骼點skeleton數據,如Fig 5.1所示。具體關於骨骼點數據的特點介紹,見筆者之前的文章[2]。在本站,我們嘗試討論骨骼點序列的動作識別和多視角動作識別。

skeleton

<div align='center'> <b> Fig 5.1 利用Kinect v2.0[21]得到的骨骼點排序 </b> </div>

總得來説,骨骼點數據可以看成是極端的將motion信息給提取了出來,而丟失了所有的appearance信息。如Fig 5.2所示,我們能很清楚地判斷人物的動作,但是涉及到人物的衣着打扮,交互的物體是什麼等信息,卻是完全沒辦法判斷了。因此,用skeleton骨骼點數據去組織motion信息是一種非常好的手段,但是涉及到與appearance有關的數據,就必須引入RGB視頻信息,這類型的多模態問題,已有關於此的不少工作[23]。

skeleton_gif

<div align='center'> <b> Fig 5.2 利用Openpose[22]對RGB視頻估計出來的骨骼點數據 </b> </div>

骨骼點數據一般有兩種類型,2D骨骼點數據或者3D骨骼點數據,2D骨骼點數據多是從RGB視頻中進行姿態估計得到,而3D骨骼點數據一般需要深度信息,在某些文獻中[24],存在將根據RGB視頻姿態估計得到的2D骨骼點姿態,通過深度網絡推斷出3D骨骼點姿態的工作,如Fig 5.3所示。

2dpose_to_3dpose

<div align='center'> <b> Fig 5.3 利用RGB模態信息進行3D關節點的姿態估計。 </b> </div>

對於骨骼點數據而言,一般可以表示為張量: $$ \mathbf{S} \in \mathbb{R}^{\mathrm{nframes} \times \mathrm{njoints} \times \mathrm{ndimension}} \tag{5.1} $$ 其中nframes表示幀數,njoints表示關節點的數量,比如25個關節點一個人一幀,ndimension是維度,比如3D骨骼點是3,而2D骨骼點是2。而這裏的數據,一般都是骨骼點的空間座標數據,比如Fig 5.4所示:

skeleton_xyz

<div align='center'> <b> Fig 5.4 3D骨骼點數據,一般用物理尺度作為單位,比如米。 </b> </div>

骨骼點數據的建模,特徵提取和RGB,光流等這類數據不同,骨骼點數據是屬於graph圖數據,屬於典型的非歐幾里德結構數據[25],而RGB,光流圖屬於歐幾里德結構數據。非歐幾里德數據意味着在骨骼點上不能直接應用傳統的CNN,因為很直觀的,每個節點周圍的節點數都不一致,結構化的CNN根本無從下手。

根據筆者的研究經驗,對骨骼點數據進行深度網絡建模,可以有以下三種主要思路:

  1. 利用LSTM時序網絡對骨骼點進行建模,因為單幀的骨骼點數據可以拉平(flatten)成一個向量,通過最簡單的全連接層可以作為單幀提取器,然後用LSTM進行時序建模。
  2. 對骨骼點序列進行處理,將其拼成一個二維圖像類似的數據結構後直接應用傳統的CNN模型進行建模。在這類方法中,CNN模型通常需要同時對時間-空間信息進行建模。
  3. 把骨骼點序列看成時空圖(spatia-temporal graph)數據,利用圖神經網絡,比如GCN圖卷積網絡進行建模[25,26,27]。

接下來筆者在各個小節將對這幾點進行展開,休息一下,我們要開始了哦~

LSTM時序組織模型

在本框架中,我們需要對骨骼點序列進行兩種最為主要的操作:

  1. 如何對單幀的骨骼點信息進行組織
  2. 如何組織時序信息

對單幀的骨骼點信息進行組織並不容易,因為單幀的骨骼點數據是一種Graph數據,或者也可以看成是一種Tree數據,需要指定特定的遍歷策略將這種數據“拉平”成一維向量。單純地按照關節點的順序從1到25的遍歷一遍骨骼點顯然不能有效組織空間信息。舉個例子,某些動作如跑步,雙腿的規律性運動通常也會伴隨着雙臂的規律性擺動,這種身體部件與身體部件有關的關聯,用這種簡單的方法不能很好地進行建模。

在P-LSTM[28]中,作者採用LSTM作為基本的框架組織時序信息,同時,作者對LSTM的輸入門,遺忘門,和門控門進行了魔改。作者把身體劃分為五大部件,如Fig 5.5所示。通過這種方式,對不同身體部件之間的空間語義關係進行了初步的建模。

plstm

<div align='center'> <b> Fig 5.5 在P-LSTM中,作者把人體部件分為五大部分,並且分別輸入P-LSTM單元中。 </b> </div>

在[29]中,作者提出ST-LSTM,利用LSTM進行3D骨骼點時間序列的時間-空間信息融合,並且開創性地採用了人體骨骼點的樹形索引進行骨骼點的檢索,如Fig 5.6所示。3D骨骼點數據難免存在一些因估計導致的噪聲,因此並不是所有骨骼點都是可信的。在[29]中,不僅用LSTM對骨骼點數據進行時空上的信息組織,而且在傳統的LSTM細胞中引入了置信門(Trust Gate)分析每一個時空步中每個節點的可靠程度。

tree_tra

<div align='center'> <b> Fig 5.6 對骨骼點數據的樹形索引方式。 </b> </div>

st-lstm

<div align='center'> <b> Fig 5.7 在ST-LSTM中,在Spatial空間域和Temporal時間域都有LSTM單元,對骨骼點序列的時空信息,包括帶噪聲的骨骼點進行了建模。 </b> </div>

總結來説,在這類型方法中對於骨骼點信息的空間信息組織是一件不容易的事情,單純的分部件或者樹形索引,在某些程度上也不能很好地遍歷身體不同部件之間的關係,也沒有顯式地提供讓後續網絡學習到這種關係的通道。

二維圖像化CNN建模

我們之前分析過骨骼點序列不能應用於2D ConvNets的原因。然而我們可以考慮把骨骼點序列轉化為二維圖像類似的數據結構,從而直接應用2D卷積網絡。考慮到骨骼點序列的通常輸入張量尺寸為$\mathbf{s} \in \mathbb{R}^{300,25,3}$,其中300是幀數,25是節點數,3是維度。我們發現,如果把300看成是圖像的height,25看成是圖像的width,3看成是圖像的通道數,如Fig 5.8所示,那麼骨骼點序列就天然地變成了一種二維圖像。

這種方法在[30]中得到了描述和實驗,開創了一種利用二維圖像化CNN建模的方式。在這類型的方法中,2D CNN網絡同時對空間-時間信息進行了建模。不過和LSTM時序組織模型類似,其有一個很大的難點,就是我們需要對單幀數據進行遍歷,才能排列成二維圖像的一列(也可以是一行),這種遍歷規則通常需要指定,這裏就涉及到了人工設計排序的過程,不能很好地組織起身體部件之間的空間關聯性。

skel-cnn

<div align='center'> <b> Fig 5.8 Skel-CNN對骨骼點序列進行二維圖像化處理,將骨骼點序列轉變為二維圖像,從而後續可以採用2D CNN模型進行特徵提取。 </b> </div>

除此之外,還有和此有關的研究方法。在[31]中,作者不是利用原始的空間座標,而是找出人體某些相對穩定的關節點(稱之為根關節點),用其他關節點對其做歐式距離後,同樣按照時間軸方向拼接,形成多個以不同根關節點為基的二維特徵圖,爾後用多任務卷積網絡進行特徵提取和分類,如Fig 5.9所示。這種方法利用不同骨骼點與根關節點(比如圖中的5,8,11,14關節點)進行歐式距離計算,得到了全身各個部件之間的彼此相對距離二維圖,這種圖顯然是帶有全身各個部件之間的關係信息的,在組織幀內的空間關係上做得更好,因此更加魯棒。同時,作者還在模型中引入了多任務,使得模型的性能更加出眾。

new_repre_skel

<div align='center'> <b> Fig 5.9 使用單幀內的骨骼點部件之間的相對距離作為信息源,形成了一系列的二維歐式距離圖像後進行卷積。 </b> </div>

這些談到的方法都是對幀內骨骼點信息進行組織,還有一種方法考慮組織幀間之間的motion流關係,這種組織方法對於拍攝角度和運動角度更為魯棒。在工作[32]中,作者把骨骼點序列的關節點與關節點之間,在時序上的軌跡連接可視化為二維圖像,如Fig 5.10所示,因為這種可視化結果經常不夠清晰,可能伴有較為嚴重的缺損,因此作者同時對其進行了圖像增強後,用2D卷積網絡進行特徵提取。

visual_net

<div align='center'> <b> Fig 5.10 對骨骼點序列的幀間信息進行motion流組織,並且將其可視化成二維圖像後,對該二維圖像進行增強,爾後採用2D卷積網絡進行特徵提取。 </b> </div>

motion_track

<div align='center'> <b> Fig 5.11 對motion流的軌跡進行可視化,並且對可視化後的二維圖像進行了增強處理 </b> </div>

總的來説,這類型的方法中,採用CNN同時對時空信息進來組織,效果有時候會比用LSTM進行組織更穩定,但是同樣面對着如何設計單幀遍歷節點規則的問題。

圖神經網絡建模

如Fig 5.12所示,骨骼點序列天然地是個時空graph圖數據,可以考慮用圖神經網絡(Graph Neural Network, GNN)進行處理。正如筆者在之前的博客上談到的[25,26,27],已有多種關於圖神經網絡的研究,其中以圖卷積網絡(Graph Convolutional Network,GCN)為代表,具體的關於GCN和信息傳導的推導見筆者之前博客,在此不再贅述。

在工作[33]中,作者提出了Spatial-Temporal GCN,STGCN,也就是時空圖卷積網絡。在這個工作中,作者對傳統的卷積操作進行了延伸擴展,如式子(5.2)所示, $$ f_{out}(\mathbf{x}) = \sum_{h=1}^{K} \sum_{w=1}^{K} f_{in}(\mathbf{p}(\mathbf{x}, h,w) \cdot \mathbf{w}(h,w)) \tag{5.3} $$ 其中的$K$為卷積核的大小。作者重新定義了領域採樣函數$\mathbf{p}(\mathbf{x}, h, w)$,即是對於一個當前的像素或者圖節點,怎麼去對周圍的節點或者像素進行採樣,對於二維圖像來説,只需要簡單的找鄰居就行了,而graph數據則不能這樣進行了。 作者根據重新定義的領域採樣函數,定義了對應的權值函數$\mathbf{w}(h,w)$。當然,這裏只是對於空間的圖卷積,作者在時間域也定義了相似的領域採樣和權值,因此可以延伸到時空圖卷積,STGCN。最終對每個STGCN單元進行堆疊,如Fig 5.13所示,並且受到ResNet的啟發,引入short-cut和block設計,達到了SOTA的效果。

skeleton_graph

<div align='center'> <b> Fig 5.12 骨骼點序列天然地是個時空graph圖數據。 </b> </div>

st-gcn

<div align='center'> <b> Fig 5.13 ST-GCN的處理pipeline,其中ST-GCN就是主要的特徵提取網絡,輸入的骨骼點序列可以是3D骨骼點序列,也可以是經過姿態估計得到的2D骨骼點序列。 </b> </div>

Fig 5.14列出了以上討論的諸多模型在NTU RGBD 60數據集上的表現,我們發現STGCN的性能的確達到了SOTA。

result_skeleton

<div align='center'> <b> Fig 5.14 諸多基於骨骼點序列進行動作識別的模型在NTU RGBD 60數據集上的表現。 </b> </div>

ST-GCN是一個非常經典的網絡,筆者非常喜歡這個網絡,這個網絡設計非常的直觀,性能高效,佔用內存少。直接採用圖卷積的方式對空間和時間的語義信息進行組織,避免了人工去設計遍歷規則,在數據量大的情況下性能通常都會更好。現在相當多關於骨骼點動作識別的工作都是基於STGCN上進行的[34,35,36,37]。

多視角動作理解

所謂多視角動作理解,就是動作可能在多種不同的攝像頭姿態下發生,我們設計的模型必須能在多種不同不同的攝像頭姿態下對動作進行識別。這種需求面對着諸多真實場景,比如監控場景,攝像頭姿態通常都千差萬別,比如真實場景的動作識別(包括在移動機器人上部署的攝像頭),攝像頭姿態通常都是不定的,甚至是運動的,如果算法對多視角或者移動視角的攝像頭拍攝的視頻不夠魯棒,顯然是不能夠滿足我們的日常生產需求的。

多視角動作識別的一個很關鍵的問題在於多視角數據集很缺少,帶有標註的,比如標註了相機姿態的數據集更是稀少。如此少多視角標註視頻數據很難讓模型具有跨視角的能力,這裏指的跨視角指的是在某個或者某些視角的樣本上進行模型訓練,在未見過的視角樣本上進行模型測試。

多視角動作識別還有一個關鍵問題在於提取多視角之間的共有特徵,這種在多視角樣本上共享的特徵通常是和動作類別緊密相關的特徵,具有較好的視角不變性(view-invariant)。

因此,在多視角動作理解問題上,根據筆者的研究經驗,大致可以歸為三種方法:

  1. 採用一些手段擴充多視角樣本數據。
  2. 提取多視角樣本的公共特徵。
  3. 提取視角不變特徵——手工設計或者模型深度學習。

根據這個總結,接下來我們討論在RGB視頻上進行多視角動作理解的一些方法。

在RGB視頻上進行多視角動作識別

文章[38]是考慮在深度圖序列上進行多視角樣本擴充,因為深度圖和RGB視頻較為相像,我們歸到這裏討論。[38]的作者提出了一種很自然的生成多視角樣本的方法是:對人體模型進行三維建模,然後設置多個虛擬相機機位,紀錄下這些樣本,隨後再進行後處理,如Fig 6.1所示可以設置任意多個虛擬機位,一般選擇180個覆蓋全身即可。

180views_samples

<div align='center'> <b> Fig 6.1 虛擬機位生成虛擬多視角樣本。 </b> </div>

有很多3D建模軟件可以對人體模型進行很好地建模,問題在於讓這個模型按照需要的動作“活動”起來,以達到模擬真實人體活動的需求。我們可以通過MoCap[46]得到的骨骼點結果(是比較準確的,通過多軸傳感器結果得到的骨骼點序列,對遮擋魯棒),讓模型動起來,如Fig 6.2所示。同時,我們在其表面“附上”一層膜,因此人體模型不同深度的點就有了深度信息,最後進行深度圖生成即可。

mocap_generate

<div align='center'> <b> Fig 6.2 通過MoCap的骨骼點信息,進行3D人體模型的虛擬運動後進行多機位虛擬多視角樣本提取。 </b> </div>

在工作[39]中,作者同樣類似的思路,採用了MoCap的骨骼點序列對3D建模好的人體模型進行動作生成,不同的是,這次作者是把不同視角的序列信息提取時序間的軌跡,具體來説,就是對於一個多視角樣本,對其相同部件(比如手部,胳膊)進行時序上的跟蹤,得到祕籍的軌跡圖。如Fig6.3所示,最後用字典學習去學習不同視角樣本的碼錶(用K-means進行學習)。

codebook_skeleton_mocap

<div align='center'> <b> Fig 6.3 利用生成的多視角密集軌跡,進行字典學習,學習出多視角下的碼錶。 </b> </div>

在測試階段,我們需要利用這裏學習到的碼錶,對輸入的密集軌跡進行構建動作軌跡描述子,隨後進行識別,如Fig 6.4所示。

codebook_prediction

<div align='center'> <b> Fig 6.4 利用學習到的碼錶,在預測階段進行動作類別預測。 </b> </div>

當然,剛才的解釋並不完全,[39]的作者認為,不同視角之間存在一種所謂的典範視角(canonical view)的關係,也就是説,所有視角樣本,通過某種方式,都應該能轉化成典範樣本,更進一步,不同視角樣本之間都應該能通過典範樣本作為中繼,進行相互轉換。之前的工作[47,48]大多假設這種關係是線性的,如Fig 6.5 (a)(b)所示,但是這個並不能準確描述視角樣本之間的遷移關係,因此在本工作中,作者認為這種關係應該是非線性的,如Fig 6.5 (c)所示,不同樣本之間共享着高層的語義空間。然而通過我們之前討論的碼錶的方式可不能描述這種非線性,因為碼錶的碼元的組織是線性的操作,因此我們需要引入一個網絡進行這種非線性關係的學習,比如[39]中提出的Robust Non-linear Knowledge Transfer Model , R-NKTM模型,正如Fig 6.3和Fig 6.4所示。

share_high_level

<div align='center'> <b> Fig 6.5 作者假設不同視角樣本之間的遷移並不是線性的,如果假設存在一種所謂的典範樣本,那麼通過高維的非線性映射才是合理的方式。 </b> </div>

有些方法嘗試去提取視角不變(view-invariant)的特徵,自相似性矩陣(Self-Similar Matrix,SSM)[40]是一種經典的理論上的角度不變性的特徵,其做法很簡單,就是在時間上求幀$i$與幀$j$的歐式距離$d_{i,j}$並把它組成矩陣,如Fig 6.6所示。這類型的方法還有一些後續工作,比如[41-42],如Fig 6.7所示。同時,我們可以發現,在一些工作對人體的各個身體部件之間進行相對距離的計算,然後拼接成特徵矩陣的方法,比如[31]中,都體現了視角不變性的思想。

ssm

<div align='center'> <b> Fig 6.6 SSM模型嘗試構造視角不變性特徵。 </b> </div>

edms

<div align='center'> <b> Fig 6.7 其他嘗試構造視角不變性特徵的方法,受到了SSM的啟發。 </b> </div>

的確,從理論上説,進行時間幀的相對距離計算(或者身體部件之間的相對距離),這個相對距離計算應該是和視角無關的,因為你不管視角怎麼改變,這個相對距離也不會變化,因此是視角不變的。但是我們注意到,正如文章[2]中所説到的,骨骼點信息多多少少會因為遮擋導致變形扭曲,如Fig 6.8所示,在大面積的遮擋情況下這種現象更為明顯。在存在有這種噪聲的骨骼點序列中,使用我們剛才提到的根據相對距離計算得到的視角不變性特徵,卻容易引入更多的噪聲,所謂的理論上的視角不變性便在這裏被打破了。

pic_noise_1

<div align='center'> <b> Fig 6.8 用Kinect對遮擋動作進行姿態估計,左手部分被遮擋,但是Kinect還是對時序上的上下文進行了估計,但是這種估計常常效果不佳,容易引入估計噪聲。 </b> </div>

在[45]中,作者指出我們可以把多視角樣本特徵分解為多視角之間共享的共享特徵(share features)和各個視角獨有的私有特徵(private features),通過這兩種類型的特徵的線性組合,對樣本特徵進行重建,公式如(6.1)。其他具體內容因為過於多數學的描述,限於篇幅,建議讀者有需要的直接翻閲[45]原文。 $$ f = \sum_{i=1}^{N_v} \alpha_i f_i + f_{private} \tag{6.1} $$

share_private_features

<div align='center'> <b> Fig 6.9 提取共享特徵和私有特徵,經過線性組合得到樣本特徵。 </b> </div>

在骨骼點序列上進行多視角動作識別

之前説到的都是在RGB上或者Depth數據上進行處理的方法,而在骨骼點序列上,也有很多關於多視角相關的算法。根據筆者的經驗來説,骨骼點數據天然具有較好的角度不變性,如果模型設計得當,在沒有顯式地設計視角不變性特徵的前提下,其跨視角識別能力通常都不會很差(甚至會比較理想)。但是骨骼點序列的問題在於噪聲,骨骼點序列因為遮擋,會引入很多噪聲,這點筆者一直在強調。筆者的一篇工作[37]也正是在嘗試接近這個噪聲帶來的問題。

不管怎麼樣説,還有不少方法在嘗試對不同視角的骨骼點序列進行對齊(alignment)的,這裏的對齊指的是使得不同視角的同一種動作類別的樣本看起來視角差異性儘量小一些。最簡單的方法如P-LSTM[28]所示,直接將身體的節點的連線(比如髖部連線)進行二維平面的旋轉對齊。這種方法蠻粗暴的,還有些方法在三維空間進行旋轉,如[32]和Fig 6.10所示。

3d_rotate

<div align='center'> <b> Fig 6.10 嘗試在三維空間對骨骼點序列進行旋轉對齊。 </b> </div>

不過筆者在這裏想要介紹的是所謂的View Adaptation網絡,這種網絡受到了Spatial Transformer Network, STN的啟發,引入了一種自動學習對齊骨骼點序列的子網絡。如Fig 6.10所示,這個View Adaptation Subnetwork可以自動學習不同視角之間樣本間的旋轉矩陣$\mathbf{R}t$和偏移向量$\mathbf{d}t$,使得同一種動作類別,不同視角的樣本看起來更加地接近,注意到三維空間的旋轉可以分解成$x,y,z$軸的旋轉的組合,那我們有: $$ \mathbf{R}t = \mathbf{R}{X}(\alpha) \mathbf{R}{Y}(\beta) \mathbf{R}{Z}(\gamma) \tag{6.2} $$ 其中的$\alpha,\beta,\gamma$是分別圍繞座標軸$X,Y,Z$的旋轉角度。

那麼具體到其中的各個旋轉軸矩陣,我們有: $$ \mathbf{R}_{X}(\alpha) = \left[\begin{matrix}1 & 0 & 0 \0 & \cos(\alpha) & -\sin(\alpha) \0 & \sin(\alpha) & \cos(\alpha)\end{matrix}\right]\tag{6.3} $$

$$ \mathbf{R}_{Y}(\beta) = \left[\begin{matrix}\cos(\beta) & 0 & \sin(\beta) \0 & 1 & 0 \-\sin(\beta) & 0 & \cos(\beta)\end{matrix}\right]\tag{6.4} $$

$$ \mathbf{R}_{Z}(\gamma) = \left[\begin{matrix}\cos(\gamma) & -\sin(\gamma) & 0 \\sin(\gamma) & \cos(\gamma) & 0 \0 & 0 & 1\end{matrix}\right]\tag{6.5} $$

那麼我們經過對齊後的,新的骨骼點座標是: $$ \mathbf{v}^{\prime}{t,j} = [x{t,j}^{\prime}, y_{t,j}^{\prime}, z_{t,j}^{\prime}]^{\mathrm{T}} = \mathbf{R}{t} (\mathbf{v}{t}-\mathbf{d})\tag{6.6} $$ 其中的參數$\mathbf{d}_t = [d_1,d_2,d_3]^{\mathrm{T}}$和$\alpha,\beta,\gamma$等完全由網絡學習得到,其旋轉和平移如Fig 6.11所示。

view_adapter

<div align='center'> <b> Fig 6.10 嘗試在三維空間對骨骼點序列進行旋轉對齊。 </b> </div>

3drotate_view_adaption

<div align='center'> <b> Fig 6.11 骨骼點在三維空間的旋轉和平移。 </b> </div>

View Adaptation網絡是可以隨處安插的,有點像BN層和Dropout層,你可以在模型中隨意安插這個子網絡。最終結果證明了這個對齊網絡的有效性,如Fig 6.12所示。

result_view_adaptation

<div align='center'> <b> Fig 6.12 在NTU RGBD 60數據集上的結果證明了View Adaptation網絡的有效性。 </b> </div>

在視頻動作理解中應用自監督學習

眾所周知,深度學習是數據驅動的(data-driven),非常需要有標註的良好數據去餵養模型。然而現實中我們並沒有那麼多有標註的數據,標註數據是非常耗時耗力耗財的。而我們在一開始就已經説過,每天互聯網上產生着那麼多的無標籤的視頻數據,不加以運用過於可惜,我們需要考慮如何讓模型在無標籤的視頻上“汲取”知識和養分,在不進行人工標註的情況下,提高模型的性能。

自監督學習背景

自監督學習(self-supervised Learning)是無監督學習中的一個有趣的分支,在介紹自監督學習之前,筆者打算舉個例子。假如我們現在有一個8位灰度圖像,其尺寸為10*10,也就是灰度級為256。那麼顯然的,如果對所有可能的像素值的情況進行遍歷,我們的圖片像素空間非常大,為$256^{100}$。這還只是在如此小的尺寸下的一個灰度圖的像素空間。

然而,大多數情況下,很多像素組合是沒有任何語義的,也就是説,你在現實中根本見不到這種像素組合,我們把所有可能在現實中見到的像素組合在高維空間中表示為一個點,那麼所有的點的組合構成了流形(manifold)。也就是説,我們的一切可能的樣本採樣都來自於這個流形。

對這個流形的形狀進行建模很重要,但是顯然不可能完全精確地描述這個流形,因為你需要幾乎無數的樣本才足以描述。在強監督學習中,我們現在有的只是這個流形上的一些有過標註的樣本(流形上的某些點可能代表一個類別,某些點可能是另一個類別),然而我們可以用無標籤的樣本去填補這個流形的缺口,嘗試去儘可能地描述這個流形,這是無監督學習整體來説在做的事情。

但是我們這個假設有個前提,每個像素之間的獨立無關的,然而現實是像素與像素之間很可能存在有語義關係,我們通常可以用一個像素去估計其周圍的像素,一般變化都不會特別大,就説明了這一點。因此我們可以進一步縮小無監督中需要的樣本數,我們因此有了自監督學習。

在自監督學習中,我們讓無標籤的樣本自己產生自己的標籤,因此我們就可以在無標籤樣本上進行強監督訓練了。我們需要定義出一個pretext任務,我們在無標籤的數據集上訓練這個pretext任務,通常我們並不很在意這個pretext模型的性能表現。在得到了模型參數之後,我們以這個模型的參數作為初始化,再在有標籤的數據集上進行訓練得到最後的模型。就本質上而言,自監督學習對模型進行了正則,減少了對標籤樣本的需求。

讓無標籤的樣本自己產生自己的標籤顯得很神奇,但其實並不難,比如一張圖片,我們可以把其中某一塊扣掉,然後讓模型根據沒有扣掉的部分去填充扣掉部分的圖形,這種叫inpainting,如Fig 7.1所示。

inpainting_self_supervised

<div align='center'> <b> Fig 7.1 利用inpainting進行圖片的自監督學習。 </b> </div>

對於文本序列樣本來説,更為直接的self-supervision方法就是Word2Vec語義嵌入了,我們可以用之前的詞語去預測後續的詞語,也可以用後續的詞語回測之前的詞語,也可以給詞語挖個空,根據周圍的詞語去預測中心詞語等等,如Fig 7.2所示。

word_self_supervision

<div align='center'> <b> Fig 7.2 對於序列的自監督學習可以參考的方法,文本序列類似。 </b> </div>

當然基於圖像的pretext任務還有很多,比如對輸入圖像進行指定角度的旋轉[54],訓練模型去判斷這個圖像旋轉角度是多少,因為旋轉角度是自己指定的有限集中的一個,因此是有標籤的,如Fig 7.3所示。也有一種是非常出名的方法,通過拼拼圖(jigsaw puzzle)[55]的方式進行pretext任務的定義。如Fig 7.4所示,我們在圖像上指定了九個拼圖塊,每一個塊都有其固定的編號從1-9。我們隨意進行打亂後,期望網絡可以對其重新排序,恢復正常的順序。

rotate_image_self_sup

<div align='center'> <b> Fig 7.3 在這種自監督策略中,模型需要判斷圖像的旋轉角度是多少。 </b> </div>

self-sup-jigsaw-puzzle

<div align='center'> <b> Fig 7.4 對圖片塊進行拼拼圖(jigsaw puzzle)的方式進行自監督學習。 </b> </div>

這些pretext任務,都是讓無標籤的數據自己產生了標籤,讓模型學習到了樣本本身的語義特徵,雖然這個pretext任務和我們的目標任務(比如動作識別,物體檢測,定位)等大相徑庭,但是它們的數據流形是一樣的,共享着語義特徵空間,因此通過自監督學習的方式,可以利用海量的無標籤的數據學習出更為理想的表徵(representation)。

在文章[51]中,研究者針對多種不同的視覺任務,對自監督的效果進行了廣泛的基線測試。研究者主要關注兩個問題:自監督任務的輔助數據集的大小尺度和pretext任務的任務難度對於整個預訓練過程的影響。作者發現自監督的無標籤數據集數據量越大,模型的效果越好,如Fig 7.5所示。同時作者發現,對於設定pretext任務的複雜度,對於整體模型的性能也是有很大影響的,如Fig 7.6所示。

self_pretrain_scale

<div align='center'> <b> Fig 7.5 自監督的數據集越大,效果越好。 </b> </div>

scale_problem_complex

<div align='center'> <b> Fig 7.6 控制自監督pretext任務的問題複雜度對於性能有很大影響。 </b> </div>

該文章還進行了很多其他實驗,在多種視覺任務中提供了自監督學習的堅實的(solid)基線標準,值得各位讀者仔細研讀。

基於視頻的自監督學習

我們之前談到的是在圖像數據上進行的自監督任務的例子。自監督學習的要點經常就體現在怎麼根據具體的下游任務和數據模態去設計合適的自監督pretext任務,在視頻數據上,其pretext任務和圖像數據有所不同。視頻包含着一系列在時間軸上具有語義關係的圖像幀,時間上鄰近的幀比其他更遠的幀可能具有着更強的語義關聯關係。這種特定的視頻序列排序描述了物理世界邏輯的因果邏輯和推斷:比如物體的運動應該是平滑的,重力方向總是朝下的(體現在物體下落)。對於視頻數據來説,一種通用的模式是:在海量的無標籤數據上進行一種或者多種pretext任務的訓練,然後提取出其特徵提取層,用有標籤的數據進行fine-tune下游任務,例如動作分類,分割,定位或者物體跟蹤等。

對於設計基於視頻的自監督pretext任務,有着以下幾種邏輯。

基於幀序列順序

視頻幀自然地是按照時間順序排列的。我們的模型理應能學習到視頻幀的正確順序,因而研究者們提出了若干基於幀序列順序的方法。其中一類方法被稱之為驗證幀順序(validate frame order)[53],這裏的pretext任務在於判斷給定的一小段視頻幀是否是按照正確的時間順序排列的(所謂的有效時間順序,valid temporal order)。模型需要具備能夠從視頻幀中的細微運動線索中跟蹤和推理的能力,從而才能完成這個任務。

首先,訓練幀序列從所謂的高運動窗區域(high-motion windows)提取,每次採樣5幀,記為$(f_a, f_b, f_c, f_d, f_e)$,並且其時間戳順序為$a < b < c < d < e$。在這5幀中,我們從中構建一個正樣本三元組(也就是時間順序是正常的),記為$(f_b, f_c, f_d)$,構建兩個負樣本三元組(時間順序亂序),記為$(f_b, f_a,f_d)$和$(f_b, f_e,f_d)$。超參數$\tau_{\max} = |b-d|$決定了正樣本訓練實例的難度(也就是越大,難度越強),超參數$\tau_{\min} = \min(|a-b|, |d-e|)$控制了負樣本的難度(也就是越小,難度越強)。研究者已經證實了在動作識別類型的下游任務中,基於驗證幀序列順序的方法可以提高性能。整體框圖如Fig 7.7所示。

frame-order-validation

<div align='center'> <b> Fig 7.7 驗證幀順序自監督方法的框圖。 </b> </div>

在O3N(Odd-One-Out Network)[56]中,作者同樣定義了一種新的基於驗證幀序列順序的pretext任務。這個任務嘗試從一堆小視頻片段中挑選出亂序的一個視頻片段,而其他是正常順序的。假設給定$N+1$個輸入視頻片段,其中的一個被人為地亂序了,其他的$N$個片段是正常順序的,我們的模型需要從中確定亂序的片段的位置。

基於跟蹤

視頻序列中物體的移動可以被視頻的時序關係所追蹤。在時間軸上相鄰的幀中出現的物體,通常差別不會特別大,通常只會有因為細小運動或者攝像頭抖動造成的干擾。因此,任何關於相同物體在相鄰的視頻幀上學習到的表徵,在特徵空間上應該是相似的。基於這個啟發,[57]提出了通過跟蹤視頻中運動物體,達到自監督目的的方法。

在具有運動信息的小時間視頻窗口(比如30幀),我們從中按照時間順序截取patch塊,其中第一個塊$\mathbf{x}$和最後一個塊$\mathbf{x}^+$被選擇作為訓練樣本點。我們可以預想到,因為是在小時間窗發生的動作,因此這兩個時間窗的特徵應該是接近的。但是如果我們簡單最小化這兩個patch之間的特徵向量,模型最終會陷入平凡解——也就是所有的特徵向量都會趨同,沒有任何區別,這樣並沒有帶來任何信息量。為了接近這個問題,我們引入第三個patch,我們同樣通過亂序的方式構造了負樣本$\mathbf{x}^-$。因此,我們最終期望有: $$ D(\mathbf{x}, \mathbf{x}^+) > D(\mathbf{x}, \mathbf{x}^-)\tag{7.1} $$ 其中的$D(\cdot)$是餘弦距離,為 $$ D(\mathbf{x}_1, \mathbf{x}_2) = 1 - \dfrac{f(\mathbf{x}_1)f(\mathbf{x}_2) }{||f(\mathbf{x}_1)|| \cdot ||f(\mathbf{x}_2)||}\tag{7.2} $$ 損失函數為: $$ \mathcal{L}(\mathbf{x}, \mathbf{x}^+, \mathbf{x}^-) = \max(0, D(\mathbf{x}, \mathbf{x}^+)-D(\mathbf{x}, \mathbf{x}^-)+M) + R\tag{7.3} $$ 其實就是triplet loss,其中的$R$是正則項,具體見筆者之前博文[58]。整個網絡框圖見Fig 7.8。

tracking-videos

<div align='center'> <b> Fig 7.8 對短時間窗口的物體進行跟蹤自監督方法。 </b> </div>

基於視頻着色

在[59]中,研究者提出將視頻着色(video-colorization)作為自監督方法手段,這樣產生的豐富表徵可以在不經過額外fine-tune的情況下,在視頻分割中使用。和在圖像中進行着色不同,在這裏的着色是,將彩色的目標視頻的像素拷貝到對應的灰度化的視頻上(灰度化可以由RGB視頻轉化而來),而並不是直接生成的。為了能夠做到這種拷貝,模型理應能夠對不同幀的相關聯的像素進行跟蹤。

video-colorization

<div align='center'> <b> Fig 7.9 基於視頻着色的自監督方法。 </b> </div>

這個想法簡單而有效,我們用$c_i$表示在參考的彩色視頻的第$i$個像素,用$c_j$表示灰度化的目標視頻的第$j$個像素。那麼對目標視頻的第$j$個像素的預測$\hat{c}j$是一個對參考視頻的所有像素的加權和: $$ \hat{x}j = \sum{i} A{ij}C_i \A_{ij} = \dfrac{\exp(f_i f_j)}{\sum_{i^{\prime}}\exp(f_{i^{\prime}}f_j)}\tag{7.4} $$ 其中的$f$是學習到的對應像素的嵌入特徵。$i^{\prime}$表示了在參考視頻中的像素。這種加權實現了注意力機制,類似於matching network[60]和pointer network[61]。

總結

基於視頻的自監督方法還有很多,有涉及到視頻拼圖恢復的,光流任務嵌入的等等,不管怎麼,這些pretext任務都是嘗試在無標籤數據中學習到視頻的motion和appearance信息,作為良好的正則引入模型,減少模型對有標籤樣本的需求,提高了性能。

視頻動作分析為什麼可以視為視頻理解的核心

我們在上文中提到了非常多的視頻動作識別的方法,涉及到了各種視頻模態,為什麼我們着重於討論視頻動作理解呢?明明視頻理解任務有着那麼多類型。無論具體的視頻理解任務是什麼,筆者認為視頻理解的核心還是在於如何組織視頻的motion流和appearance流語義信息,而動作識別任務是很好地評價一個模型是否對motion和appearance信息進行了有效組織的標準(而且對視頻進行動作標籤標註也比較簡單),如果一個模型能夠對視頻動作識別任務表現良好,那麼其特徵提取網絡可以作為不錯的視頻表徵提取工具,給其他下游的任務提供良好的基礎。

説在最後

這一路過來道阻且長,我們説了很多算法,對整個視頻動作理解的發展做了一個簡單的梳理,但是限於篇幅,意猶未盡,還有很多最新的論文內容在這裏沒有得到總結,我們在以後的拾遺篇將繼續我們的視頻分析的旅途。路漫漫其修遠兮,吾將上下而求索。

Reference

[1]. http://www.cac.gov.cn/wxb_pdf/0228043.pdf

[2]. https://blog.csdn.net/LoseInVain/article/details/87901764

[3]. https://research.google.com/youtube8m/

[4]. Wang H, Kläser A, Schmid C, et al. Dense trajectories and motion boundary descriptors for action recognition[J]. International journal of computer vision, 2013, 103(1): 60-79.

[5]. https://hal.inria.fr/hal-00830491v2/document

[6]. Karpathy A, Toderici G, Shetty S, et al. Large-scale video classification with convolutional neural networks[C]//Proceedings of the IEEE conference on Computer Vision and Pattern Recognition. 2014: 1725-1732.

[7]. Tran D, Wang H, Torresani L, et al. A closer look at spatiotemporal convolutions for action recognition[C]//Proceedings of the IEEE conference on Computer Vision and Pattern Recognition. 2018: 6450-6459.

[8]. Yue-Hei Ng J, Hausknecht M, Vijayanarasimhan S, et al. Beyond short snippets: Deep networks for video classification[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2015: 4694-4702.

[9]. Donahue J, Anne Hendricks L, Guadarrama S, et al. Long-term recurrent convolutional networks for visual recognition and description[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2015: 2625-2634.

[10]. Simonyan K, Zisserman A. Two-stream convolutional networks for action recognition in videos[C]//Advances in neural information processing systems. 2014: 568-576.

[11]. Ji S, Xu W, Yang M, et al. 3D convolutional neural networks for human action recognition[J]. IEEE transactions on pattern analysis and machine intelligence, 2012, 35(1): 221-231.

[12]. Tran D, Bourdev L, Fergus R, et al. Learning spatiotemporal features with 3d convolutional networks[C]//Proceedings of the IEEE international conference on computer vision. 2015: 4489-4497.

[13]. Carreira J, Zisserman A. Quo vadis, action recognition? a new model and the kinetics dataset[C]//proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2017: 6299-6308. (I3D)

[14]. Sun L, Jia K, Yeung D Y, et al. Human action recognition using factorized spatio-temporal convolutional networks[C]//Proceedings of the IEEE international conference on computer vision. 2015: 4597-4605.

[15]. Qiu Z, Yao T, Mei T. Learning spatio-temporal representation with pseudo-3d residual networks[C]//proceedings of the IEEE International Conference on Computer Vision. 2017: 5533-5541.

[16]. Feichtenhofer C, Pinz A, Zisserman A. Convolutional two-stream network fusion for video action recognition[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2016: 1933-1941. (TwoStreamFused)

[17]. Zhu Y, Lan Z, Newsam S, et al. Hidden two-stream convolutional networks for action recognition[C]//Asian Conference on Computer Vision. Springer, Cham, 2018: 363-378. (HiddenTwoStream)

[18]. Wang L, Xiong Y, Wang Z, et al. Temporal segment networks: Towards good practices for deep action recognition[C]//European conference on computer vision. Springer, Cham, 2016: 20-36. (TSN)

[19]. Girdhar R, Ramanan D, Gupta A, et al. Actionvlad: Learning spatio-temporal aggregation for action classification[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2017: 971-980. (ActionVLAD)

[20]. Diba A, Fayyaz M, Sharma V, et al. Temporal 3d convnets: New architecture and transfer learning for video classification[J]. arXiv preprint arXiv:1711.08200, 2017. (T3D)

[21]. https://medium.com/@lisajamhoury/understanding-kinect-v2-joints-and-coordinate-system-4f4b90b9df16

[22]. https://github.com/CMU-Perceptual-Computing-Lab/openpose

[23]. Baradel F, Wolf C, Mille J. Human action recognition: Pose-based attention draws focus to hands[C]//Proceedings of the IEEE International Conference on Computer Vision Workshops. 2017: 604-613.

[24]. Pavllo D, Feichtenhofer C, Grangier D, et al. 3D human pose estimation in video with temporal convolutions and semi-supervised training[J]. arXiv preprint arXiv:1811.11742, 2018.

[25]. https://blog.csdn.net/LoseInVain/article/details/88373506

[26]. https://blog.csdn.net/LoseInVain/article/details/90171863

[27]. https://blog.csdn.net/LoseInVain/article/details/90348807

[28]. A. Shahroudy, J. Liu, T. T. Ng, et al. Ntu rgb+d: A large scale dataset for 3d human activity analysis[C]. IEEE Conference on Computer Vision and Pattern Recognition, 2016, 1010-1019 (P-LSTM)

[29]. Liu J, Shahroudy A, Xu D, et al. Spatio-temporal lstm with trust gates for 3d human action recognition[C]//European Conference on Computer Vision. Springer, Cham, 2016: 816-833. (ST-LSTM)

[30]. Y. Du, Y. Fu, L. Wang. Skeleton based action recognition with convolutional neural network[C]. Pattern Recognition, 2016, 579-583 (Skel-CNN)

[31]. Ke Q, Bennamoun M, An S, et al. A new representation of skeleton sequences for 3d action recognition[C]//Computer Vision and Pattern Recognition (CVPR), 2017 IEEE Conference on. IEEE, 2017: 4570-4579.

[32]. Liu M, Liu H, Chen C. Enhanced skeleton visualization for view invariant human action recognition[J]. Pattern Recognition, 2017, 68: 346-362.

[33]. S. Yan, Y. Xiong, D. Lin. Spatial temporal graph convolutional networks for skeleton-based action recognition[C]. The Association for the Advance of Artificial Intelligence, AAAI, 2018, 5344-5352 (ST-GCN)

[34]. Yang D, Li M M, Fu H, et al. Centrality Graph Convolutional Networks for Skeleton-based Action Recognition[J]. arXiv preprint arXiv:2003.03007, 2020.

[35]. Gao J, He T, Zhou X, et al. Focusing and Diffusion: Bidirectional Attentive Graph Convolutional Networks for Skeleton-based Action Recognition[J]. arXiv preprint arXiv:1912.11521, 2019.

[36]. Li M, Chen S, Chen X, et al. Symbiotic Graph Neural Networks for 3D Skeleton-based Human Action Recognition and Motion Prediction[J]. arXiv preprint arXiv:1910.02212, 2019.

[37]. Ji Y, Xu F, Yang Y, et al. Attention Transfer (ANT) Network for View-invariant Action Recognition[C]//Proceedings of the 27th ACM International Conference on Multimedia. 2019: 574-582.

[38]. Rahmani H, Mian A. 3D action recognition from novel viewpoints[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2016: 1506-1515.

[39]. Rahmani H, Mian A, Shah M. Learning a deep model for human action recognition from novel viewpoints[J]. IEEE transactions on pattern analysis and machine intelligence, 2018, 40(3): 667-681.

[40]. Junejo I N, Dexter E, Laptev I, et al. Cross-view action recognition from temporal self-similarities[C]//European Conference on Computer Vision. Springer, Berlin, Heidelberg, 2008: 293-306.

[41]. Kacem A, Daoudi M, Amor B B, et al. A Novel Geometric Framework on Gram Matrix Trajectories for Human Behavior Understanding[J]. IEEE transactions on pattern analysis and machine intelligence, 2018.

[42]. Hernandez Ruiz A, Porzi L, Rota Bulò S, et al. 3D CNNs on distance matrices for human action recognition[C]//Proceedings of the 2017 ACM on Multimedia Conference. ACM, 2017: 1087-1095

[43]. Jaderberg M, Simonyan K, Zisserman A. Spatial transformer networks[C]//Advances in neural information processing systems. 2015: 2017-2025.

[44]. Zhang P, Lan C, Xing J, et al. View adaptive recurrent neural networks for high performance human action recognition from skeleton data[J]. ICCV, no. Mar, 2017.

[45]. Kong Y, Ding Z, Li J, et al. Deeply learned view-invariant features for cross-view action recognition[J]. IEEE Transactions on Image Processing, 2017, 26(6): 3028-3037.

[46]. Rogez G, Schmid C. Mocap-guided data augmentation for 3d pose estimation in the wild[C]//Advances in Neural Information Processing Systems. 2016: 3108-3116.

[47]. A. Gupta, J. Martinez, J. J. Little, and R. J. Woodham, “3D pose from motion for cross-view action recognition via non-linear circulant temporal encoding,” in Proc. IEEE Conf. Comput. Vis. Pattern Recognit., 2014, pp. 2601–2608.

[48]. A. Gupta, A. Shafaei, J. J. Little, and R. J. Woodham, “Unlabelled 3D motion examples improve cross-view action recognition,” in Proc. British Mach. Vis. Conf., 2014

[49]. Jaderberg M, Simonyan K, Zisserman A. Spatial transformer networks[C]//Advances in neural information processing systems. 2015: 2017-2025.

[50]. https://lilianweng.github.io/lil-log/2019/11/10/self-supervised-learning.html

[51]. Goyal P, Mahajan D, Gupta A, et al. Scaling and benchmarking self-supervised visual representation learning[C]//Proceedings of the IEEE International Conference on Computer Vision. 2019: 6391-6400.

[52]. Wang J, Jiao J, Bao L, et al. Self-supervised spatio-temporal representation learning for videos by predicting motion and appearance statistics[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2019: 4006-4015.

[53]. Misra I, Zitnick C L, Hebert M. Shuffle and learn: unsupervised learning using temporal order verification[C]//European Conference on Computer Vision. Springer, Cham, 2016: 527-544.

[54]. Gidaris S, Singh P, Komodakis N. Unsupervised representation learning by predicting image rotations[J]. arXiv preprint arXiv:1803.07728, 2018.

[55]. Noroozi M, Favaro P. Unsupervised learning of visual representations by solving jigsaw puzzles[C]//European Conference on Computer Vision. Springer, Cham, 2016: 69-84.

[56]. Fernando B, Bilen H, Gavves E, et al. Self-supervised video representation learning with odd-one-out networks[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2017: 3636-3645.

[57]. Wang X, Gupta A. Unsupervised learning of visual representations using videos[C]//Proceedings of the IEEE International Conference on Computer Vision. 2015: 2794-2802.

[58]. https://blog.csdn.net/LoseInVain/article/details/103995962

[59]. Vondrick C, Shrivastava A, Fathi A, et al. Tracking emerges by colorizing videos[C]//Proceedings of the European Conference on Computer Vision (ECCV). 2018: 391-408.

[60]. Vinyals O, Blundell C, Lillicrap T, et al. Matching networks for one shot learning[C]//Advances in neural information processing systems. 2016: 3630-3638.

[61]. Vinyals O, Fortunato M, Jaitly N. Pointer networks[C]//Advances in neural information processing systems. 2015: 2692-2700.