這個專欄是曠視科技北京研究院Video Team對外分享與交流的欄目,主要由Team leader @張弛 、AlignedReID作者 @zhangxuan,PCB論文作者 @孫奕帆 、Pytorch教程書作者廖星宇 @Sherlock 以及 @羅浩.ZJU 等人維護。如果有興趣加入Video Team可以把簡歷發給[email protected],具體方向包括但不限於ReID、Tracking、Activity Recognition、GAN以及網路壓縮等等。第一期文章介紹我上個月做的一個工作,是一個非常強力的ReID Baseline,這個工作也被CVPR2019的TRMTMCT Workshop接收。

Bag of Tricks and A Strong Baseline for Deep Person Re-identification?

arxiv.org

1、前言

行人重識別最近兩三年發展十分迅速,每年都以10~15%的Rank1準確度在增長。當然快速發展的背後離不開Baseline的逐漸提高。早期的Baseline還比較低,大部分工作都在很低的Baseline上完成,因此準確度不高。而2017~2018這個時期,隨著Pytorch框架的崛起,很多學者基於Pytorch框架開始調ReID的Baseline,因此性能也就越來越強(很多博士和博士生都做出了巨大貢獻)。2018年暑期我和廖星宇師弟在曠視實習的時候,開源過一個GitHub項目,並且發布一篇知乎文章:

Sherlock:一個強力的ReID basemodel?

zhuanlan.zhihu.com
圖標

基於這個項目,我們最近這個項目進行擴展,完成一個更加強力的ReID Baseline。通過引入一些低消耗的訓練Tricks,使用ResNet50的Backbone,這個Baseline在Market1501可以達到94.5%的Rank1和85.9%的mAP。當然使用更深的Backbone還可以繼續提高性能。值得一提的是,和大量拼接多個local feature的方法取得高準確度的方法不同,我們只使用了一個global feature。目前代碼已經開源了,歡迎學術界和工業界使用這個Baseline進行論文和產品的研究,comments are welcome!

michuanhaohao/reid-strong-baseline?

github.com
圖標

2、背景

Baseline對於一個領域的研究起著非常重要的作用,但是我們觀察最近一年頂會發表的ReID工作,發現論文之間Baseline的差距特別大。以Market1501為例,極少數工作在90以上的Baseline上開展,而大部分集中在80~90之間,甚至部分工作在80以下的Baseline上開展。而DukeMTMC-ReID更是沒有一個Baseline超過了80的Rank1。我們都清楚,在低的Baseline上面方法漲點更加容易。另外不同的Baseline也很難統一比較不同方法的優劣性。基於這個因素考慮,我們覺得需要統一一個強力的Baseline。

近一年頂會上ReID工作Baseline性能的統計。左圖為Market1501數據集,右圖為DukeMTMC-reID數據集。

另外我們發現在一些文章之後,會使用一些trick來提升模型的性能,但是在論文撰寫過程中只是簡單的輕描淡寫一句甚至完全不寫,最後閱讀代碼的時候才發現這些trick。然而對於一些資深的審稿人而言,通常都沒有親自運行過實驗代碼,因此這些trick容易「騙過」審稿人,讓審稿人產生這個方法漲點很明顯的錯覺,然而可能大部分性能的提升是來源於trick而不是演算法本身。

此外,最近出現了一些融合多個local feature達到很高性能的工作。我們不可否認,多尺度、多特徵的融合本來也是CV領域很重要的一種思路。但是有了類似的工作之後,無意義地、暴力地融合大量的local feature的工作不應該再被會議期刊作為創新研究過度認可。這種工作一來無法給學界提供很有意義的insight,另一方面也並不是業界產品研發過程中喜歡的模型。融合大量的local feature,最後哪怕取得了很高的性能,也不過是「忽悠」外行人罷了。

綜上我們做這個工作的目的有以下幾個:

  • 經過統計發現,最近一年頂會上發表工作的Baseline性能差異性很大,並且大部分處在很低的水平。因此我們希望統一一個強力的Baseline。
  • 我們希望學術界的研究能夠在這個Baseline進行擴展,這樣能夠早日把Market1501、DukeMTMC-reID數據集給刷爆。只有這些數據集刷爆了,學界才能意識到ReID應該進入下一階段。
  • 我們希望給社區的審稿人一些參考,哪些trick對模型的性能會產生重大的影響,審稿時應該考慮這些trick。
  • 我們希望給業界提供一些訓練trick,在很低的代價下提高模型的性能,加快產品研發的過程。

慶幸的是,過去幾年我們在ReID研究過程中,收集了一些訓練的trick。通過把這些trick引入到現有的Baseline上面,我們得到了一個強力的Baseline,以ResNet50位Backbone,最終在Market1501取得了94.5%的Rank1。當然,為了判斷這些trick是在訓練域上瘋狂overfit,還是增加了模型的泛化能力,我們同時做了cross-domain實驗。

3、Standard Baseline

首先我們來回顧一下標準的Baseline。通常我們使用ResNet50來Backbone,一個mini-batch包含了P個人的各K張圖片,圖片經過Backbone之後得到global feature,然後這個特徵分別計算一個分類損失(ID loss)和一個triplet loss(batch hard mining)[1]。如果這個baseline調的好話,應該會接近90%的rank1水平。我們得到的結果是87.7%的rank1。

常用的標準Baseline

4、Our tricks

這一小節我們將會逐個介紹我們使用的trick,包括:Warmup學習率、隨機擦除增廣、Label Smoothing、Last Stride、BNNeck和Center loss。

(1) Warmup Learning

Warmup學習率並不是一個新穎的東西, 在很多task上面都被證明是有效的,在我們之前的工作[1]中也有過驗證。標準Baseline使用是的常見階梯下降型學習率,初始學習率為3.5e-4,總共訓,120個epoch,在第40和70個epoch進行學習率下降。用一個很大的學習率初始化網路可能使得網路震蕩到一個次優空間,因為網路初期的梯度是很大的。Warmup的策略就是初期用一個逐漸遞增的學習率去初始化網路,漸漸初始化到一個更優的搜索空間。本文使用最簡單的線性策略,即前10個epoch學習從0逐漸增加到初始學習率。

operatorname { lr } ( t ) = left{ egin{array} { l l } { 3.5 	imes 10 ^ { - 5 } 	imes frac { t } { 10 } } & { 	ext { if } t leq 10 } \ { 3.5 	imes 10 ^ { - 4 } } & { 	ext { if } 10 < t leq 40 } \ { 3.5 	imes 10 ^ { - 5 } } & { 	ext { if } 40 < t leq 70 } \ { 3.5 	imes 10 ^ { - 6 } } & { 	ext { if } 70 < t leq 120 } end{array} 
ight.

(2) Random Erasing Augmentation

Random Erasing Augmentation(REA)[2]是一種隨機擦除的數據增廣方法。簡單而言就是在圖像中隨機選擇一個區域,打上雜訊mask。這個mask可以是黑塊、灰塊也可以是隨機正太雜訊。直接看圖就能明白,具體細節可以看論文。所有參數都是直接利用原論文的參數。隨機擦除是一種數據增廣的方式,可以降低模型過擬合的程度,因此可以提升模型的性能。

隨機擦除示例

(3) Label Smoothing

標籤平滑(LS)是論文[3]提出的一種方法,應用於分類任務。傳統的分類任務用的是交叉熵損失,而監督label用的是one-hot向量。因為交叉熵是相對熵在one-hot向量前提下的一種特例。但是one-hot是一種很強的監督約束。為了緩和label對於網路的約束,LS對標籤做了一個平滑: q_{i}=left{egin{array}{ll}{1-frac{N-1}{N} varepsilon} & {	ext { if } i=y} \ {varepsilon / N} & {	ext { otherwise }}end{array}
ight.

舉個例子,加入原始的label是[0,0,1,0,0,0],平滑參數設置為0.1,則平滑之後的label就會變成[0.02,0.02,0.9,0.02,0.02,0.02],計算損失時由交叉熵換回原始的相對熵。經過標籤平滑之後,網路的過擬合程度也會被抑制一點。

(4) Last Stride

ResNet50 Backbone的每個block最後一層conv都會有一個下採樣的過程,即最後一層conv的stride=2。正常輸入一張256×128的圖像,網路會輸出一個8×4的feature map。通常而言,增大尺寸一般是能夠提升性能的。一個很簡單的操作就是把最後一個conv的stride改為1,我們把這個stride叫做last stride。這個操作不需要增加任何的參數量,也不改變模型的參數結構,但是會把feature map尺寸擴大為16×8。更大的feature map可以提取到更加細粒度的特徵,因此能夠提升模型的性能。

(5) BNNeck

這是這篇文章的核心點。我們常用的Baseline通常會同時使用ID損失和triplet損失一起優化同一個feature。但是在大量前置的研究發現,分類損失其實是在特徵空間學習幾個超平面,把不同類別的特徵分配到不同的子空間裡面。並且從人臉的SphereFace [4]到ReID的SphereReID [5]等工作都顯示,把特徵歸一化到超球面,然後再優化分類損失會更好。triplet loss適合在自由的歐式空間裏約束。我們經常觀察到,如果把feature歸一化到超球面上然後再用triplet loss優化網路的話,通常性能會比不約束的時候要差。我們推斷是因為,如果把特徵約束到超球面上,特徵分佈的自由區域會大大減小,triplet loss把正負樣本對推開的難度增加。而對於分類超平面,如果把特徵約束到超球面上,分類超平面還是比較清晰的。對於標準的Baseline,一個可能發生的現象是,ID loss和triplet loss不會同步收斂。通常會發現一個loss一直收斂下降,另外一個loss在某個階段會出現先增大再下降的現象。也就是說這兩個task在更新的過程中梯度方向可能不一致。但是由於最終都能夠收斂,所以可能容易引起大家的忽視,我相信應該不只是我們觀察到過這個現象。

基於以上現象考慮,我們希望找個一種方式,使得triplet loss能夠在自由的歐式空間裏約束feature,而ID loss可以在一個超球面附近約束feature,於是乎就出現了以下的BNNeck。BNNeck的原理也很簡單,網路global pooling得到的feature是在歐式空間裏的,我們直接連接triplet loss,我們把這個feature記作 f_t 。然後這個feature經過一個BN層得到 f_i ,經過BN層的歸一化之後, batch裡面f_i 的各個維度都被拉到差不多,最後近似地在超球面附近分佈。當然不是嚴格意義上的,只是近似地而已。當然也可以嘗試一下直接用L2 norm得到 f_i ,但應該效果會低於BNNeck。因為L2 norm是一個無參數的強約束,產生的梯度會直接全部傳給 f_t ,其實改變並不大。而BNNeck的話還有BN層的參數可以吸收梯度,相對來說對 f_t 的影響會弱一點。

當然還有一些小細節,就是分類的FC的bias我們是關掉了的,這樣可以保證分類的超平面一定經過原點。因為特徵也是關於原點對稱分佈的。BNNeck是我們從實驗現象的觀察得到的產物,如果有更加嚴謹的理論證明,會更加好。也許我們的推斷是錯的呢。

(6) Center Loss

Triplet loss有個缺點是隻考慮了相對距離,其loss大小與正樣本對的絕對距離無關。舉個例子,假如margin=0.3。正樣本對距離是1.0,負樣本對是1.1,最後loss是0.2。正樣本對距離是2.0,負樣本對是2.1,最後loss還是0.2。為了增加正樣本之間的聚類性能,我們加入了Center loss:

mathcal{L}_{C}=frac{1}{2} sum_{j=1}^{B}left|oldsymbol{f}_{t_{j}}-oldsymbol{c}_{y_{j}}
ight|_{2}^{2}

由於ReID現在的評價指標主要是cmc和mAP,這兩個都是檢索指標,所以center loss可能看上效果不是那麼明顯。但是center loss會明顯提高模型的聚類性能,這個聚類性能在某些任務場景下是有應用的。比如直接卡閾值區分正負樣本對tracking任務。

當然center loss有個小trick就是,更新網路參數和更新center參數的學習率是不一樣的,細節需要去看代碼,很難說清楚。

(7) Modified Baseline

Modified Baseline

通過引入前文的各種trick,我們的Modified Baseline就如上圖所示。輸入的圖像經過REA數據增廣,然後經過ResNet50網路,last stride改為1。然後經過BNNeck,由於center loss也是一種metric loss,所以和triplet loss一起放到BN前面。最後分類損失結合LS一起計算。整個網路使用warm up學習率去優化。

5、實驗結果

(1) Influences of Each Trick (Same domain)

我們在Market1501和DukeMTMC-ReID上面分別測試了每個trick的效果,這個結果是在同數據集上訓練測試的。具體數字就敘述了,每個trick都能漲點,其中REA、BNNeck漲點是比較明顯的。

監督學習實驗結果

(2) Analysis of BNNeck

我們同樣分析了一下BNNeck的結果,對於BN層前後的 f_tf_i 兩個feature在測試階段分別使用歐式距離和餘弦距離進行相似度度量。我們主要關注最後兩行的結果,對於靠近ID loss的 f_i,餘弦距離的度量效果顯著好於歐式距離。也說明分類損失約束的feature更加適合餘弦距離。當然四種配合方式都顯著高於不用BNNeck的結果。

BNNeck結果分析

(3) Influences of Each Trick (Cross domain)

為了觀察這些trick是在訓練域上overfit了,還是真正的增加了網路的泛化能力,我們還做了cross domain的實驗。即在一個數據集上訓,在另外一個數據集上測。結果顯示REA會大大的降低跨域的性能,其他的trick都還是有一定程度的漲點的。最後我們刪除REA,只使用其他五個trick,M→D的結果達到了41.4的rank1。目前M→D的SOTA方法也就50左右的水平,這已經是個不錯的Baseline了。當然也值得深思,為什麼REA數據增廣會降低跨域性能。

Cross domain試驗結果

(4) Comparison of State-of-the-Arts

我們把Baseline的結果直接和SOTA的方法進行比較,除了少數幾個能夠達到95+的結果以外,沒有任何方法的結果能夠超越我們。值得一提的是,我們僅僅使用一個簡單global feature,加了一層BN而已。目前主流能夠達到93+的方法都concatenate多個local feature。騰訊的金字塔結構更是融合21個不同尺度的local feature。在所有隻使用一個global feature的方法裏,我們的性能是大大領先的。而且我們的訓練代價非常小,就是加了一些trick而已。(所以也驗證了深度學習領域的那句名言:天下萬物,多為調參?)

State-of-the-arts

(5) Batch & Image Size

我們發現不同論文中的batch size和image size都不一樣,因此我們也測試了這兩個參數的影響。結果如下,簡單的概括一下就是:Batch size呈現一種大batch效果更好的趨勢,但是不是特別明顯;而Image size對於global feature性能沒有太大的影響。

我們推測是,batch越大,batch hard mining挑選的樣本也就越難,因此網路性能越好。而訓練圖像的尺寸是128×64,不管你用多大的image size,都不增加額外的信息。所以只要大於128×64,image size就對性能沒有太大的影響。

Batch size
Image size

(6) Backbone

在我們開源了代碼之後,有好心人幫我們擴展了Backbone,包括ResNet、SENet、SeResNet等等。大致結果呈現網路越深,效果越好,這也符合正常的結論。其中SeResNeXt101取得了95%的rank1和88%的mAP,基本已經相當高了。ResNet152在Market1501上有點反人類,可能是數據集太小,並且比較簡單,所以overfit了吧。

不同的Backbone結果

6、結語

這篇論文給出了一個強力的Baseline,我們不希望這個工作成為一種暴力刷點的工作,而是希望這個Baseline能夠促進ReID領域的發展。無論是學術界還是工業界,只要能夠使用這個Baseline做有用的研究或者產品,我們就覺得這個工作是有意義的。

這個工作離不開 @古有志 、 @Sherlock 、 @小賴sqLai 等一起付出。這個工作是我和師弟們在寒假跑了幾百組實驗總結出的結果,另外mxnet版本可以看小賴的文章小賴sqLai:如何基於gluon訓練一個強有力的Reid Baseline。

最後說一點個人的看法,ReID這兩年發展這麼快,但是比起人臉技術而言,落地的應用少了太多。其實並不是ReID的模型不夠好,不是數據集上準確度不夠高,而是比起人臉任務,ReID的場景更加複雜,有一些本質的問題沒有解決。最簡單最迫切的,遮擋問題和不可見光的問題。遮擋問題可以使得幾乎現有所有的ReID模型失效,而結構光的人臉識別準確度也還不錯。但是基於不可見光的ReID,那隻能說是慘不忍睹。業界的數據資源開源不出來,學界的拿不到數據就做不了研究,這也是目前學界和業界研究有點脫離的一個因素。我個人呼籲有志於入坑ReID研究的人,不妨多從實際落地的角度思考,到底哪些是阻礙ReID應用的問題。針對這些硬核問題,去做有挑戰的研究。Market1501差哪幾個百分點真的不是特別重要。

當然我們會抽空繼續維護我們的項目,也歡迎大家給我們提供trick、改進、意見或者是指正批評,同時歡迎Valse2019和CVPR2019現場交流,comments are welcome!


[1] Hermans, Alexander, Lucas Beyer, and Bastian Leibe. "In defense of the triplet loss for person re-identification."arXiv preprint arXiv:1703.07737(2017).

[2] Zhong, Zhun, Liang Zheng, Guoliang Kang, Shaozi Li, and Yi Yang. "Random erasing data augmentation."arXiv preprint arXiv:1708.04896(2017).

[3] C. Szegedy, V. Vanhoucke, S. Ioffe, J. Shlens, and Z. Wojna. Rethinking the inception architecture for computer vision. In Proceedings of the IEEE conference on computer vision and pattern recognition, pages 2818–2826, 2016.

[4] Liu, Weiyang, Yandong Wen, Zhiding Yu, Ming Li, Bhiksha Raj, and Le Song. "Sphereface: Deep hypersphere embedding for face recognition." InProceedings of the IEEE conference on computer vision and pattern recognition, pp. 212-220. 2017.

[5] Fan, Xing, Wei Jiang, Hao Luo, and Mengjuan Fei. "Spherereid: Deep hypersphere manifold embedding for person re-identification."Journal of Visual Communication and Image Representation (2019): 51-58.


推薦閱讀:
相關文章