《論文研讀系列》Light-Head R-CNN
一種兼備效率和準確率新的兩步檢測器
- 論文 | Light-Head R-CNN: In Defense of Two-Stage Object Detector
- 鏈接 | In Defense of Two-Stage Object Detector
- 作者 | Zeming Li1(第一作者)
設計思想:
Could the two-stage detector beat the single-stage detector on both efficiency and accuracy?
目前object detection演算法主要分為one stage的SSD、YOLO;two stage的Faster RCNN、R-FCN、Mask RCNN等。前者速度快,但是精度低;後者速度慢,但是精度高。作者分析了兩步檢測器導致速度變慢的原因:在pre-prediction中,當大量的proposal統一時是一件費時的事情,而且在 ROI Pooling 後的 feature channels太多(這樣的話在第一次的全連接層需要的內存很大,而且影響了computation 速度)。一步檢測器精度不高的原因(以yolo 和yolo v2 為例):它們將這個視為一個回歸問題,直接預測bounding box和相關類別的可能性,yolo在bounding box 上定位不精,即使yolo v2 使用了新的網路結構(darknet19)效果也不是特別好。因此作者在object detection的研究上 how to make a better trade-off between the speed and accuracy ?
提出模型:
作者將two stage的object detection演算法的網路結構分成兩部分,一部分是region proposal(或者叫ROI)的生成過程(文章中命名為body部分),另一部分是基於ROI預測框的過程(文章中命名為head部分)。對於像Faster RCNN、R-FCN這樣的two stage的object detection演算法,第二部分有一些操作耗時且存儲量較大,因此稱為heavy head。而本文的light head RCNN則是通過對第二部分的修改減少了許多複雜操作,所以稱之為light head。
直觀看下作者提出的網路效果圖:
Figure2介紹的是Faster RCNN、R-FCN和本文的Light-Head RCNN在結構上的對比。在Figure2中的三個網路,大體上都可以分成兩大部分:RCNN subnet和ROI warping,其實嚴格講還有一部分是分類網路提取特徵,而這三個部分之間的關係大概是這樣的:ROI warping以分類網路提取到的特徵為基礎來生成ROI,而RCNN subnet則是以分類網路提取到的特徵和ROI warping生成的ROI為輸入來做分類和回歸的。因此Figure2中三個網路結構中的虛線框部分的輸入除了箭頭所示的用分類網路提取的feature map外,還包括RPN網路生成的ROI。
Faster RCNN中,先用分類網路(原論文中是用VGG)提取特徵得到2048維的feature map。然後是一個ROI Pooling層,該層的輸入包括前面提取到的2048維的feature map,還包括RPN網路輸出的ROI,根據這兩個輸入得到ROI尺寸統一的feature map輸出,比如都是3*3大小或7*7大小的feature map。然後經過兩個全連接層(參數數量較多),最後有兩個分支分別做分類和回歸。Faster RCNN因為要將每個ROI都單獨傳遞給後面的RCNN subnet做計算,因此存在較多重複計算,所以比較耗時;另外兩個channel都是幾千的全連接層的存儲空間佔用也是比較大的.
R-FCN主要解決了Faster RCNN中ROI Pooling層後重複計算的問題。在R-FCN中,先用分類網路(ResNet)提取特徵得到2048維的feature map(原文中該層後面會跟一個channel數量為1024的1*1卷積用於降維)。然後用channel數為P^2*(C+1)的1*1卷積來生成position-sensitive的score map,也就是Figure2 B中彩色的那些feature map,這是分類的支路(回歸的支路是用channel數為P^2*(8)的1*1卷積來生成,在Figure2中未畫出)。然後經過一個PSROI Pooling層生成C+1維的feature map,feature map的大小是P*P,該層的輸入包含前面一層生成的score map,還包括RPN網路生成的ROI。最後經過一個global average pool層得到C+1維的1*1feature map,也就是一個vote過程,這C+1維就是對應該ROI的類別概率信息。R-FCN因為要生成額外的一個channel數量較多(channel數量為classes*p*p,如果在COCO數據集上是81*7*7=3969)的score map作為PSRoI Pooling的輸入,所以在存儲和時間上都有不少消耗。
Light-Head RCNN 如Figure2 C所示,基本上是在R-FCN基礎上做的修改。針對R-FCN中score map的channel數量較大,作者採用一個large separable convolution生成thinner feature map(large separable convolution可以參看下面的Figure3),其實就是將原來P^2(C+1)的channel數量用10*(C+1)來代替,差不多是從3969降低到490,這樣就降低了後續Pooling和其他操作的計算開銷。Figure2 C中,這490維的feature map如果作為PSROI Pooling的輸入之一(另一個輸入是ROI),就可以得到channel數為10的輸出;如果這490維的feature map是作為ROI Pooling的輸入之一(另一個輸入是ROI),那麼就可以得到channel數為490的輸出。最後加上全連接層是因為前面large separable convolution操作對channel做了改動,所以後面沒法直接做分類,需要用一個全連接層做通道數量的轉換,才能接classification和location兩個分支。
從Figure2中的前兩個網路可以看出,二者在ROI Pooling後都採用了global average pooling,這種操作顯然對object的定位不是很有利,因為pooling操作會丟失位置信息,所以在light head RCNN中就去掉了這樣的層。
Figure3是large separable convolution的示意圖,文中是通過這個生成Figure2中channel數為490的feature map,也就是文中說的thin feature map。
從Figure3可以看出,這種結構是借鑒了Inception 3 中將卷積核大小為k*k的卷積操作用1*k和k*1的兩層卷積來代替的思想,計算結果是一致的,但是卻可以減少計算量(差不多可以減少為原來的k/2,在文中作者k取15,也就是用了一個尺寸較大的卷積核) 其實在inception vn 的各種的不同網路結構中能夠體現出不同作者在使用上的一些想法和目的。扯遠點,如果想要獲得不同的感受野,這個inception的設計又該如何設計呢? 關於inception 的深入理解,小白覺得這塊大家可以做做研究,或許下一個突破性的框架就是你做的呢。當然如果大家不吝賜教,小白先謝謝了!
實驗結果:
具體的效果大家可以參照原論文中的experiment part,其中給出了各方面的對比,也體現了問題的研究是一個嚴謹的過程,同時也是一種多樣式思維方式的訓練。
總結:
主要是對ROI Pooling層的輸出feature map做通道上的縮減,提高了速度;同時去掉了原來R-FCN或Faster RCNN中最後的global average pooling層,一定程度上提升了準確率。
訓練技巧:
- 平衡採樣。很多數據集存在樣本不均衡的問題,有些類別特別多,有些類別特別少。訓練模型時,從一個圖像列表中依次讀取樣本訓練。這樣的話,小類樣本參與訓練的機會就比大類少。訓練出來的模型會偏向於大類,即大類性能好,小類性能差。平衡採樣策略就是把樣本按類別分組,每個類別生成一個樣本列表。訓練過程中先隨機選擇1個或幾個類別,然後從各個類別所對應的樣本列表中隨機選擇樣本。這樣可以保證每個類別參與訓練的機會比較均衡。在不同的數據集上,使用平衡採樣性能可以提升零點幾個點。這個也是在大家打比賽中需要注意的一點。
- 難例挖掘(OHEM)。使用了難例挖掘後,收斂更快,訓練更穩定。
- 多尺度訓練。使用多尺度訓練的話,可以讓參與訓練的目標大小分布更加均衡,使模型對目標大小具有一定的魯棒性。
- ......
推薦閱讀:
※You Only Look Once: Unified, Real-Time Object Detection(YOLO)
※RCNN- 將CNN引入目標檢測的開山之作
※Mask_RCNN:基於Keras and TensorFlow 的 Mask R-CNN 為 目標檢測和情景分割
※為什麼SSD(Single Shot MultiBox Detector)對小目標的檢測效果不好?
※目標檢測筆記二:Object Detection API 小白實踐指南