Stacked Fisher Vector是Xiaojiang Peng在“Action Recognition with Stacked Fisher Vectors”一文中提出的用於動作識別的算法。SFV與FV結合的方法達到了當時state-of-the-art的結果。
上一篇介紹了Fisher Vectors的基本原理。FV的碼書訓練與編碼過程爲:
1.選擇GMM中K的大小
1.用訓練圖片集中所有的特徵(或其子集)來求解GMM(可以用EM方法),得到各個參數;
2.取待編碼的一張圖像,求得其特徵集合;
3.用GMM的先驗參數以及這張圖像的特徵集合求得其fishervector;
4.在對訓練集中所有圖片進行2,3兩步的處理後可以獲得fishervector的訓練集,然後可以用SVM或者其他分類器進行訓練。
以iDT描述子爲例,在iDT特徵的生成過程中,是在整段視頻中提取描述子的集合,再用FV進行編碼獲得Fisher Vector。這樣的編碼對圖像局部的特徵有很好的表示能力,但難以描述更全局,更復雜的結構。因此作者提出了一種“deep”的結構,將兩個FV編碼層堆疊在一起,就得到了Stacked Fisher Vector。其結構如下圖所示:
第一層FV:
給定一個大小爲W*H*L的視頻V,首先先做時間-空間域上的子空間採樣,如下圖所示,此處各個方向上可以取幾個固定的長度,比如width可以取W/2,W;height可以去H/2,H;time上取(L/3,2L/3,L)等。通過掃描可以獲得大量的subvolumes。由於本文中用到的iDT特徵是一種軌跡特徵,因此在獲取子空間後會做一個篩選,去掉軌跡數目少於一個給定閾值的子空間。
對於每個子空間,計算其iDT特徵,定義其長度爲d。在進行FV編碼之前,特徵要先用PCA+Whitening做解相關,以滿足GMM的獨立同分布假設。然後用預學習的GMM模型(size of K1)對其進行fv編碼,得到一個fv,長度爲2*K1*d(原版的fv長度應該是(2*D+1)*K-1,此處應該是算法做了簡化),記作ai,此處每個fv編碼最後的歸一化步驟使用的是Power+L2歸一化。將M個子空間中得到的ai做集合,則得到一個fv的集合 A={a1,a2….aM},稱作local FVs。在得到A後,還要對A整體做L2歸一化。最後A的大小爲2*K1*D*M,可以看出其維度很高。
第二層FV:
第一層得到的Local FVs維度過高,因此需要先做降維,本文中使用max-margin降維算法進行降維,將A中ai的維度從2*K1*d降低到p,p與第一層FV輸入特徵長度相近。
降維後與第一層FV相似,需要用PCA+Whitenting做解相關。之後就可以做第二層FV(size of K2)。第二層同樣用power+L2正則化。文中提到第二層的結果要在entire videos再做aggregate,此處不是很明白,因爲第一層應該已經用了entire videos的信息了。所以我的理解是第一層的視頻是整段視頻中的一段,第二層則將每段的結果做FV後聚合成一個完整的用來描述視頻的特徵。