實錄 | 曠視研究院解讀COCO2017物體檢測奪冠論文(PPT 視頻)
12月6日晚,量子位·吃瓜社聯合Face 論文解讀系列第一期開講,本期中曠視(Megvii)研究院解讀了近期發表的物體檢測論文:《MegDet:A Large Mini-Batch Object Detector》,基於此篇論文提出的MegDet模型,Face 摘下COCO 2017 Detection冠軍。
本期主講人為曠視研究院研究員彭超,同時也是MegDet論文第一作者、COCO 2017 Detection競賽主力隊員,在比賽中主要負責物體檢測模型的撰寫、訓練和調優工作,擁有豐富的深度學習模型調優經驗。
此次分享大家反應熱烈,全程乾貨滿滿,量子位應讀者要求,將主要內容整理如下:
△論文解讀完整回放視頻
今天我們主要講的內容主要集中在Detection和Instance Segmentation上,關於COCO Keypoint比賽相關論文,會在12月13日的晚上7點半由競賽隊的owner王志成,給大家進行一個充分的講解。
MegDet
在COCO Detection比賽中,我們優先解決的是Batchsize的問題;回顧ImageNet Classification的工作,他們的Batchsize在訓練過程中非常大,從起步開始就已經是128,最新的一些研究甚至達到了8000或者32K的水平,這使得人們可以在一個小時、乃至半個小時之內完成ImageNet的訓練。
但在COCO Detection任務中,我們發現人們使用的BatchSize非常小。最開始的只有2,相當於是兩張卡,一張卡一張圖;到後面的一些版本,BatchSize也僅有8,就是8張卡訓練,一張圖一張卡;最新一些研究的結果會達到16,這個結果跟Classification任務相比,連零頭都不到。
這個時候,我們就有了一個疑問:為什麼在物體檢測中Batchsize會這麼小呢?要回答這個問題,我們需要了解物體檢測和圖像識別的不同之處。對於圖像識別而言,演算法只需要判斷一張圖中的主要物體,而主要物體所佔像素比例通常較大,因此一張224x224的小圖即可滿足需求。 但是在物體檢測里,人們往往需要檢測一些精細的小物體,這些物體所佔像素比例非常小,常常不足1%。而現有的神經網路技術一般會逐步縮小特徵圖的尺寸,為了保證小物體在最後的特徵圖上佔有一定的比例,演算法需要一張較大的輸入圖片,通常的做法是800x800。
由於輸入圖片尺寸的增長,圖像檢測所需顯存量也會同比例增長,這也使得已有的深度學習框架無法訓練大Batch-Size的圖像檢測模型。而小Batch-Size的物體檢測演算法又常常會引入如下四個問題:
不穩定的梯度。由於Batch-Size較小,每次迭代生成的梯度的變化會非常大,這會導致SGD演算法在一個區域內來回震蕩,不易收斂到局部最優值。
BN層統計不準確。由於Batch-Size較小,難以滿足BN層的統計需求,人們常常在訓練過程中固定住BN層的參數,這意味著BN層還保持著ImageNet數據集中的設置,但其餘參數卻是COCO這個數據集的擬合結果。這種模型內部的參數不匹配會影響最後的檢測結果。
正負樣本比例失調。由於Batch-Size較小,一個minibatch之中的圖片變化可能非常大,很可能某些階段正樣本框只有個位數。當Batch-Size增大的時候,由於一個minibatch內部的圖片數量增加,正負樣本比例會優於小Batch-Size的情況。
超長的訓練時間。這個原因非常好理解:當Batch-Size較小時,我們必須迭代更多的次數來讓演算法收斂;隨著Batch-Size的增加,演算法每次迭代見過的圖片數量也隨之增長,相應的迭代次數就可以下降,人們也能更快地得到結果。
基於上述四點分析,我們應該對Batch-Size這一問題有了一個直觀的認識。我們在比賽中,為了解決這個問題,特意研發了一整套多機訓練系統,以實現我們大Batch-Size物體檢測演算法:MegDet。因為有良好的內部支持,我們的MegDet演算法可以幾乎無開銷完成算量,產生幾乎線性的加速比和更優的檢測結果。下面,我將介紹MegDet實現過程中的四個要點。
要實現MegDet,首先需要大量的底層支持,大致上可以分為三類:第一是一套GPU 計算雲平台,這在我們內部被稱為Brain 平台,專門負責統籌規劃硬體資源的使用;第二是基於Brain 平台的MegBrain軟體框架,提供了諸多深度學習必備的工具箱。第三是在前面兩者之上建立的物體檢測演算法,在此我們基於FPN框架設計了一套檢測演算法。
這裡,我們簡單科普一下FPN檢測框架。和傳統的Faster-RCNN框架不同,FPN在不同尺寸的特徵圖上提取RoI,以此達到分而治之的效果,即:大物體在小特徵圖上檢測,小物體在大特徵圖上檢測。這種設計既能充分利用現有卷積神經網路的錐形結構,又能有效解決COCO數據集中普遍存在的小物體問題,一舉兩得。
解決了BN統計不準確的問題。簡單來講,已有的BN統計方法局限於統計單張卡上的圖片,做不到多張卡聯合統計。由於物體檢測本身的特性,單張卡上的圖片數量達不到BN統計的要求,因此只能通過多卡聯合統計來訓練得到結果。為此,我們利用了NCCL(NVIDIA Collective Communications Library)代碼庫,實現了多卡BN。具體的演算法流程可以參照上圖,首先通過單卡自主統計BN的參數,再將參數發送到單張卡上進行合併,最後再把BN的結果同步到其他卡上,以進行下一步的訓練。
Sublinear Memory技術。這項技術的目的在於減少深度卷積神經網路的顯存消耗量,保證我們在比賽之中可以儘可能地使用大模型。我們可以通過上圖來簡單地體會這項技術的作用。在現有訓練方法中,為了計算Conv2中參數(W2, b2)的梯度,人們一般需要保存Conv2的輸出結果;但實際上,Conv2的輸出結果可以根據Conv1的結果來動態計算,這樣Conv2的輸出結果就不需要保存,顯存消耗也能進一步下降;特別是一些非常深的神經網路,例如152層的模型,Sublinear Memory能顯著降低顯存的使用量,幫助我們嘗試更多的技巧。
介紹一些在大Batch-Size下的學習率調參技巧。16-batch的FPN標準學習率是0.02, 而我們的MegDet的Batch-Size是256。在這種情況下,我們如果直接設定學習率為0.32=0.02 x 16,會導致模型早期迅速發散,無法完成訓練。因此,我們需要有一個「逐步預熱」的過程,讓模型逐漸適應較大的學習率。當訓練到一定階段的時候,我們設定了三個下降階段:在前兩個階段,我們直接將學習率除以10,最後再將學習率減半。這種學習率的設計主要是為了在比賽中取得極致性能,也是我們的經驗所得。
至此,我們可以比較一下不同年份,物體檢測的Batch-Size規模。最初,2015年,人們使用2-batch來訓練物體檢測演算法;過了一年之後,這個數字增長到了8倍,即16-batch;今年,在我們Megvii研究院的推動下,又增長到了256-batch,是原始Faster-RCNN的128倍,FPN的16倍。這個數字也恰好是ImageNet常見的Batch-Size。
在MegDet的幫助之下,我們取得了COCO Detection Challenge 2017的冠軍,同時也部分解決了之前提到的小Batch-Size訓練的問題。
?首先,根據我們的統計,在訓練過程之中,正負樣本比例比小Batch-Size更優,這也意味著梯度的計算能更好地擬合數據分布。下圖展示了兩張正樣本比例相差較大的結果,由於大Batch-Size能夠同時計算這兩種極端情況的梯度,使得模型參數更新更加平穩。
其次,我們通過多機BN的實現,實現了大Batch-Size下物體檢測演算法的性能提升。在已有的ImageNet Classification任務中,人們研究大Batch-Size的目的是為了防止掉點;然而在物體檢測任務之中,我們卻驚奇地發現,大Batch-Size可以直接帶來性能提升,這和已有的經驗並不相符。另一方面,通過上圖的逐Epoch精度曲線,我們還發現256-batch和16-batch在同等Epoch下的精度並不能重合,甚至還有較大的間隔,這也和ImageNet Classification已有的研究結果相違背。一個潛在的因素是物體檢測的多loss計算擾亂了中間結果的檢測精度,但詳細研究這個現象還需要跟多的實驗,這已經超出了本文的範疇。
第三點,也是我們做MegDet演算法的初衷,即加快訓練速度。如圖所示,基於ResNet-50網路,在16-batch的設置下, 訓練一個模型需要33個小時;當我們增加Batch-Size到64的時候,11個小時就足夠完成訓練;最後,在256-batch的設定下,僅需要4個小時就可以順利完成訓練。這使得我們在相同的計算力下,可以深度優先地搜索嗎模型參數,而非廣度優先地並行搜索模型參數,大大降低了試錯時間。
COCO的比賽過程總結一些物體檢測的比賽結果。
和論文中不同,我們使用了一個較好的基礎網路,讓我們一開始的Baseline就達到了43.0 mmAP。然後,我們利用了MegDet中提到的所有技巧,模型的結果為45.0 mmAP。緊接著,我們加入了Semantic Semgnetation的監督loss,以及下文將要提到的Context Module,檢測結果漲到了47.0 mmAP。此時,我們再加入了Multi-Scale訓練和測試的技巧,達到了50.5 mmAP。這個結果是我們最好的單模型結果。最後,我們ensemble了四個基於不同基礎網路訓練的模型,雖然其餘三個模型的結果都比50.5要差,但多個模型融合能夠有效補充不同模型之間的不足,最後我們的點數是52.8 mmAP。
這是我們使用47.0 mmAP的模型出的檢測結果圖。雖然比我們最終比賽提交的52.8的模型要弱,但在這種中等難度的場景下,已經能夠很有效地檢測出擁擠的物體和較遠處的小物體。這也意味著,在不考慮計算量的情況下,現有的演算法已經能夠很好地檢測出常見物體,達到了實用需求。
Instance Segmentation介紹一下Instance Segmentation上的經驗。
Instance Segmentation現有的實現流程大致如下:首先用一個Detection的模型,比如我們之前的MegDet,給出一個待選框;通過這個框在特徵圖上扣取一塊區域,並做一些Context處理;最後,通過一個精心設計的Mask來計算最後的loss。Instance Segmentation最重要的就是如圖所示的三個模塊,這也是我們本次比賽著力探索的部分。
第一個部分是Pooling,也就是扣取特徵圖的過程。最原始的RoIPooling比較暴力。如左圖所示,中間較小的紅色虛線框是MegDet給出的ROI,由於浮點數的影響,這個框並不能完全對齊到綠色的特徵圖格點上。現有的計算邏輯是把紅色的虛線框拉伸到外圍紅色虛線框,然後計算框中部分特徵格點。最近,Mask-RCNN的提出將這個「硬」過程軟化成了插值流程,即計算格點附近四個點的平均結果。而我們提出的Precise RoI Pooling講這個過程做了進一步細化,即利用一個積分的過程代替插值過程,使得我們可以更好地扣取ROI對應的特徵圖。
第二部分,是Context抽取部分,我們在COCO比賽中也使用了這個技巧來改善Detection的結果。如圖所示,在第x層,我們扣去了一個14x14的ROI,同時我們在更小的特徵圖x 1上也扣取了相同尺寸的ROI,並通過兩者的和作為一個初始ROI。在更大的特徵圖x-1上,我們扣取了更大的28x28區域,作為額外的Context,輔助分割。值得一提的是,我們在每個特徵圖上都增加了右上角所示的large kernel模塊,這個模塊已被證明在Semantic Segmentation中擁有非常好的效果,在Instance Segmentation中它也同樣有效。
第三部分,也是最後一部分,我們精心設計了Mask的生成。在第二部扣取整合了Context之後,實際的ROI對應的GroundTruth已經發生了一定的坐標偏移,如圖中紅色小三角所示。在這種偏移下,我們不能直接用綠色格點對應的GroundTruth來計算loss(即藍色格點)。此時,我們的做法是把ROI Feature重新插值到藍色格點處,以此來精確計算Instance Segmentation的Loss。
通過實踐上述三種技巧,外加一些在COCO Detection中使用的技巧,我們取得了COCO Instance Segmentation第二,PLACES Instance Segmnetation第一的成績。
圖中的柱狀圖展示了我們在相同基礎下,增加不同模塊導致的模型精度增加。可以發現,諸如Large Batch、MultiScale、Context和Ensemble的技巧是通用的,而另外兩種方法則是Instance Segmnetation獨享的。值得一提的是,我們在COCO Instance Segmentation中和第一名相差只有0.3,由於時間和資源的限制,我們只做了ensemble兩個模型。如果可以ensemble四個模型,那麼我們很有希望取得更優的結果。
這張圖片展示了我們比賽中的單模型結果。可以發現,針對分割中較為困難的細長桿狀物體,我們已經能夠做得比較好,基本滿足了實用需求。但同Detection任務相比,Instance Segmentation還有較多的發展空間。
最後,我們總結一下這次比賽帶來的經驗。
第一,我們實現了世界上第一個大Batch detctor:MegDet。在一些列任務中,我們發現MegDet是有效的訓練技巧。第二,在做Segmentation任務重,像素點的對齊操作是一個巨大的難點,無論是扣取ROI Feature還是計算loss。最後,訓練速度非常重要,這也是我們公開MegDet方法的原因。一旦實現了MegDet,物體檢測及其相關領域的發展會變得非常迅速,更好的演算法可以被提出和驗證。
一則招人硬廣:希望加入曠視科技一起登上CV巔峰的同學可以投簡歷至yugang@megvii.com,長期招聘演算法實習生。實習優秀者,更有跳過面試階段,入職Megvii研究院的機會。
Q&A
處理誤檢有什麼好辦法嗎?
如果是處理兩類的物檢問題,你實際上可以在後端再接一個比較小的分類器,來把誤檢的框給去掉。但就我們的經驗來說,如果是做一個多類物體檢測演算法,特別是像COCO比賽這類的物體檢測器,你很難有一個較好的小分類器。最好的方法還是提升模型的性質,比如說我們會在Rol pooling出來之後,我們會加比較多的一些計算量上去,以及加一些訓練的技巧,動態地讓模型自身去把誤檢的問題給弄掉。
Batch size大,GPU也多,時間肯定減少,這怎麼能證明是演算法帶來的收益呢?
實際上我們沒有說這個是演算法帶來的收益,我們說的是Batch size大,帶來的不光是實驗的減少,而且還是性能的一個提升。這個是演算法本身帶來的一個收益,相當於也是這個演算法,可能它本身就需要再一個比較大的Batch size下,才能工作的比較好。
針對小物體有什麼好的解決方法?
實踐上針對小物體好的解決方法不多,小問題的解決方法不多的原因在於:1) 小物體的圖已經比較糊了,人們自己也很難分清。第二個是小物體經常會出現一種像素偏移的情況,特別是在做Pooling的時候。大物體偏離兩個像素,基本沒有影響,但小物體偏移兩個像素可能已經飛出了框外。現有的解決邏輯是用比較淺層的特徵圖去定向檢測小物體,例如FPN。另外一種方法是強行增大圖片尺寸,使小物體的像素點儘可能的多。在比賽中,我們兩種方法都有用,並且都驗證漲點。
人臉識別中,什麼策略是有意義的研究路線?
就我個人來說,我認為只要能在限制性條件下漲點的策略都是有意義的研究路線,但如何來實現限制性條件下能漲點,就得具體看你們就做這個模型的一個需求。因為如果是打比賽的話,那當然是什麼漲點什麼有用;但在做手機端模型的時候,某些消耗巨大的方法可能就並不適用。具體如何研究,如何取捨,還需要和業務場景相結合。
SGD外其他方法試過嗎?
我們試過一些其他方法,但是我們發現好像都和SGD差不多。在多機訓練場景下,SGD會更加方便實現。
相關學習資源推薦閱讀:
※記敘文、議論文詳細講解
※這篇萬字長文,把論文寫作和投稿的事講透了!
※怎樣寫好科技論文暨科技論文的簡介及寫作格式
※CVPR 2018 論文解讀集錦(持續更新)
※教你如何寫好論文文獻綜述