Human Semantic Parsing for Person Re-identification
論文位址
GitHub代碼
Introduction
目前大部分的Person ReID方法都開始集中于提取更加具有表征能力的局部特征輔助全局特征用于行人檢索。這篇文章是CVPR2018中關于Person ReID的一篇,文章的主體思路就是part-base的方法,但是跟大部分part-base不一樣的地方在于本文使用了行人分割支路的輸出作為mask,然後對人體的各部件進行局部特征提取。這種方法很直覺的就能知道比使用橫條、豎條或者關鍵點連接配接然後外擴矩形的部件mask靠譜,但是個人覺得在CNN模型中,這些直覺、很符合邏輯的政策可能并不一定能想想象的那麼work。本文中作者使用了ResNet152和Inception-V3作為backbone并且說明了使用SPReID可以在任何一個backbone上帶來提升。最終文章在4個資料集上進行了測試并且在rank-1和mAP上取得了目前最好的結果(目前最好的應該是雲從的MGN)。
Person ReID是現在的熱門方向,有着太多的實際應用需求,同時也有很多的難點需要去攻克,跨鏡頭中存在不同場景和不同相機的成像偏差,就算在同一個攝像頭的取景中,人員出現角度、姿态的不同都會成為檢索的難點,而且在目前的監控場景中,往往截取到的行人圖像都是低分辨率的,這也是Person ReID的難點之一。其實從總的來看,Person ReID也是圖像檢索的一部分,是以提取一個表征能力強的特征作為每一個identity的“身份資訊”,是解決目前所有問題的根本方向。過去CNN會對整張圖像提取特征進行特定化任務訓練(分類,分割和檢測),但是在Person ReID中我們的關注點在于如何擷取行人的特征,不一樣的背景還有遮擋等因素都會使得最終提取出來的特征對于行人并沒有太強的代表性。是以目前很多方法都是在global feature和part feature中尋找一個權衡。很多方法還分為多個stages去訓練模型,對此,論文作者提出了兩個疑問:
- 這些複雜的訓練過程或者模型真的對提升Person ReID有用麼?
- 使用box去切分人體的部件提取局部特征是合适的方法麼?
對于第一個問題,作者使用Inception-V3結合兩種不同的輸入分辨率,然後都使用Softmax Loss作為評價名額去訓練模型。并且使用re-ranking作為檢索後處理手段,實驗顯示這樣做是能夠對Person ReID的性能帶來提升的。對于第二個問題,作者認為使用box去框取人體的部件進行局部特征提取是不太合理的,一個box中有可能會引入太多的幹擾資訊比如背景,這樣去提取的局部特征是“不幹淨”的。是以本文提出使用分割支路去輔助提取人體的特征。
本文的貢獻點主要為以下三點:
- 通過實驗可以證明使用一個簡單但高效的訓練過程結合一些普通的網絡是能夠對Person ReID的性能帶來提升的。本文使用了ResNet152和Inception-V3去論證了這一觀點;
- 作者提出了SPReID,在這個方法中人體分割模型被引入輔助用于局部特征提取。同時作者的這個分割模型也在特定的分割任務中取得了目前最好的成績;
- 作者的方法取得了目前最優的性能,在Market-1501資料集上取得了~17%的mAP提升和~6%的rank-1提升(跟自己最差的一個結果比較),在CUHK03上取得了~4%的rank-1提升,在DukeMTMC-reID上取得~24%的mAP提升和~10%的rank-1提升。
Related Work
讨論了目前大部分主流的Person ReID方法,感興趣的可以閱讀原文。
Methodology
不做特殊說明的話,本文使用SPReID的backbone都是Inception-V3。首先簡單的介紹了一下Inception-V3結構,然後對本文使用的方法進行詳細介紹。
Inception-V3 Architecture
假定讀者都具備一定的深度學習知識,對于Inception-V3結構這裡不做太多介紹。關于這一小節,論文作者的描述除了基本知識,還會告訴大家他将原結構的怎麼做了微笑的改動,比如使用GAP(global average pooling)在網絡的末端輸出2048-D的特征向量。
Human Semantic Parsing Model
作者說明了使用人體部件分割代替bbox的局部特征提取方法有更大的優越性。然後介紹了SPReID中的人體部件分割支路使用了Inception-V3作為backbone,然後為了使最終輸出的feature map具有更高的的分辨率,作者将Inception-V3最後一層卷積stage中的stride由2改為了1,也就意味着經過一次網絡前向以後這個降采樣的倍率由32降到了16,最終的輸出feature map分辨率提升了一倍;同時為了使得計算量不增加,對于輸出的feature map,論文移除了GAP并增加了ASPP(atrous spatial pyramid pooling)(rates=3,6,9,12),之後接入1x1的卷積層,最後對人體部件的類型進行分類輸出。
Person Re-identification Model
最終作者提出的SPReID如同下圖所示:
總共包含了一個卷積backbone和一個人體分割的branch,然後将兩者的結果結合在一起。對于上圖中的上部分分支,如果是走GAP分支的話,輸出的是2048-D的特征矢量。在SPReID中,分割支路的輸出feature map(其實就是個mask)可以看做是一個activation map,然後将這個activation map與上一條支路輸出的feature map尺寸比對之後做乘加運算。最後對于這些特征,使用多類别的Softmax來訓練。在上圖中,沒有将分類部分給畫出來,在之後的Person ReID檢索中提取最後的特征即可。
需要注意的是分割支路給出的activation map總共有五類,分别是前景,頭部,上半身,下半身和鞋子部分。對于每一個輸出的activation map,使用l1-normalized方法将其歸一化處理。這種乘加做法可以很直覺的了解成,每一個部件都會在相應的區域産生一個weights,将其與feature map進行乘加運算之後可以增強特定部件的特征表示,并且降低其他區域的特征表示。由于是乘加操作,最終輸出的就是一個2048-D的特征矢量,對于5個activation map,那麼最終将産生5個2048-D的矢量。對于該輸出特征,作者對除了前景部分的4個2048-D向量做一個element-wise的max操作,最終得到了一個2048-D矢量。最終這個輸出矢量,前景的矢量再加上上圖中GAP産生的2048-D矢量,總共3x2048的特征被用于分類(訓練)和特征檢索(測試)。
Experiments
這部分介紹了實驗的結果。
Datasets and Evaluation Measures
作者在3個公開資料集上進行了輸入大尺度測試,分别是Market-1501,CUHK03和DukeMTMC-reID。最後訓練的時候除了剛才提到的三個資料集,還使用了額外7個資料集的訓練集進行訓練。(這是本文最大的槽點)分别是 3DPeS, CUHK01,CUHK02,PRID,PSDB,Shinpuhkan和VIPeR。不光是訓練資料得到了極大的補充,ID類别數也有了極大的增長。
Training the Networks
在訓練過程中,作者首先設定了一個Baseline類似的實驗,為了證明在10個資料集上訓練一定程度之後在特定資料集上以更大的input size輸入fine-tune的性能提升。是以最開始,作者使用了沒有分割支路的結構,以492x164的尺寸作為輸入,在10個資料集上疊代20W次,之後根據這個訓練模型以748x246的input size在特定資料集(比如Market-1501)上進行fine-tune,疊代5W次。
在SPReID訓練過程中,除了網絡結構不一樣,其餘和上述步驟保持一緻,還有一個不同的地方就在于20W疊代的時候在SPReID中使用的是512x170的input size進行樣本輸入。
作者的分割支路使用了上文中所提到的結構在LIP資料集上進行預訓練,分割的種類為上文提到的五類。在本文中作者也提到了他的這種分割做法在目前該資料集上取得了最好的成績,實驗結果和性能對比如下圖所示:
Person Re-identification Performance
這部分考察了三個實驗,首先第一個,在較小分辨率上訓練,然後在大分辨率上特定資料集fine-tune;第二個,選擇不同的網絡結構作為方法的backbone;第三個,對于卷積backbone和行人部件分割的backbone是否使用權重共享的政策。
首先第一組實驗的結果如下:
可以看到作者首先在10個資料集上使用三種不同size的分辨率進行輸入訓練,然後在一個更大的分辨率,上圖中為748x246,對特定資料集進行fine-tune,結果會提升很多。這個情況其實挺正常的,在測試的時候增加分辨率不管是在分類還是檢測任務中都被證明是更有效的,但是分辨率的提升帶來的是性能的額外增長。
之後作者讨論了使用不同backbone的實驗,實驗結果如下:
上述實驗結果也展示了,在大部分任務中,其實使用ResNet152作為backbone往往能得到比Inception-V3更好的結果,但在部分任務中這個結論也不一定成立。而且Inception-V3的結構和計算量都比ResNet152要下,跟差不多計算量和深度的ResNet50作對比的話,能看出Inception-V3性能是明顯好于它的。
接下來讨論SPReID的作用,首先實驗結果如下:
我們這裡為了友善隻看Market-1501的實驗結果,第一行表示的是隻使用Inception-V3結構的baseline結果,2,3行表示在SPReID中是否使用前景的2048-D矢量,直覺來說就是考察了2x2048和3x2048的檢索性能對比,第4行這個實驗就做得有些莫名其妙了,将2,3的模型做ensemble,具體做法是對于兩個模型的輸出特征使用了l2-normalization和concatenation,總共得到5x2048的特征矢量用于檢索,顯然性能會更高一點。
之後作者讨論了是否讓SPReID中的卷積backbone和人體部件分割支路共享權重,實驗結果如下所示:
上圖中我們隻看Market-1501實驗結果,從流程上來看1,3行和2,4行分别表示的是SPReID訓練的一個完整流程。即首先在10個資料集上訓練,然後再在特定資料集上進行fine-tune。可以看到,不使用權值共享的政策是能夠得到更好的結果的,這也能想明白,分割支路的權值更新,理論上應該使用Person ReID的分割groundtruth監督訓練才行,這裡如果都使用identity softmax loss來監督更新,是不合适的。
最終作者對比了自己的方法和目前最好的方法性能,這裡隻列出了Market-1501上的結果,感興趣的朋友可以檢視原論文。性能對比如下表所示:
Implementation Details
論文實作細節,單卡的batch-size為15(其實在代碼中是16,這裡應該是寫錯了),momentum設定為0.9,weight_decay和gradient_clip分别是0.0005和2.0。訓練過程中初始學習率為0.01,在fine-tune中初始學習率為0.001。學習率的下降總共分為10個step,每個step下降結果為下面公式所示:
lr=(1−iterxmax−iter)0.9 l r = ( 1 − i t e r x m a x − i t e r ) 0.9
訓練的優化方法使用的是Nesterov Accelarated Gradient并且使用ImageNet進行模型的初始化。
Conclusion
文章表示這種SPReID的方法可以無縫銜接目前的大部分網絡結構,并且通過實驗是能夠證明有性能提升的。方法簡單且高效。但筆者認為,在複現這篇論文的過程中,有一點被忽視的地方就是使用10個資料集進行訓練再fine-tune其實有些不太公平了,雖然最終讨論的結果是在特定資料集上使用訓練集訓練的模型,但是一開始初始化過程中10個資料集是或多或少對模型的學習能力有幫助的。