1. 程式人生 > >使用Motion-Vector實現Real-time人體行為識別

使用Motion-Vector實現Real-time人體行為識別

導言:由上一篇部落格的方法實現人體行為識別,準確率高,但缺陷在於速度慢,最大的原因在於經典的two-stream的人體行為識別均使用光流圖作為temporal net的輸入。光流法速度慢,在應用中無法實時。

這篇部落格引用論文

Real-time Action Recognition with Enhanced Motion Vector CNNs——–Bowen Zhang, Limin Wang, Zhe Wang, Yu Qiao, Hanli Wang

MotionVector來替代optical flow可以極大的提升速度。MotionVector原本用於視訊壓縮,以便視訊傳輸到指定端後解壓。論文中使用MotionVector作為運動特徵來使用。但是速度快帶來的缺陷是圖片精度低,與光流圖的點狀形式存在不同,運動向量圖以塊狀存在,因此圖片不清楚,噪聲多,勢必帶來識別準確率的下降。

該網路的核心思想是通過使用optical flow訓練好的OF-CNN指導MV-CNN的訓練。該transfer knowledge思想來自於Hinton大神的一篇論文:

Distilling the knowledge in neural network

論文中使用了兩種方法來防止精度過度下降。

1.使用Teacher Initialization進行初始化。即使用opticalflow的model進行初始化,再用motion vector進行fine-tune.

2.使用監督性transfer。即定義一種新的loss。該loss稱之為Teacher superivision loss(TSL)。使用softmax loss 和TSL共同監督網路。knowledge transfer

TSL公式如下這裡寫圖片描述

PT(i)代表optical flow在fc layer的值除以Temp,並經過softmax的輸出。Ps(i)是MV-CNN的softmax輸出(不用除以TEMP)。TEMP是來自於Hinton的論文,稱之為temperature (to soften the next-to-last layer output)。

MV-CNN網路本身的LOSS,即普通的softmax:

這裡寫圖片描述

最終的LOSS為

這裡寫圖片描述
其中w是權重,一般設定為4,Temp一般為w的一半,即2。

論文重點就這兩個,其最終的結果是略次於two-stream的方法,比C3D強。

我的實驗:

由於前兩天剛完成VGG的two-stream Action recognition,因此直接使用VGG完成這篇論文的部分實驗。僅僅做了如下改變

  1. 將optical flow換成motion vector。其中出了一個bug: motion vector有的視訊的圖片數量小於光流法,原因在於不是每一幀都包含motion vector,有的幀提取不出運動向量,即I-frame,因此可能出現丟幀的情況。在本例中,我發現有的視訊最後一幀和最後一幀無法提取出運動向量。因此少這兩幀。如果是中間幀缺失,程式會講上一幀的影象複製到當前幀。因此:將訓練檔案中的圖片個數進行修改,修改到與Motion vector一致。
  2. 換pretrain model,換成optical-CNN訓練完成的model。
  3. 換學習率,增大學習率,與論文中一致,不過發現迭代次數不需要太多,stepvalue大概一萬就可以,下降三次即可收斂完畢。
    補充:我的測試是在python下進行的,因此速度測試存在一個問題,這個問題是矩陣賦值的速度極大的影響了整個網路的執行速度。比如圖片的crop一定會用矩陣賦值,經過測試,crop圖片中心進行測試,caffe模型的執行時間是0.1s,而crop賦值達到0.06s。而作者是matlab,因此矩陣賦值的速度遠遠大於沒有用mkl優化的numpy賦值。速度測試一直耽擱著,等解決了會再更新。

實驗結果:temporal的Training Acc:64.6%,測試Acc:79.78%。加入spatial net(與上一篇部落格的model一樣)後的ACC:84.985%。

反思:最終的結果不能令人滿意,我的temporal Accuracy超過論文中的79.3%,而最終的combination Acc:86.6%。超過我大概有1.6%。我的網路比他深,始終想不出有什麼原因會導致結合準確率低於他。等以後有思路了,一定會更新。