論文閱讀:Attentional Pooling for Action Recognition

這是2017年NIPS上的一篇做動作識別的論文,作者提出了second-order pooling的低秩近似attentional pooling,用來代替CNN網路結構中最後pooling層常用的mean pooling或者max pooling, 在MPII, HICO和HMDB51三個動作識別數據集上進行了實驗,都取得了很好的結果。此外作者還嘗試了加入pose關鍵點的信息,再次提高了性能。下面我詳細說明我對這篇論文的理解。

論文概況

  1. 論文鏈接: Attentional Pooling for Action Recognition。
  2. 代碼鏈接:github.com/rohitgirdhar, 採用TensorFlow和Slim來實現。
  3. 作者介紹:Rohit Girdhar, CMU 在讀博士生,也是ActionVLAD的作者。

Second-order pooling

在CNN結構中,pooling層我們一般採用mean pooling或者max pooling,這兩者都是一階pooling (first-order pooling), 因為mean和max操作都是對feature map進行一階操作。而second-order pooling,顧名思義,就是對feature map進行二階操作的pooling,而這裡的二階操作,根據論文[1]中的說明,是通過feature map中的每個向量與自身的轉置求外積來實現的。second-order pooling也有mean和max之分,如下面的圖所示:

Second-order mean pooling, 摘自 論文[1]

Second-order max pooling, 摘自 論文[1]。

一個很顯然的問題是,second-order pooling比first-order pooling計算量要大,因為實際實現的時候,second-order pooling須用到矩陣相乘,計算量自然比矩陣求max或求mean要大。既然如此,那會為什麼還有人用second-order pooling呢?這是因為研究者發現在語義分割和細分類問題中,二階pooling效果更好,因此為了效果提升,在某些情況下增加一些計算量還是值得的。

Second-order pooling的低秩近似

對於二分類問題,作者推導出了採用second-order pooling後輸出score的計算形式,如下:

eq. 2

然後,對權重矩陣W進行秩為1的近似,將其表示為2個向量ab的轉置的乘積,則經過如下的推導可以得出公式如下:

eq. 3 - eq. 6

其中公式 (4) 利用了跡的性質:tr(ABC) = tr(CAB) = tr(BCA),公式 (5) 利用了性質:標量的跡等於標量本身。 進一步,公式 (6) 還可以調整為如下形式:

eq. 7 - eq. 8

可以看到,最後的得分可以分成兩部分,前一部分是輸入feature map X與向量a的乘積的轉置,第二部分是輸入feature map X和向量b的乘積。

Top-down attention 和 bottom-up attention

以上公式推導是針對二分類問題的,對於多分類問題,只需要將參數W變為針對每個類不同的Wk即可,公式如下:

eq. 9

對輸入X,計算所有的score(X, k), k=1, 2, ..., N,N為類別數,尋找最大的score值,對應的k即為predict的類別。

同時,對Wk也可以進行一階的近似,將其表示為Wk = ak * b,注意ak表示向量a是跟k有關的,而向量b是與類別k無關,因此公式 (8) 可以寫成下面形式:

eq. 10

其中tk項是top-down attention而h項是bottom-up attention。作者這樣分,也是受一篇2006年CVPR論文的啟發,從下面的摘要可以看出(懷念750張圖片就可以發CVPR的時代……), top-down attention 是用目標驅動的方式來進行visual search,而 bottom-up 則是根據圖像的顯著性信息來進行visual search,這種分類方式也是受到人類視覺系統的啟發。

以上介紹的 top-down attention 和 bottom-up attention 合在一起就是 attentional pooling 的實現方式。

Pose-regularized attention

除了提出 attentional pooling, 作者還提出利用人體姿態關鍵點對attention進行約束,實現方式就是在之前網路最後加了2個MLP來預測17通道的heat map,其中16個通道時人體姿態關鍵點,而最後一個通道是 bottom-up attention 的 feature map, 如下圖右側中的method 2所示。 通過最小化姿態關鍵點的loss和 attentional pooling的loss 的加權和,使得最後的網路更好地收斂到對應的動作類別。

實現框架

實驗數據集說明

實驗中採用了MPII, HICO 和 HMDB51 數據集。 需要注意的是, HMDB51 雖然是視頻數據集,但是作者只在RGB數據上做了實驗,而且對比的結果也只是只採用RGB數據的結果,因此在視頻動作識別上最終的性能怎樣,還有待驗證。

MPII是德國馬克斯·普朗克計算機科學研究所發布的圖片數據集,具體的任務有人體姿態估計,動作識別等。數據集已經有人體姿態關鍵點的數據。包括的動作類別有393類,總共有15205張圖片,其中訓練集、驗證集、測試集分別有8218、6987和5708張圖片。

HICO是一個人和物體交互的數據集,包括117類動作和80類物體,訓練集和測試集分別有38116張圖像和9658張圖像。

HMDB51是視頻動作識別任務裡面的一個數據集,包含6766個視頻,共51類,每個視頻長度3-10秒。

由於HICO和HMDB51都不包含人體姿態關鍵點的數據,因此實驗中採用OpenPose來提取人體關鍵點。

值得注意的是,實驗中作者將224px的HMDB51的圖像縮放到了450px,這樣來確保最後的feature map不至於太小(14x14), 因為太小的feature map上attentional pooling的效果不是很顯著。

實現細節

1. 網路結構

實驗中,作者採用了Inception-V2和RestNet-101兩種網路結構,對這兩種網路分別進行了不加Attentional Pooling和加入Attentional pooling後的結果對比,發現在MPII數據集上,ResNet-101性能更好,而且加入了Attentional pooling後,性能有約4%的絕對提升。

作者分析,之所以ResNet-101比Inception-V2效果要好,是因為ResNet的結構中feature map的大小下降比較緩慢,因此後面的層能學到圖像不同位置的信息,從而Attentional pooling帶來的增益也越多;而Inception結構在前面層上將feature map變的很小,因此後面層的感受野看到的圖像範圍基本都一致了,因此Attentional pooling帶來的增益很小。

2. Attentional pooling 和 Pose 帶來的提升

如論文中Table 1 所示,在MPII數據集上,ResNet-101的baseline的mAP是26.2%,加了Attentional pooling後mAP為30.3%,增加了Pose約束後mAP變為30.6%。可以看到pose的作用還是有一些的,但主要還是Attentional pooling的提升大些。在HICO數據集上,加了pose性能出現了下降(35.0% vs 34.6%), 在HMDB51的RGB數據上,增加pose有提升。

3. 和 full-rank pooling的比較

所謂「full-rank pooling」, 就是指使用原來的二階pooling,不進行矩陣低秩近似。作者提到,二階pooling計算量太大,因此採用compact bilinear approach (CBP)來近似,並且採用別人的開源代碼實現,沒有怎麼調整參數,結果比普通的mean pooling效果要差, 自然就比低秩近似的結果也更差了。感覺這裡作者的對比方法不是太規範。

4. P秩近似

我們知道低秩近似可以有很多中情況,最極端的情況就是1秩近似,即將一個矩陣分解為2個向量相乘,此外還有2秩,3秩近似。一般來說,P秩近似就是把矩陣分解為兩個低秩矩陣,其中秩較大的矩陣的秩為P。論文中,對於秩為P的近似,作者採用P個bottom-up feature maps 和 C個 top-down feature maps 來相乘,這時候公式(6)就需要發生改變,Figure 1 中的Xb也變為P個,最後的結果通過對P個乘積進行求和得到。發現在秩為1,2,5的時候,在MPII數據集上的mAP分別為30.3, 29.2和30.0, 可見結果對不同的秩還是比較穩定的。

代碼實現分析

作者將代碼實現放到了GitHub上,但是只提供了MPII的數據和訓練好的模型,HICO和HMDB51的數據和姿態關鍵點並沒有提供,如果想好在這兩個數據集上做實驗需要自己提取關鍵點數據了。

代碼採用TensorFlow 1.0 和Slim一起來實現,中間用到了compact_bilinear_pooling代碼但是沒有在教程中進行說明,需要在src目錄下創建lib目錄,自己下載這裡的代碼並放到lib目錄下。

top-down attention 和 bottom-up attention 在Project_Root/models/slim/nets/nets_factory.py中300行左右實現,具體為如下兩行:

# bottm-up attentionend_points[PosePrelogitsBasedAttention] = attention_logits# top-down attentionend_points[TopDownAttention] = logits

通過查看代碼,發現作者也是用很簡單的卷積來實現attentional pooling, 通過在Slim中提供的ResNet-101網路的最後面加入幾個卷積層就能達到attentional pooling的效果。

另外我採用作者的代碼復現的時候,發現自己訓練的模型比他提供的訓練好模型在驗證集上的mAP測試結果要低約3個百分點,我只能達到27.6%, 而作者提供的模型能達到30.3%。原因暫時還沒有找到。

一些疑問

  1. 作者論文中提到,為了驗證方法的有效性,在視頻數據集上進行了測試。但實際在做的時候,也只是在HMDB51的RGB數據上進行了實驗,其實結果距離I3D等視頻動作識別方法在RGB上的結果還是有較大差距的(52.2% vs 74.5%), 有效性還有待驗證。
  2. 作者只在最後面使用了一次attentional pooling, 如果將網路中所有的pooling都換為attentional pooling,效果是否會更好?

推薦閱讀:

TAG:深度學習DeepLearning | 計算機視覺 | 卷積神經網路CNN |