本文由極市部落格原創,作者Panzer。
程式碼地址:github.com/zhaoweicai/…
背景介紹
通用目標檢測是計算機視覺領域最廣為關注的問題之一。儘管近年來自於CNN的目標檢測演算法較傳統方法在準確率上取得的突飛猛進的進展,然而較目標分類問題而言依然還有很長一段路要走。早期的目標檢測方法主要是由VJ框架所引領,其核心思想是在影像上列舉大量的滑動視窗,提取滑動視窗裡的影像特徵,通過級聯分類器對滑窗進行打分,對得分較高的滑窗予以保留作為最終的檢測結果。隨著RBG大神將RCNN帶入目標檢測領域,目標檢測被構建為分類+迴歸的問題進行解決,這股浪潮主要由兩類演算法引領:以Faster R-CNN為代表的兩階段方法和以SSD為代表的單階段方法,其中Faster R-CNN準確率更高,而SSD則速度佔優。
本文作者是目標檢測領域的一位大牛,早在ECCV 2016就推出了目標檢測的一篇力作MSCNN [1],其主要解決的是目標檢測領域的多尺度問題。而本文主要針對的是目標檢測在訓練過程中的IoU閾值的選取問題,作者將對這一問題的深入思考並汲取了傳統方法中的級聯思想,為我們呈現了一場理論和實驗都十分精彩的盛宴。
主要內容
基本問題
眾所周知,隨著RBG大神將RCNN帶入目標檢測領域,目標檢測被構建為分類+迴歸的問題進行解決,所以檢測問題本質是一個分類問題,但又和分類問題有很大區別,因為在檢測問題中是對影像中的所有候選框進行打分,在訓練過程中通過IoU閾值來判定正負樣本,因此IoU閾值的選取是一組需要精心挑選的超引數。一方面,IoU閾值選取的越高,則得到的正樣本更接近目標,因此訓練出的檢測器定位更加精準,但是一味提高IoU閾值會引發兩個問題:一是正樣本過少導致訓練的過擬合問題,二是訓練和測試使用不一樣的閾值導致評估效能的下降;另一方面,IoU閾值選取的越低,得到的正樣本更為豐富,有利於檢測器的訓練,但勢必會導致測試時出現大量的虛檢,也即論文中提到的“close but not correct”。以上分析可以通過作者做的下面這組實驗進行佐證:
圖1(c)給出了經過一次迴歸以後目標候選框與真實目標框匹配的IoU的變化,橫軸代表迴歸前,縱軸代表迴歸後,不同顏色的曲線反映的是不同IoU閾值訓練的檢測器。總體而言,經過迴歸器以後,目標候選框的IoU均有所提升,但區別在於:IoU在0.55~0.6之間時,基於0.5的IoU閾值訓練的迴歸器輸出最佳(藍色線);IoU在0.6~0.75之間,基於0.6的IoU閾值訓練的迴歸器輸出最佳(綠色線);IoU在0.75以上,基於0.7的閾值訓練出的迴歸器輸出最佳(紅色線)。以上結果表明:要得到定位精度較高的檢測器(也即IoU越大越好),就必須選用較大的IoU閾值,然而圖1(d)的結果表明,基於0.7的閾值訓練出的檢測器(紅色線)的AP反而是最差的,只有在選用IoU閾值為0.85以上進行評測時,其結果才略好於藍色線,但依然劣於綠色線,充分驗證了我們之前的分析:基於0.7的IoU閾值訓練出的檢測器中正樣本過少,因此正樣本的diversity不夠,容易導致訓練的過擬合,因此在驗證集上表現不佳。進而作者思考,能否有一種方式既可以用較高的IoU閾值訓練檢測器,又能夠保證正樣本的diversity足夠豐富?基於以上分析,下面我們詳細論述上作者所提出的Cascade R-CNN,其核心思想就是‘分而治之’。
模型結構
圖3給出了本文方法和其他相關工作的直觀對比。(d)展示的就是本文Cascade R-CNN的基本框架;(a)就是經典的Faster R-CNN框架,也是本文的baseline;(b)結構上和Cascade R-CNN非常相似,區別在於只在測試時採用級聯結構對Box多次迴歸,因此ROI檢測網路部分“H1”結構是相同的,也即訓練時還是採用的單一的IoU閾值;(c)則是在ROI檢測網路部分並聯多個檢測器,這些檢測器是不相關的,有點類似‘multi-expert’的思想。
儘管圖3(b)的Iterative BBox採用了級聯結構來對Box進行多次迴歸,但採用單一IoU閾值訓練唯一的檢測器會帶來以下問題:目標候選框經過0.5閾值的detector後樣本的分佈已經發生了變化,如下圖所示,可以發現經過多個stage的檢測器,正樣本的分佈更加集中於中心點,表明正樣本和真實目標的匹配度越來越高,這時候再使用同一個IoU閾值訓練檢測器顯然是次優的,因為如果不提高IoU閾值來去掉這些紅色的outlier,就會引入大量噪聲干擾,因此有必要提高IoU閾值來保證樣本的質量。
另一方面,單純提高IoU閾值會帶來一個疑問:這樣是否就減少了正樣本的數量?誠然,如果還是用的初始目標候選框,這個答案是肯定的,但本文是從經過迴歸器後的目標候選框中進行resample,這個疑問就不存在了,有下圖為證:經過多個stage之後,正樣本的IoU在不斷提升,我們可以任性提高IoU閾值,依然能夠獲取足夠多的正樣本。
至此我們完成了Cascade R-CNN核心部分的闡釋,訓練採用的還是通用的分類+迴歸loss,這裡不再贅述。
實驗分析
實驗細節
(1)驗證實驗是在MS-COCO 2017上做的,所有detector都是基於caffe框架開發,保證對比的公平性。
(2)作者選用的級聯結構共有4個stages, IoU閾值分別設定為遞進的0.5/0.6/0.7,大於該閾值的選為正樣本,其餘均為負樣本。
實驗結果
首先我們看下本文的Cascade對於不同檢測器的提升,作者選用了三種two-stage的檢測器:Faster R-CNN、R-FCN和FPN,從下表中可以發現:在不加任何trick的情況下,對於不同的檢測器和不同的基準網路,Cascade均能穩定提升3-4個點左右,且IoU閾值越高提升越明顯,這張表所展現的效果是相當具有說服力了。
此外,論文給出了大量的剝離實驗來驗證Cascade的有效性(見下圖)。
從中我們可以得出以下結論:表1充分展示了Cascade較Iterative BBox和Intergral loss的優越性,尤其是在AP90。評估指標上,說明提高IoU閾值訓練級聯檢測器的必要性;表2展示了聯合多個分類器的分類得分的必要性,在AP指標上,stage2比stage1展現了3個點的效能提升,而stage3並沒有比stage2展現優勢,而聯合多個分類器的分類得分可以將AP提升到38.9;表3展示了提高IoU閾值以及利用不同迴歸統計資訊的必要性,第二行與第四行的對比表明前者比後者更為重要,再次證明提高IoU閾值訓練級聯檢測器的必要性;表4展示了採用幾個stage會使效能達到飽和,可以發現stage4已經無法帶來效能提升,stage3可以達到AP的最高點38.9,而stage2帶來的效能提升最為明顯,因此對於實際應用而言,兩個stage已經足夠。
總結展望
本文貢獻
(1)深入研究了目標檢測中的IoU閾值選取問題,並通過大量的實驗分析驗證了IoU閾值選取對檢測器效能的影響;
(2)基於對以上問題的分析,提出了級聯版的Faster R-CNN,也即Cascade R-CNN目標檢測演算法,在不使用任何trick的情況下,在MS COCO通用目標檢測資料集上展現了非常出色的效能。
個人見解
(1)本文探討了目標檢測中長期以來無人問津但非常重要的問題——IoU閾值選取問題,是極具啟發性的一篇工作,作者結合傳統方法中的cascade思想和當前主流的Faster R-CNN檢測框架,將two-stage方法在現有資料集上將檢測效能又提升到了一個新高度。拋開文中大量的實驗分析不談,當我們重新審視當前目標檢測演算法兩大主流框架(Faster R-CNN和SSD)時,一個值得思考的問題是為什麼Faster R-CNN的準確率要比SSD高?筆者認為這其中的一個關鍵是:Faster R-CNN完成了對目標候選框的兩次預測,其中RPN一次,後面的檢測器一次。而本文作者則更進一步,將後面檢測器部分堆疊了幾個級聯模組,並採用不同的IoU閾值訓練,進一步提升了Faster R-CNN的準確率。進而我們思考這種提升的上限什麼時候會出現?表4表明cascade R-CNN在stage3時效能就已經達到飽和,這和我們的預期還是有一定差距的,如何進一步提升cascade的上限,是值得進一步探索的問題。
(2)本文實驗揭示了Cascade R-CNN成功的兩個關鍵:一是級聯而非並聯檢測器,二是提升IoU閾值訓練級聯檢測器。然而實驗驗證是在Faster R-CNN檢測框架下做的,考慮到現實應用場景中我們更關注的是檢測器的時效性,能否將這一cascade思想遷移到SSD的檢測框架中,進而提升SSD的準確率,這也是非常值得探索的一個問題。
(3)本文更為值得關注的一點貢獻是:通過提升IoU閾值訓練級聯檢測器,可以使得檢測器的定位精度更高,在更為嚴格的IoU閾值評估下,Cascade R-CNN帶來的效能提升更為明顯,不得不說Cascade R-CNN向高精度的目標檢測器邁出了堅實的一步,而這恰恰也是我們在實際應用中更希望看到的。
參考文獻
[1] A unified multi-scale deep convolutional neural network for fast object detection. ECCV (2016)
本文為極市平臺原創文章,更多技術分享和專案需求合作請關注極市平臺微訊號(extrememart).