1. 程式人生 > >Human Semantic Parsing for Person Re-identification

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中有可能會引入太多的干擾資訊比如背景,這樣去提取的區域性特徵是“不乾淨”的。所以本文提出使用分割支路去輔助提取人體的特徵。

本文的貢獻點主要為以下三點:

  1. 通過實驗可以證明使用一個簡單但高效的訓練過程結合一些普通的網路是能夠對Person ReID的效能帶來提升的。本文使用了ResNet152和Inception-V3去論證了這一觀點;
  2. 作者提出了SPReID,在這個方法中人體分割模型被引入輔助用於區域性特徵提取。同時作者的這個分割模型也在特定的分割任務中取得了目前最好的成績;
  3. 作者的方法取得了目前最優的效能,在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如同下圖所示:

SPReID-1.png

總共包含了一個卷積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資料集上進行預訓練,分割的種類為上文提到的五類。在本文中作者也提到了他的這種分割做法在目前該資料集上取得了最好的成績,實驗結果和效能對比如下圖所示:

SPReID-2.png

Person Re-identification Performance

這部分考察了三個實驗,首先第一個,在較小解析度上訓練,然後在大解析度上特定資料集fine-tune;第二個,選擇不同的網路結構作為方法的backbone;第三個,對於卷積backbone和行人部件分割的backbone是否使用權重共享的策略。

首先第一組實驗的結果如下:

SPReID-3.png

可以看到作者首先在10個數據集上使用三種不同size的解析度進行輸入訓練,然後在一個更大的解析度,上圖中為748x246,對特定資料集進行fine-tune,結果會提升很多。這個情況其實挺正常的,在測試的時候增加解析度不管是在分類還是檢測任務中都被證明是更有效的,但是解析度的提升帶來的是效能的額外增長。

之後作者討論了使用不同backbone的實驗,實驗結果如下:

SPReID-4.png

上述實驗結果也展示了,在大部分任務中,其實使用ResNet152作為backbone往往能得到比Inception-V3更好的結果,但在部分任務中這個結論也不一定成立。而且Inception-V3的結構和計算量都比ResNet152要下,跟差不多計算量和深度的ResNet50作對比的話,能看出Inception-V3效能是明顯好於它的。

接下來討論SPReID的作用,首先實驗結果如下:

SPReID-5.png

我們這裡為了方便只看Market-1501的實驗結果,第一行表示的是隻使用Inception-V3結構的baseline結果,2,3行表示在SPReID中是否使用前景的2048-D向量,直觀來說就是考察了2x2048和3x2048的檢索效能對比,第4行這個實驗就做得有些莫名其妙了,將2,3的模型做ensemble,具體做法是對於兩個模型的輸出特徵使用了l2-normalization和concatenation,總共得到5x2048的特徵向量用於檢索,顯然效能會更高一點。

之後作者討論了是否讓SPReID中的卷積backbone和人體部件分割支路共享權重,實驗結果如下所示:

SPReID-6.png

上圖中我們只看Market-1501實驗結果,從流程上來看1,3行和2,4行分別表示的是SPReID訓練的一個完整流程。即首先在10個數據集上訓練,然後再在特定資料集上進行fine-tune。可以看到,不使用權值共享的策略是能夠得到更好的結果的,這也能想明白,分割支路的權值更新,理論上應該使用Person ReID的分割groundtruth監督訓練才行,這裡如果都使用identity softmax loss來監督更新,是不合適的。

最終作者對比了自己的方法和目前最好的方法效能,這裡只列出了Market-1501上的結果,感興趣的朋友可以檢視原論文。效能對比如下表所示:

SPReID-7.png

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-\frac{iterx}{max-iter})^{0.9}

訓練的優化方法使用的是Nesterov Accelarated Gradient並且使用ImageNet進行模型的初始化。

Conclusion

文章表示這種SPReID的方法可以無縫銜接目前的大部分網路結構,並且通過實驗是能夠證明有效能提升的。方法簡單且高效。但筆者認為,在復現這篇論文的過程中,有一點被忽視的地方就是使用10個數據集進行訓練再fine-tune其實有些不太公平了,雖然最終討論的結果是在特定資料集上使用訓練集訓練的模型,但是一開始初始化過程中10個數據集是或多或少對模型的學習能力有幫助的。