百度視覺技術部聯合PaddlePaddle團隊近期開源了用於視訊分類的StNet框架。StNet框架為ActivityNet Kinetics Challenge 2018中奪冠的網路框架。本次開源了基於ResNet50實現的StNet模型。該模型提出“super-image"的概念,在super-image上進行2D卷積,建模視訊中區域性時空相關性。另外通過temporal modeling block建模視訊的全域性時空依賴,最後用一個temporal Xception block對抽取的特徵序列進行長時序建模。該框架在動作識別方面優於一些最先進的方法,可以在識別精度和模型複雜性之間取得令人滿意的平衡。
應用背景
視訊當中的動作識別任務已經獲得了許多從事計算機視覺與機器學習研究人員的重點關注。越來越多的視訊錄影裝置的普及,讓更多好玩有趣的視訊豐富了人們的業餘生活。但是過多的視訊已經遠遠超過人工能夠處理的範圍,因此發展針對各種應用場景的自動視訊理解演算法變得尤為重要,比如:視訊推薦、人類行為分析、視訊監控等等。
深度學習在靜態影像理解上取得了巨大成功,但是針對視訊時空建模中最有效的網路架構是什麼還尚不清楚,因此我們將新探索的用於視訊中區域性和全域性時空建模的時空網路(StNet)架構與現有的CNN+RNN模型或是基於純3D卷積的方法進行比對分析,來尋求更有效的網路架構。
現有方法分析
由於深度學習在圖片識別中的卓越表現,該技術也被應用到了解決視訊分類的場景當中。這其中就有兩個主要的研究方向,一個是應用CNN+RNN框架結構來對視訊序列建模,還有一個是單純的利用卷積網路結構來識別視訊當中的行為。但是在動作識別準確性方面,目前的行動識別方法仍然遠遠落後於人類表現。現有方法存在如下待改進之處。
n CNN+RNN模型
1. 對於CNN+RNN的方法,CNN前饋網路部分用來空間建模(spatial modeling),LSTM或者GRU用來時域建模(temporal modeling),由於該模型自身的迴圈結構,這導致了端到端的優化困難。
2. 單獨訓練的CNN和RNN部分對於聯合的時空特徵表示學習(representation learning)不是最佳的。
n 純卷積網路結構
1. 2D卷積網路結構在抽取外觀特徵(appearance features)的時候,只利用了區域性的空間資訊而忽略了區域性的時域資訊;此外,對於時域動態,2D卷積網路僅融合了幾個區域性片段的分類得分並計算平均值,這種取平均的方法在捕捉時空資訊方面的效能有待提高。
2. 3D卷積網路結構可以同時在空間和時間上建模進而得到令人滿意的識別任務結果。眾所周知,淺層的神經網路與深層神經網路相比,淺層網路在大資料集中,表現出較差的表示學習能力。當進行大規模資料集中的人類行為識別任務時,一方面淺層的3D卷積網路得到的視訊特徵的可辨別性相對深層網路較弱,另一方面,深層的3D卷積網路會導致過大的模型以及在訓練中和推理階段中過高的計算成本。
StNet模型
區域性資訊和全域性資訊對識別視訊中的行為都起著非常重要的作用。
例如,在圖1(a)中,我們可以通過區域性的空間資訊來識別搬磚和搬石頭,換而言之,在該圖中,區域性的空間資訊(local spatial information)是我們識別行為至關重要的因素。而在圖1(b)中,全域性時空(global spatial-temporal)線索是用來區分”摞卡片”和”飛卡片”這兩個場景行為的關鍵證據。
圖1區域性資訊足以區分”搬磚”和”搬石頭”;全域性時空資訊可以分別”摞卡片”和”飛卡牌”
StNet可以由先進的2D卷積網路改造可得,比如:ResNet,InceptionResnet等等。圖2展示瞭如何從Resnet構建StNet。
圖2:基於ResNet骨架構建的StNet。StNet的輸入是T ×3N ×H ×W張量。通過2D卷積對區域性時空模型進行模型。在Res3和Res4塊之後插入時序卷積模組進行全域性時空特徵建模。最後,用時序Xception模組進一步建模時序動態資訊。3D卷積的設定是(# Output Channel, (temporal kernel size, height kernel size, width kernel size), # groups) -(Ci, (3,1,1), 1)
1. 超影像(Super-Image):
StNet的輸入為均勻取樣的T個區域性連續N幀的視訊幀。區域性的連續N幀組合成一個”超圖”,這使得”超圖”保留原始視訊各個區域性的時空資訊。所以網路的輸入是一個尺寸為T*3N*H*W的張量。
2. 時域建模組(Temporal Modeling Block)
採用2D卷積對T個”超圖”進行區域性時空關係的建模,可以避免 3D 卷積網路引數量和計算量大的問題,進而生成T個區域性時空特徵圖。通過堆疊3D卷積/2D卷積模組,對T個區域性時空特徵圖進行全域性時空資訊的建模,這對理解整個視訊起到至關重要的作用。具體而言,我們選擇插入2個時域建模組在Res3和Res4塊之後。時域建模組是為了捕捉視訊序列內的長期時域動態,可以利用Conv_3d-BN3d-RELU架構實現。將3D卷積空間維度的kernel size設定成1以節省模型的引數量與計算量。
3. 時域Xception模組(Temporal Xception Block):
時域Xception模組是為了在特徵序列之間進行有效的時域建模,並能輕鬆地進行端到端優化。Xception模組的設計主要基於時序1維卷積,採用了channel-wise和temporal-wise分離的策略進一步減少計算量與模型引數量。
時域Xception塊結構如下:
圖3:時域 Xception 塊(TXB)。時域Xception 塊的詳細配置如(a)所示:括號中的參數列示 1D卷積的(#kernel,kernel size,padding,#groups)配置。綠色的塊表示 channel-wise 的 1D 卷積,藍色的塊表示 temporal-wise 的 1D 卷積。(b)描繪了 channel-wise 和 temporal-wise 的 1D 卷積。TXB 的輸入是視訊的特徵序列,表示為 T×C_in 張量。Channel-wise 1D 卷積的每個卷積核僅在一個通道內沿時間維度應用。Temporal-wise 的 1D 卷積核在每個時序特徵中跨所有通道進行卷積
基於PaddlePaddle 實戰
環境準備:PaddlePaddle Fluid 1.3 + cudnn5.1 。使用cudnn7.0以上版本時batchnorm計算moving mean和moving average會出現異常,此問題還在修復中。建議使用者安裝PaddlePaddle時指定cudnn版本。
資料準備:Kinetics資料集是DeepMind公開的大規模視訊動作識別資料集,有Kinetics400與Kinetics600兩個版本。這裡使用Kinetics400資料集。
ActivityNet官方提供了Kinetics的下載工具,具體參考其官方repo 即可下載Kinetics400的mp4視訊集合。將kinetics400的訓練與驗證集合分別下載到:
dataset/kinetics/data_k400/train_mp4dataset/kinetics/data_k400/val_mp4。
官方repo:https://github.com/activitynet/ActivityNet/tree/master/Crawler/Kinetics
模型訓練:資料準備完畢後,通過以下方式啟動訓練(方法 1),同時我們也提供快速啟動指令碼 (方法 2)
#方法1
python train.py --model-name=STNET
--config=./configs/stnet.txt
--save-dir=checkpoints
--log-interval=10
--valid-interval=1
#方法2
bash scripts/train/train_stnet.sh
使用者也可下載Paddle Github上已釋出模型通過--resume指定權重存放路徑進行finetune等開發。
資料預處理說明:模型讀取Kinetics-400資料集中的mp4資料,每條資料抽取seg_num段,每段抽取seg_len幀影像,對每幀影像做隨機增強後,縮放至target_size。
訓練策略:
· 採用Momentum優化演算法訓練,momentum=0.9
· 權重衰減係數為1e-4
· 學習率在訓練的總epoch數的1/3和2/3時分別做0.1的衰減
模型評估:通過以下方式(方法 1)進行模型評估,同樣我們也提供了快速啟動的指令碼(方法 2):
#方法1
python test.py --model-name=STNET
--config=configs/stnet.txt
--log-interval=1
--weights=$PATH_TO_WEIGHTS
#方法2
bash scripts/test/test__stnet.sh
· 使用scripts/test/test_stnet.sh進行評估時,需要修改指令碼中的--weights引數指定需要評估的權重。
· 若未指定--weights引數,指令碼會下載已釋出模型進行評估。
模型推斷:可通過如下命令進行模型推斷:
python infer.py --model-name=stnet
--config=configs/stnet.txt
--log-interval=1
--weights=$PATH_TO_WEIGHTS
--filelist=$FILELIST
· 模型推斷結果儲存於STNET_infer_result中,通過pickle格式儲存。
· 若未指定--weights引數,指令碼會下載已釋出模型進行推斷。
模型精度:當模型取如下引數時,在 Kinetics400資料集上的指標為:
引數取值
評估精度
傳送門:
PaddlePaddle Github: https://github.com/PaddlePaddle
StNet in PaddlePaddle Github:
https://github.com/PaddlePaddle/models/blob/develop/fluid/PaddleCV/video/models/stnet