[讀論文]Light-Head R-CNN: In Defense of Two-Stage Object Detector

[讀論文]Light-Head R-CNN: In Defense of Two-Stage Object Detector

來自專欄目標檢測學習筆記4 人贊了文章

這篇文章是曠視 detection組的作品

lizheming大神已經放出源碼了 code

這個方法能夠提升精度與速度。圖中可以看到,相同的inference時間下,此方法的AP遠高於現在的很多流行的演算法。

在檢測領域,大家或許都有這樣一個「共識」:two-stage方法精度高於one-stage方法,但是速度卻不如one-stage方法。那麼速度慢的原因在哪呢?

舉例說明:

  1. Faster R-CNN慢的主要原因是它有一個兩層全連接做ROI的識別
  2. R-FCN慢的主要原因是它有一個很大的score maps

共同的特點就是它們的「頭」比較大,那計算上的消耗就比較大了。

大神們提出了一個「光頭」R-CNN解決這個問題。

主要的方法是:

  1. 薄的特徵層(thin feature maps)
  2. 小的R-CNN 子網路(pooling and single fully-connected)

基於ResNet-101的 light-head R-CNN在保持一定速度的情況下,在coco的檢測任務上得到了state-of-art.

同時還試了小網路(Xception)結果是30.7 mmAP at 102 FPS on COCO.

原來的R-FCN有一個大的score map 其形狀是#classes × p × p,當class多的時候,就非常大了。而這篇文章用了薄的score map 形狀是 α × p × p ,α ≤ 10

這個設計能夠很大地減少RoI-wise subnetwork的計算。


Approach of Light-Head R-CNN

主要包括兩部分 R-CNN subnetROI warping

R-CNN subnet

Faster R-CNN用的是 兩層全連接 或者是 Resnet stage 5作為second stage classifier,對於提升檢測性能是有益的。而這麼做計算量比較大,特別是proposal多的時候。

為了加速RoI-wise subnet, R-FCN首先為每個region預測一個score maps,通道數是#classes × p × p(p是接下來的pooling形狀),接著是沿著每個ROI做pool,然後average vote最後的預測。R-FCN把更多計算放在RoI 共享的score maps 生成,獲得不錯的結果。

  1. 在精度的角度上說,Faster R-CNN在ROI分類上面不錯,但是為了減少第一個全連接計算量,作者用了global average pooling,這對於spatial localization不是件好事;R-FCN直接在position-sensitive pooling之後對prediction做了pool,效果上不如有roi wise 的Faster R-CNN.
  2. 在速度的角度上說,Faster R-CNN對於每個ROI都用了一個費時的RCNN網路,當proposal多的時候速度就下降了;RFCN的RCNN網路是cost-free的,但是要為ROI pooling生成一個大的score map, 還是挺耗時的。

Thin feature maps for RoI warping

在送進RCNN子網路之前,RoI warping是用來固定feature map形狀的。作者用了薄的feature maps,接上conventional RoI warping. 實驗中發現thin feature maps不僅提高提升精度並且節省了訓練和使用時候的內存和計算量。相比較thin feature maps上接PSRoI pooling,這個方法用了更多的計算量加強R-CNN子網路並且減少了通道數。如果在thin feature maps上RoI pooling,作者可以減少R-CNN overhead並且拋棄Global Average Pooling來同時提升性能。

Light-Head R-CNN for Object Detection

Basic feature extractor

作者用了用了大backbone[ResNet 101]來驗證性能,記為「L」;

用了小的backbone[Xception] 來驗證effectiveness 和efficiency,記為"S".

conv4 conv5最後一層卷積塊 ,記為C4, C5

Thin feature maps

作者在C5上用了大的可分離卷積,k =15 

對於S,Cmid = 64;對於L,Cmid = 256;

把Cout減少到10 × p × p,與RFCN的#classes × p × p相比小了很多。

得益於大kernel得到的更大的valid receptive field,被pool的feature maps更強大。

R-CNN subnet

作者只用了一層2048的全連接(沒有dropout),接著是兩個全連接用來做RoI classification 和regression. 對於每個bounding box只用4 channels,因為在不同類之間共享了regression. 得益於RoI warping的強大feature maps, Light Head R-CNN在一定速度上有很好的精度。

RPN

Region Proposal Network是在C4的feature上面做sliding-window. RPN預定義了一系列的anchors,有一定的scales 和aspect ratios. 作者用了三種aspect ratios s {1:2, 1:1, 2:1},

和五種scale {322, 642, 1282, 2562, 5122}來cover不同的scales.

因為有很多很大overlapping的proposals,NMS被用來在把它們送進RoI prediction subnetwork之前減少proposals. 作者用IoU=0.7的閾值來NMS.

如果anchor 與gt的IoU大於0.7,設為positive label.

有最高IoU的anchor也是positive label.

同時IoU 小於0.3,會被給negative label.


Experiments

所有的實驗都在resnet的stage 5用了a`trous和online hard example mining.

backbone都用pre-trained ImageNet,pooling size是7.

在base model中stage 1 ,2被固定,batch normalization也被固定。

Horizontal image augmentation也被做了。

Ablation

Baselines

首先跑R-FCN記為B1, achieves 32.1% mmAP在COCO mini-validation.

大神們也調了一個更強的baseline,記為B2.

通過以下方法:

  1. We resize the shorter edge of image to 800 pixels, and restrict the max size of the longer edge to 1200. We set 5 anchors {322, 642, 1282, 2562, 5122} for RPN because of the larger image.
  2. We find that regression loss is definitely smaller that classification loss in R-CNN. Thus we double the R-CNN regression loss to balance multi-task training.
  3. We select 256 samples ranked based on the loss for backpropagation. We use 2000 RoIs per image for training and 1000 RoIs for testing.

通過這些trick生生調高了3個點!


Thin feature maps for RoI warping

為了看看減少 用來做ROI warping的feature map通道數的作用,作者設計了一個簡單的網路

pipeline是一個R-FCN來做對比,以下為與原來RFCN的差異:

  1. 作者把feature map通道減到490(10 × 7 × 7)用來做PSRoI pooling[原版3969 (81 × 7 × 7)]
  2. 因為減少了通道,不能直接投票出最後的預測,所以後面用了一個簡單的全連接

結果如下:

雖然通道數減少很多,3969 vs 490,但是性能上差不多。Light-head R-CNN的設計可以很好地加入feature pyramid network,對於原版的RFCN來說幾乎不可能,因為如果要在高解析度的feature map上(Resnet stage 2)做position-sensitive pooling,memory消耗很大。

為了驗證Faster R-CNN上減少通道數,作者將 PSRoI pooling 換成 RoI pooling,能夠輕微的提高0.3. 一個假設是:在second stage,RoI pooling 涉及更多的features (49x) ,accuracy gain是從更多的計算上得到的。


Large separable convolution

給RoI warping的feature map通道很小,在最初的實現裡面,1 × 1 convolution用來做reshape到小的channel, 這會減弱feature map 的能力。作者用了large separable convolution來增強feature map 的能力,同時保持小的通道。如下圖,超參數:k = 15, Cmid = 256, Cout = 490.

相比較與基於復現的 R-FCN , B2,用large kernel產生的thin feature map,可以提升0.7個點。如下圖


R-CNN subnet

RCNN網路部分是一層全連接,2048通道。因為feature map很薄(10通道),Light RCNN對於每個區域的分類回歸來說都很快,作者也復現了更厲害的Faster R-CNN 和R-FCN(B2)

作者的方法獲得37.7 mmAP,Faster R-CNN 和R-FCN是35.5/35.1 mmAP. 因為thin feature

maps和light R-CNN,在很多proposal的情況下也能保證效率。


Light-Head R-CNN: High Accuracy

為了結合現在state-of-art檢測器,作者在PSRoI pooling中加入RoIAlign的技術,看下圖

增加了1.3個點。作者也用了scale jitter方法,在訓練的時候從{600, 700, 800, 900, 1000}中隨機採樣scale,然後resize圖像短的一端到被採樣的scale. 圖像最大的端被限制在1400 像素,因為小的一端可能會到1000像素。訓練時間也因為數據增強而增加。Multi-scale訓練提升了接近1個mmAP,最後用0.5替換最初的0.3做NMS的閾值,這樣提升0.6mmAP,通過提升了crowd情況的recall.

上圖總結了現在各種state-of-the-art的檢測器,論文提出的方法獲得了40.8的mAP。Light Head R-CNN是大backbone的很好的選擇,並且它沒有很大的計算消耗。


Light-Head R-CNN: High Speed

像Resnet 101這樣的Larger backbone會降低計算速度,為了驗證速度,用了bottleneck xception[34.1 top 1 error 224 × 224 ImageNet],以下為文章用的xception的結構

作者將convolution layer in bottle-neck換成channel-wise convolution,因為是淺層網路,沒有用pre-activation. 為了做快速inference,作者做了以下事情:

  1. Resnet-101換成tiny xception
  2. 丟棄a`trous,因為它相對小backbone來說有大的計算
  3. RPN變成256通道[Faster R-CNN 和R-FCN的一半]
  4. large separable convolution,kernel size = 15, Cmid = 64, Cout = 490 (10 × 7 × 7)
  5. 用alignment 技術做了 RoI warping,它能減少被pool的 feature map通道[ k × k倍,k是pooling size],RoI-align能提升結果。

跟現在的YOLO, SSD, DeNet比,作者absorb Batch-normalization用來做快速inference.

結果如下圖:

結果是30.7 mmAP 102 FPS,比YOLO 和SSD要好很多。


Conclusion

總之,Light Head R-CNN是一個two-stage目標檢測方法。比之傳統的heavy head的two-stage方法,light head能提升檢測結果,而不用折中計算速度。比之single-stage[YOLO 和SSD],Light Head R-CNN在更好的結果情況下有更快的速度。


推薦閱讀:

TAG:目標檢測 | 深度學習DeepLearning | 人工智慧 |