自動分類打標籤!飛槳TSM模型幫你做視訊理解

PaddlePaddle發表於2019-08-16
導讀:目前網際網路視訊資料日益增多,使用者觀看短視訊、小視訊的時長也迅速增長,如何對海量的視訊資源快速準確地分析、處理、歸類是一個亟待解決的問題。視訊理解技術可以多維度解析視訊內容,理解視訊語義,自動分類打標籤,極大節省人工稽核效率,節約成本;同時實現精準使用者推薦,提升體驗效果。

1.  視訊理解之TSM

談到視訊理解,不得不給大家介紹一下新鮮出爐的視訊理解技術之一:TSM(Temporal Shift Module)。TSM是由MIT和IBM Watson AI Lab的Ji Lin,Chuang Gan和SongHan等人提出的通過時間位移模擬3D建模達到效果和效能的平衡,提高視訊理解能力的模組。

跟TSM最相關的視訊理解模型當屬Limin Wang等人在ECCV2016上發表的Temporal Segment Network (TSN)了。TSN模型從視訊中取樣N幀影像並通過最簡單直接地對N幀影像分類結果進行平均的方式進行時序資訊融合,取得了當時State-of-the-art的效能,並得到大規模的應用。考慮到TSN模型對時序資訊的建模不夠充分,以I3D,S3D, P3D等為代表的一系列工作通過3D卷積進行端到端聯合時空建模,這一系列工作儘管能捕獲時空特徵,但是相比TSN,由2D卷積到3D卷積不可避免地引入了額外計算量。TSM巧妙的通過時間維度特徵map移位的想法,理論上用零額外計算開銷達到了不同幀之間特徵融合聯合建模的目的。

論文: Temporal Shift Module for Efficient VideoUnderstanding:https://arxiv.org/pdf/1811.08383v2.pdf

先看一下文中給出的測試視訊示例:如果圖片分別從左往右播放和從右往左播放,測試者會給出不同但是正確的理解結果,說明對視訊的理解強依賴於視訊的時序關係。

自動分類打標籤!飛槳TSM模型幫你做視訊理解

看起來很有意思,我們繼續深入研究一下。

2.  TSM關鍵技術介紹

在傳統的圖片分析的基礎上,視訊分析需要研究者補充關於時間資訊(temporal information)的建模結構。目前,2D CNN和3D CNN是視訊理解中最常用的兩個方法:使用2D CNN 模型運算量少但會喪失部分時間資訊;而使用3D CNN雖然效果好但運算量極大。面對這樣的情況,MIT和IBM Watson AI Lab的Ji Lin,Chuang Gan和Song Han等人提出了Temporal Shift Module (TSM)模組。他們將時間位移模組嵌入2D CNN,從而可以在不新增任何額外的計算量和引數的情況下,輕鬆地達到與3D CNN效果相當的視訊理解能力.

自動分類打標籤!飛槳TSM模型幫你做視訊理解

上圖中矩陣的行和列分別表示特徵圖中的temporal和channel維度。在TSM模組中,將一部分的channel在temporal維度上向前位移一步,一部分的channel在temporal維度上向後位移一步,位移後的空缺補零。通過這種方式在特徵圖中引入temporal維度上的上下文互動,提高了在時間維度上的建模能力。

在此基礎上,MIT和IBM Watson AI Lab的研發人員將模組進一步細分為適合線上視訊使用的TSM模組和適合離線視訊使用的TSM模組。

自動分類打標籤!飛槳TSM模型幫你做視訊理解

雙向(bi-direction)的TSM模組可獲取過去和未來的時空資訊,適合高吞吐量的離線視訊使用;而單向(uni-direction)的TSM模組僅可比對現在和過去的時空資訊,適用於低延遲線上視訊的識別。

好了,基本原理搞清楚了,可以找一個專案直接上手分析了。

3.  飛槳TSM快速上手

飛槳(PaddlePaddle)目前實現的版本是以ResNet-50作為主幹網路的TSM模型。

    3.1.資料準備

TSM的訓練資料採用由DeepMind公佈的Kinetics-400動作識別資料集。資料下載及準備請參考:

https://github.com/PaddlePaddle/models/blob/v1.5.1/PaddleCV/PaddleVideo/dataset/README.md

3.2.模型訓練

資料準備完畢後,可以通過如下兩種方式啟動訓練:

export FLAGS_fast_eager_deletion_mode=1
export FLAGS_eager_delete_tensor_gb=0.0
export FLAGS_fraction_of_gpu_memory_to_use=0.98
python train.py --model_name=TSM
        --config=./configs/tsm.txt
        --save_dir=checkpoints
        --log_interval=10
        --valid_interval=1
        --pretrain=${path_to_pretrain_model}

bash scripts/train/train_tsm.sh

[1]  從頭開始訓練,需要載入在ImageNet上訓練的ResNet50權重作為初始化引數,請下載此模型引數(https://paddlemodels.bj.bcebos.com/video_classification/ResNet50_pretrained.tar.gz)並解壓,將上面啟動指令碼中的path_to_pretrain_model設定為解壓之後的模型引數存放路徑。如果沒有手動下載並設定path_to_pretrain_model,則程式會自動下載並將引數儲存在~/.paddle/weights/ResNet50_pretrained目錄下面。

[2]  可下載已釋出模型model(https://paddlemodels.bj.bcebos.com/video_classification/tsm_kinetics.tar.gz)通過--resume指定權重存放路徑進行finetune等開發。

資料讀取器說明:

模型讀取Kinetics-400資料集中的mp4資料,每條資料抽取seg_num段,每段抽取1幀影像,對每幀影像做隨機增強後,縮放至target_size。

訓練策略:

  • 採用Momentum優化演算法訓練,momentum=0.9

  • 權重衰減係數為1e-4

模型評估

可通過如下兩種方式進行模型評估:

python test.py --model_name=TSM
        --config=configs/tsm.txt
        --log_interval=1
        --weights=$PATH_TO_WEIGHTS

bash scripts/test/test_tsm.sh

[1]  使用scripts/test/test_tsm.sh進行評估時,需要修改指令碼中的--weights引數指定需要評估的權重

[2]  若未指定--weights引數,指令碼會下載已釋出模型進行評估。

當取如下引數時,在Kinetics400的validation資料集的評估精度如下:

seg_num

target_size

Top-1

8

224

0.70


3.3.模型推斷

可通過如下命令進行模型推斷:

  • 模型推斷結果儲存於TSM_infer_result中,通過pickle格式儲存。

  • 若未指定--weights引數,指令碼會下載已釋出模型進行推斷。

python infer.py --model_name=TSM
        --config=configs/tsm.txt
        --log_interval=1
        --weights=$PATH_TO_WEIGHTS
        --filelist=$FILELIS

3.4.效果實測

TOP5預測結果

分類

概率

Yoga(瑜伽)

0.973069250584

stretching_leg(腿部拉伸)

0.0223769713193

bending_back(向後彎腰)

0.00322460732423

stretching_arm(上臂拉伸)

0.00108245189767

Lunge(猛衝)

0.00108245189767

可以看到,TSM模型準確的判斷出了視訊中是瑜伽(yoga)動作,而且預測概率0.97也是足夠高,完全可以在商業中應用起來。

相關文章