行人重識別 PCB-RPP,SGGNN
SIGAI特約作者
Fisher Yu
CV在讀博士
研究方向:情感計算
什麼是行人重識別(ReID)
如下圖,給定一個行人圖或行人視訊作為查詢query,在大規模底庫中找出與其最相近的同一ID的行人圖或行人視訊。
為什麼需要ReID呢?
因為在安防場景下,跟蹤一個目標,只靠人臉識別是不夠的,在臉部資訊丟失時(罪犯有時把臉特意矇住一大部分,或者離太遠了拍不清臉),行人資訊就能輔助跟蹤識別。
ReID與人臉識別有什麼聯絡和區別?
都是多媒體內容檢索,從方法論來說是通用的;但是ReID相比行人更有挑戰,跨攝像頭場景下複雜姿態,嚴重遮擋,多變的光照條件等等。
做ReID的話,一般從兩方面入手:
A、特徵工程,設計網路來學習不同場景下都general的visual feature,用probe-gallery的特徵相關性來作為ranking的依據,一般直接Softmax分類。
B、度量學習,設計損失函式,用多張影象的label來約束它們特徵之間的關係,使學到的特徵儘量類內間隔短,類間間隔大。
PCB-RPP[1],2017
早期比較經典的文章,方法簡潔明瞭。
main contribution:
1. 提出了均勻分塊的 Part-based Convolutional Baseline(PCB),探討了較優的塊間組合方式
2. 提出了基於 parts 的 Refined part pooling(RPP),用注意力機制來對齊 parts
如上圖所示,PCB框架的流程是:
1、對輸入384*128行人圖提取深度特徵(ResNet50),把最後一個block( averagepooling前)的下采樣層丟棄掉,得到空間大小 24*8的 tensor T
2、按照水平方向分成均勻分成6parts,即6個空間大小 4*8 tensor,然後各自進行 average pooling,得到6個column vectors g
3、使用1*1卷積對g降維通道數,然後接6個FC層(權值不共享),Softmax進行分類
4、訓練時等於有 6個cross-entropy loss;測試時則將 6個 vectors h 合併在一起,再算相似度
這裡有幾種組合方式和超參可以探討:
A、Deep feature的空間維度大小?該分成多少parts?
B、把6個column vector h 先 average pooling 成 1個 vector,再 FC 分類?
C、6個FC層之間的權值是否共享?
作者在文中做了實驗來對比結果,找到最優的組合方案~~
至於為什麼分part的效果會更好,也是基於行人結構分割的先驗知識驅使(類似用Pose key point來做一樣)。比如part1,能更有針對性地根據頭部資訊來分類~~
講完了PCB,我們來看RPP~
RPP本質上就是個attention module,目標是把6 parts 對應的空間分佈進行軟權值分配,進而對齊parts(PCB中均勻分割6parts 的過程,其實可看成人為地 hard attention,只把當前part空間權值設為1,其他parts都為0)
如上圖所示,RPP思路:
1、把深度特徵tensor T 中每個column vectors f 都分為6類(假設共有6個parts),文中是通過線性函式加Softmax來實現(其實就類似用1*1卷積來作segmentation一樣)
2、把每個part對應的attention map 權值疊加回 tensor T 裡(即上圖的 GAP過程),得到各 part 的spatial 空間壓縮後的 feature vector g ~ 後續步驟都和PCB一樣~
PCB-RPP訓練流程:
文中為了保證學到的是part based attention map來對齊parts,故特意在預訓練完PCB後,在Step3處先fix住PCB裡所有層的引數,單獨訓練 part classifier。如下圖所示,如果不加Step 3的限制,出來的6個attention map 將很隨機,效能也會下降。
從實驗結果看,加了RPP對MAP提升還是很大的:
總結:
文中PCB的思想雖然簡單,但是後續CVPR2018中各種part-based ReID文章(各種 Multi-scale, multi-level part fusion 啥的)提供了參考價值。特別是雲從科技的這篇MGN[2],更是將各種粒度的parts 和 triplet loss+ Softmax loss玩得淋漓盡致~
SGGNN [3],ECCV2018
說完了ReID的單張影象part based特徵工程,我們來談談多張影象輸入的 metric learning方法,傳統的contrastive loss, triplet loss 和 quadruplet Loss就不介紹了,下面說說基於圖模型的 SGGNN。
Similarity-Guided Graph Neural Network (SGGNN) 主要貢獻是:
1、網路的輸入是probe和多個gallery,通過 GNN 來fuse不同probe-gallery pairs的差異性特徵;而不像傳統方法probe與每個gallery間都是單獨計算 similarity
2、Similarity-Guided。圖神經網路中節點與節點間的 edge weights 不是直接通過節點間的非線性函式(無監督) 得到,而是利用gallery的標籤,有監督地計算 gallery-gallery similarity得到。
如上圖所示,假定輸入是一個probe和四個gallery,首先每對probe-gallery 都經過Siamese-CNN 來計算關係特徵di,作為GNN中的節點node;而node間的edge weights可通過 gallery-gallery pair過相同的Siamese-CNN來得到;接著根據圖網路中d1,d2,d3,d4及權值關係,來更新節點的關係特徵,作為similarity score(即Sigmoid後的二分類)。
那問題來了,如何設計網路來提取di?
又如何設計GNN來更新節點值呢?
如上圖所示,提取di很簡單,就是把影象對送進引數共享的ResNet50,出來的 deep feature進行 element-wise相減,接著element-wise square然後 BN,得到di;若要繼續算影象對similarity的話,後接個FC層然後Sigmoid即可。
上圖所示,目標就是更新di特徵。雖然不太懂為啥專門用2個FC層搞了個message network 來對映di到ti,文中說這樣可以增強節點間流動的資訊,但估計增加不少運量和額外引數。Anyway我們已經得到了各個節點增強後的message+各個edge weights+原始的di特徵,按照下面的公式更新di特徵即可:
for i=1,2,...N
至此,整個網路就可以端到端地去訓練了,通過probe-gallery label 的 cross-entropy loss引導di更新,又通過gallery-gallery label 的 cross-entropy loss引導 edge weights 更新(後者不確定是否一定需要,文中也沒細講)。
關於利用gallery-gallery相似分值來引導改善probe-gallery關係特徵,文中舉了一個類似metric learning的例子很有趣:給定 probe p 和 gallery gi 和 gj,假定 (p, gi) 是 hard positive pair node,而 (p, gj) 和 (gi, gj) 都是相對 easy positive pairs node。如果節點間沒有資訊流動,(p, gi)的相似分值不可能很高。但如果使用 (gi, gj) 相似度來引導更新(p, gi)的關係特徵,那麼(p, gi)的相似分值可能會高。
從實驗結果看,使用Similarity-guided確實對效能提升很大:
總結與展望:
SGGNN使用gallery-gallery引導多個probe-gallery進行特徵融合,確實能讓網路學到更discriminant特徵。哈哈,估計有人會想把PCB中Part based feature和SGGNN融合起來用了,或者把parts當成節點來用了~~
Reference:
[1] Yifan Sun, Beyond Part Models: Person Retrieval with Refined Part Pooling
[2]Guanshuo Wang, Learning Discriminative Features with Multiple Granularity
for Person Re-Identification
[3]Yantao Shen, Person Re-identification with Deep Similarity-Guided Graph Neural Network,ECCV2018