Attention Cluster 模型
視訊分類問題在視訊標籤、監控、自動駕駛等領域有著廣泛的應用,但它同時也是計算機視覺領域面臨的一項重要挑戰之一。
目前的視訊分類問題大多是基於 CNN 或者 RNN 網路實現的。眾所周知,CNN 在影象領域已經發揮了重大作用。它具有很好的特徵提取能力,通過卷積層和池化層,可以在影象的不同區域提取特徵。RNN 則在獲取時間相關的特徵方面有很強的能力。
Attention Cluster 在設計上僅利用了 CNN 模型,而沒有使用 RNN,主要是基於視訊的以下幾個特點考慮:
圖 1 視訊幀的分析
首先,一段視訊的連續幀常常有一定的相似性。在圖 1(上)可以看到,除了擊球的動作以外,不同幀幾乎是一樣的。因此,對於分類,可能從整體上關注這些相似的特徵就足夠了,而沒有必要去特意觀察它們隨著時間的細節變化。
其次,視訊幀中的區域性特徵有時就足夠表達出視訊的類別。比如圖 1(中),通過一些區域性特徵,如牙刷、水池,就能夠分辨出『刷牙』這個動作。因此,對於分類問題,關鍵在於找到幀中的關鍵的區域性特徵,而非去找時間上的線索。
最後,在一些視訊的分類中,幀的時間順序對於分類不一定是重要的。比如圖 1(下),可以看到,雖然幀順序被打亂,依然能夠看出這屬於『撐杆跳』這個類別。
基於以上考慮,該模型沒有考慮時間相關的線索,而是使用了 Attention 機制。它有以下幾點好處:
1. Attention 的輸出本質上是加權平均,這可以避免一些重複特徵造成的冗餘。
2. 對於一些區域性的關鍵特徵,Attention 能夠賦予其更高的權重。這樣就能夠通過這些關鍵的特徵,提高分類能力。
3. Attention 的輸入是任意大小的無序集合。無序這點滿足我們上面的觀察,而任意大小的輸入又能夠提高模型的泛化能力。
當然,一些視訊的區域性特徵還有一個特點,那就是它可能會由多個部分組成。比如圖 1(下)的『撐杆跳』,跳、跑和著陸同時對這個分類起到作用。因此,如果只用單一的 Attention 單元,只能獲取視訊的單一關鍵資訊。而如果使用多個 Attention 單元,就能夠提取更多的有用資訊。於是,Attention Cluster 就應運而生了!在實現過程中,百度計算機視覺團隊還發現,將不同的 Attention 單元進行一次簡單有效的『位移操作』(shifting operation),可以增加不同單元的多樣性,從而提高準確率。
接下來我們看一下整個 Attention Cluster 的結構。
圖 2 Attention Cluster 的模型結構
整個模型可以分為三個部分:
1. 區域性特徵提取。通過 CNN 模型抽取視訊的特徵。提取後的特徵用 X 表示,如公式(1)所示:(1)X 的維度為 L,代表 L 個不同的特徵。
2. 區域性特徵整合。基於 Attention 來獲取全域性特徵。Attention 的輸出本質上相當於做了加權平均。如公式(2)所示,v 是一個 Attention 單元輸出的全域性特徵,a 是權重向量,由兩層全連線層組成,如公式(3)所示。實際實現中,v 的產生使用了 Shifting operation,如公式(4)所示,其中α和β是可學習的標量。它通過對每一個 Attention 單元的輸出新增一個獨立可學習的線性變換處理後進行 L2-normalization,使得各 Attention 單元傾向於學習特徵的不同成分,從而讓 Attention Cluster 能更好地學習不同分佈的資料,提高整個網路的學習表徵能力。由於採用了 Attention clusters,這裡會將各個 Attention 單元的輸出組合起來,得到多個全域性特徵 g,如公式(5)所示。N 代表的是 clusters 的數量。
3. 全域性特徵分類。將多個全域性特徵拼接以後,再通過常規的全連線層和 Softmax 或 Sigmoid 進行最後的單標籤或多標籤分類。
用 PaddlePaddle 訓練 Attention Cluster
PaddlePaddle 開源的 Attention Cluster 模型,使用了 2nd-Youtube-8M 資料集。該資料集已經使用了在 ImageNet 訓練集上 InceptionV3 模型對特徵進行了抽取。
如果執行該模型的樣例程式碼,要求使用 PaddlePaddle Fluid V1.2.0 或以上的版本。
資料準備:首先請使用 Youtube-8M 官方提供的連結下載訓練集和測試集,或者使用官方指令碼下載。資料下載完成後,將會得到 3844 個訓練資料檔案和 3844 個驗證資料檔案(TFRecord 格式)。為了適用於 PaddlePaddle 訓練,需要將下載好的 TFRecord 檔案格式轉成了 pickle 格式,轉換指令碼請使用 PaddlePaddle 提供的指令碼 dataset/youtube8m/tf2pkl.py。
訓練集:http://us.data.yt8m.org/2/frame/train/index.html
測試集:http://us.data.yt8m.org/2/frame/validate/index.html
官方指令碼:https://research.google.com/youtube8m/download.html
模型訓練:資料準備完畢後,通過以下方式啟動訓練(方法 1),同時我們也提供快速啟動指令碼 (方法 2)
# 方法 1
python train.py --model-name=AttentionCluster
--config=./configs/attention_cluster.txt
--save-dir=checkpoints
--log-interval=10
--valid-interval=1
# 方法 2
bash scripts/train/train_attention_cluster.sh
使用者也可下載 Paddle Github 上已釋出模型通過--resume 指定權重存放路徑進行 finetune 等開發。
資料預處理說明: 模型讀取 Youtube-8M 資料集中已抽取好的 rgb 和 audio 資料,對於每個視訊的資料,均勻取樣 100 幀,該值由配置檔案中的 seg_num 引數指定。
模型設定: 模型主要可配置引數為 cluster_nums 和 seg_num 引數。其中 cluster_nums 是 attention 單元的數量。當配置 cluster_nums 為 32, seg_num 為 100 時,在 Nvidia Tesla P40 上單卡可跑 batch_size=256。
訓練策略:
採用 Adam 優化器,初始 learning_rate=0.001
訓練過程中不使用權重衰減
引數主要使用 MSRA 初始化
模型評估:可通過以下方式(方法 1)進行模型評估,同樣我們也提供了快速啟動的指令碼(方法 2):
# 方法 1
python test.py --model-name=AttentionCluster
--config=configs/attention_cluster.txt
--log-interval=1
--weights=$PATH_TO_WEIGHTS
# 方法 2
bash scripts/test/test_attention_cluster.sh
使用 scripts/test/test_attention_cluster.sh 進行評估時,需要修改指令碼中的--weights 引數指定需要評估的權重。
若未指定--weights 引數,指令碼會下載已釋出模型進行評估
模型推斷:可通過如下命令進行模型推斷:
python infer.py --model-name=attention_cluster
--config=configs/attention_cluster.txt
--log-interval=1
--weights=$PATH_TO_WEIGHTS
--filelist=$FILELIST
模型推斷結果儲存於 AttentionCluster_infer_result 中,通過 pickle 格式儲存。
若未指定--weights 引數,指令碼會下載已釋出模型 model 進行推斷
模型精度:當模型取如下引數時,在 Youtube-8M 資料集上的指標為:
引數取值:
評估精度:
傳送門:
PaddlePaddle Github: https://github.com/PaddlePaddle
Attention Cluster in PaddlePaddle Github:https://github.com/PaddlePaddle/models/tree/develop/fluid/PaddleCV/video/models/attention_cluster
Reference:Xiang Long, Chuang Gan, Gerard de Melo, Jiajun Wu, Xiao Liu, Shilei Wen, Attention Clusters: Purely Attention Based Local Feature Integration for Video Classification
https://arxiv.org/abs/1711.09550