TridentNet:處理目標檢測中尺度變化新思路

原文鏈接:https://zhuanlan.zhihu.com/p/54334986

今天破天荒地爲大家介紹一篇我們自己的工作(Scale-Aware Trident Networks for Object Detection),因爲我是真的對這個工作很滿意,哈哈。這篇文章主要要解決的問題便是目標檢測中最爲棘手的scale variation問題。我們使用了非常簡單幹淨的辦法在標準的COCO benchmark上,使用ResNet101單模型可以得到MAP 48.4的結果,遠遠超越了目前公開的單模型最優結果。(代碼已經開源在SimpleDet中:TuSimple/simpledet

在正式介紹我們的方法之前,我先簡單回顧一下現有的兩大類方法。第一大類,也是從非Deep時代,乃至CV初期就被就被廣泛使用的方法叫做image pyramid。在image pyramid中,我們直接對圖像進行不同尺度的縮放,然後將這些圖像直接輸入到detector中去進行檢測。雖然這樣的方法十分簡單,但其效果仍然是最佳,也後續啓發了SNIP這一系列的工作。單論性能而言,multi-scale training/testing仍然是一個不可缺少的組件。然而其缺點也是很明顯的,測試時間大幅度提高,對於實際使用並不友好。另外一大類方法,也是Deep方法所獨有的,也就是feature pyramid。最具代表性的工作便是經典的FPN了。這一類方法的思想是直接在feature層面上來近似image pyramid。非Deep時代在檢測中便有經典的channel feature這樣的方法,這個想法在CNN中其實更加直接,因爲本身CNN的feature便是分層次的。從開始的MS-CNN直接在不同downsample層上檢測大小不同的物體,再到後續TDM和FPN加入了新的top down分支補充底層的語義信息不足,都是延續類似的想法。然而實際上,這樣的近似雖然有效,但是仍然性能和image pyramid有較大差距。

幾種處理scale variation方法的比較

我們方法的motivation其實早在16年刷KITTI榜單的時候就有初步形成,但是一直因爲各種原因擱置,直到今年暑假有兩位很優秀的同學一起將這個初步的想法改進,做紮實,結果其實也很出乎我最開始的意料。我們考慮對於一個detector本身而言,backbone有哪些因素會影響性能。總結下來,無外乎三點:network depth(structure),downsample rate和receptive field。對於前兩者而言,其影響一般來說是比較明確的,即網絡越深(或叫表示能力更強)結果會越好,下采樣次數過多對於小物體有負面影響。但是沒有工作,單獨分離出receptive field,保持其他變量不變,來驗證它對detector性能的影響。所以,我們做了一個驗證性實驗,分別使用ResNet50和ResNet101作爲backbone,改變最後一個stage中每個3*3 conv的dilation rate。通過這樣的方法,我們便可以固定同樣的網絡結構,同樣的參數量以及同樣的downsample rate,只改變網絡的receptive field。我們很驚奇地發現,不同尺度物體的檢測性能和dilation rate正相關!也就是說,更大的receptive field對於大物體性能會更好,更小的receptive field對於小物體更加友好。於是下面的問題就變成了,我們有沒有辦法把不同receptive field的優點結合在一起呢?


所以我們最開始的一個想法便是直接加入幾支並行,但是dilation rate不同的分支,在文中我們把每一個這樣的結構叫做trident block。這樣一個簡單的想法已經可以帶來相當可觀的性能提升。我們進一步考慮我們希望這三支的區別應該僅僅在於receptive field,它們要檢測的物體類別,要對特徵做的變換應該都是一致的。所有自然而然地想到我們對於並行的這幾支可以share weight。 一方面是減少了參數量以及潛在的overfitting風險,另一方面充分利用了每個樣本,同樣一套參數在不同dilation rate下訓練了不同scale的樣本。最後一個設計則是借鑑SNIP,爲了避免receptive field和scale不匹配的情況,我們對於每一個branch只訓練一定範圍內樣本,避免極端scale的物體對於性能的影響。

總結一下,我們的TridentNet在原始的backbone上做了三點變化:第一點是構造了不同receptive field的parallel multi-branch,第二點是對於trident block中每一個branch的weight是share的。第三點是對於每個branch,訓練和測試都只負責一定尺度範圍內的樣本,也就是所謂的scale-aware。這三點在任何一個深度學習框架中都是非常容易實現的。

在測試階段,我們可以只保留一個branch來近似完整TridentNet的結果,後面我們做了充分的對比實驗來尋找了這樣single branch approximation的最佳setting,一般而言,這樣的近似只會降低0.5到1點map,但是和baseline比起來不會引入任何額外的計算和參數。

TridentNet網絡結構

我們在論文中做了非常詳盡的ablation analyses,包括有幾個branch性能最好;trident block應該加在網絡的哪個stage;trident block加多少個性能會飽和。這些就不展開在這裏介紹了,有興趣的讀者可以參照原文。這裏主要介紹兩個比較重要的ablation。

第一個當然是我們提出的這三點,分別對性能有怎樣的影響。我們分別使用了兩個很強的結構ResNet101和ResNet101-Deformable作爲我們的backbone。這裏特地使用了Deformable的原因是,我們想要證明我們的方法和Deformable Conv這種 去學習adaptive receptive field的方法仍然相兼容。具體結果見下。

可以看到,在接近map 40的baseline上,我們提出的每一部分都是有效的,在這兩個baseline上分別有2.7和1.9 map的提升。

另外一個值得一提的ablation是,對於我們上面提出的single branch approximation,我們如何選擇合適的scale-aware training參數使得近似的效果最好。其實我們發現很有趣的一點是,如果採用single branch近似的話,那麼所有樣本在所有branch都訓練結果最好。這一點其實也符合預期,因爲最後只保留一支的話那麼參數最好在所有樣本上所有scale上充分訓練。如果和上文40.6的baseline比較,可以發現我們single branch的結果比full TridentNet只有0.6 map的下降。這也意味着我們在不增加任何計算量和參數的情況,仍然獲得2.1 map的提升。這對於實際產品中使用的detector而言無疑是個福音。


我們還和經典的feature pyramid方法FPN做了比較。爲了保證比較公平,我們嚴格遵循Detectron中的實現方式,並使用兩層fc作爲detector的head。可以看到在這樣的setting下,FPN其實對於baseline而言小物體有一定提升,然而大物體性能下降,綜合下來並沒有比baseline有提高,但是我們的方法仍然可以持續地提升2.2個點map,就算使用single branch approximation,仍然也有1.2個點的提升。這充分證明了我們的方法的普適性。


最後我們將我們的方法和各paper中報告的最好結果相比較。但是其實很難保證絕對公平,因爲每篇paper使用的trick都不盡相同。所以我們在這裏報告了兩個結果,一個是ResNet101不加入任何trick直接使用TridentNet的結果,一個是和大家一樣加入了全部trick(包括sync BN,multi-scale training/testing,deformable conv,soft-nms)的結果。在這樣的兩個setting下,分別取得了在COCO test-dev集上42.7和48.4的結果。這應該分別是這樣兩個setting下目前最佳的結果。single branch approximation也分別取得了42.2和47.6的map,不過這可是比baseline不增加任何計算量和參數量的情況下得到的。


最後的最後,我們會在本月內開源整套訓練代碼,可以很方便復現TridentNet結果以及各種常見trick。這個框架下也包含了其他Detection和Instance Segmentation方面的經典工作,敬請期待!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章