Light Head R-CNN論文筆記

Dlyldxwl發表於2017-12-04

先上鍊接:
論文:Light-Head R-CNN: In Defense of Two-Stage Object Detector
連結:https://arxiv.org/abs/1711.07264
程式碼: TF連結

introduction

本篇文章介紹的演算法是是曠視和清華大學在COCO 2017比賽拿到冠軍的演算法。目前常用的object detection框架有兩種:一種是基於single-stage的SSD和YOLO,特點是速度快,但是精度有待提升;另一種是基於two-stage的Faster R-CNN、R-FCN和Mask R-CNN等,特點是精度高,但是速度慢。在文中,作者分析了two-stage演算法主要有兩部分組成:第一步是生成proposal(或說ROI)的過程(作者稱之為body),第二步是基於proposal(ROI)的recognition過程(作者稱之為head)。為了實現best accurcy,head一般都設計的很“重”,且head部分有一些層(例如:fc層)計算量大並耗時,故導致檢測速度很慢。本文提出的light head RCNN則是主要通過對head部分的修改減少了較多計算量,故稱之為light head。
網路結構包括兩部分:ROI warping和 R-CNN subnet。

先上一張圖直觀感受一下本文演算法對比其他object detection演算法的效果。

這裡寫圖片描述

Approach

下圖介紹的是Faster R-CNN、R-FCN和light head RCNN在結構上的對比。可以看出two-stage網路大都可以分為兩部分:ROI warping和 R-CNN subnet。圖中虛線框起來的部分是各網路的R-CNN subnet部分。這類演算法的基本流程是這樣的:通過base feature extractor(即特徵提取網路)中某一層輸出的feature map作為ROI warping的輸入從而生成ROI,接著將ROI和feature map共同作為R-CNN subnet的輸入完成 image classification和 object regression。

這裡寫圖片描述

以下將Faster R-CNN網路簡稱為F,R-FCN網路簡稱為R。因為圖中使用的特徵提取網路均為Resnet-101,以下貼出Resnet的網路結構圖。Resnet-101的conv5_x的輸出是2048維。

這裡寫圖片描述

F網路中,通過Resnet-101獲得2048維特徵圖,接著是一個ROI pooling層,該層的輸入包括2048維特徵圖和RPN中生成的ROI,輸出是size統一的特徵圖(關於ROI pooling有不清楚的小夥伴,可以移步看一下SPP Net 和ROI pooling的原始碼解析。),再通過global average pool後接入兩個全連線層,最後通過兩個分支進行classification和location。在精度上,F為了減少全連線層的計算量,使用了global average pool, 這會導致在一定程度上丟失位置資訊;在速度上,F的每一個ROI都要通過R-CNN subnet做計算,這必將引起計算量過大,導致檢測速度慢。

R網路在實際使用中,conv5_x的2048維輸出要接一個1024維1*1的filter用於降低“厚度”,接著用p*p*(c+1)維1*1的filter去卷積生成position-sensitive score map,也就是圖中的彩色部分(從圖中看p=9,但是在coco資料集上應用時p=7,所以p*p*(c+1)=3969,這也是本文的一個小漏洞吧),同時將conv4_x的feature map作為RPN的輸入,生成ROI,將ROI 和position-sensitive score map共同作為輸入,通過PSROI pooling層,得到c+1維p*p的特徵圖。最後經過一個global average pool層得到c+1維1*1的特徵圖,這C+1維就是對應該ROI的類別概率資訊。相較於F網路,R解決了每個ROI都要通過R-CNN subnet導致重複計算的問題。在精度上,R也使用了global average pool;在速度上,R的head雖然不用計算每一個ROI,但是其需要一個維度非常大的score map,這在一定程度上也會降低檢測速度。

關於Faster R-CNN網路和R-FCN網路有不瞭解的同學,可以移步這裡這裡

light head RCNN主體和R-FCN差不多。針對R-FCN的score map維度過大的問題,作者用10代替了class,也就是說score map維度變成了10*p*p=490(作者稱之為thinner feature map),因此降低了PSROI pooling和fc層的計算量;此外作者使用了large separable convolution代替1*1convolution,示意圖如下圖所示,可以看出作者借鑑了Inception V3 的思想,將k*k的卷積轉化為1*k和k*1,同時採用圖中左右兩邊的方法,最後通過padding融合feature map,得到size不變的特徵圖。將490維特徵圖和ROI作為PSROI 的輸入則得到10維p*p的特徵圖,如果將490維特徵圖和ROI 作為ROI pooling的輸入,則得到490維特徵圖,所以圖中寫了10 or 490。因為class更改為了10,所以沒辦法直接進行分類,所以接了個fc層做channel變換,再進行分類和迴歸。

這裡寫圖片描述

在本文中,整個網路的架構如下:
特徵提取網路使用了L(Resnet-101)和S(Xception)兩種型別的網路RPN網路的輸入是conv 4_x,定義了3個aspect ratios{1:2,1:1,2:1}和5個scales{32^2,64^2,128^2,256^2,512^2}(不同與F中3個aspect ratios和3個scales),此外還使用了NMS來降低overlapping,最後得到ROI。conv5_x輸出的feature map通過large separable convolution來得到thinner feature map。k設為15,對於L網路cmid=256,對於S網路cmid=64,Cout=10*p*p=490,整個計算的複雜度可以通過Cmid和Cout來控制。將ROI和thinner feature map共同作為PSROI 或ROI pooling的輸入,得到10 or 490channels的feature map。R-CNN subnet部分使用了一個channel為2048的fc層來改變前一層的feature map的通道數,最後通過兩個fc實現分類和迴歸。

Experiments

作者的實驗主要是基於COCO資料集進行的,object class為80,訓練集有80K,驗證集有35K,測試集有5K。作者用訓練加驗證共115K的資料訓練,然後用5K的測試集做驗證。

baselines

先做了一組R-FCN的實驗用於對比,標準的R-FCN記為B1;對R-FCN做一些“增強”:1. image短邊resize為800,長邊resize為1200,並在RPN部分設定5個scales{32^2,64^2,128^2,256^2,512^2} 2.在RCNN部分迴歸的loss總是小於分類的,所以將回歸的loss翻倍 3. 根據loss排序選取loss最大的256個samples用於反向傳播。做了“增強”的R-FCN記為B2,實驗結果如下表所示,B2高於B1約3個百分點。

這裡寫圖片描述

Thinner feature maps for RoI warping

該部分主要用來驗證thinner feature map和large separable convolution的作用。
先看thinner feature map。相較於原來的R-FCN,作者使用瞭如圖4的網路,與R-FCN不同的是,該網路的thinner feature map channels為10*p*p=490,R-FCN中score map channels為81*p*p=3969。接著接入同樣的PSROI層,因為圖4中channel的改變,所以使用了fc層來改變channels以便後續的分類和迴歸。注意該網路沒有使用large separable convolution層,因為要做到“控制變數”,所以兩網路只有“score map”的channel的不同。

這裡寫圖片描述

實驗結果如下表所示:從表中可以看出,channel數大大降低後精度並沒有減小多少,有關速度的提升表中沒有說明,但是可想而知。此外,作者在文中強調了light head rcnn的 reduce channel操作讓該網路可以和FPN接面合,如果使用原來的R-FCN,要和FPN接面合(就是對不同scale的層做position-sensitive pooling)其計算量過大會導致記憶體使用量過大的。

這裡寫圖片描述

再用large separable convolution代替1*1convolution,實驗結果如下表所示,精度略有提升,速度仍然沒有寫出,但是明顯會有較大的提升。

這裡寫圖片描述

light head R-CNN

將RoI warping和R-CNN subnet結合到一起,也就是light head R-CNN, 對比其和B2、Faster R-CNN(這裡的F是作者改進過的網路),如下表所示,最後一行表示light head R-CNN,可以看出map有了一定的提升(這些都是在L網路上實驗的)。

這裡寫圖片描述

在此解釋一下,該表格最後兩行的區別。有同學會說Thin feature map+large kernal就是整個light head rcnn呀!其實不然,+large kernal是在Table3中出現的,也就是說是以figure4 為基礎做出來的,而figure 4 中的 RCNN subnet部分直接將10*7*7的feature map接個81channel的fc作為分類結果(對於cls任務來說)。但是Light head rcnn的RCNN subnet部分卻是先使用了一個2048channel的fc,再接81channel的fc用於分類(對於分類層來說),從結果中可以看到提升較為明顯。

此外作者還做了一組improvements的實驗,分別加了pool with alignment、ms train和0.5閾值的NMS,結果如下表所示。

這裡寫圖片描述

再將light head rcnn與當前主流的檢測演算法在coco資料集上進行比較,backbone基本都是Resnet-101,結果如下表所示。

這裡寫圖片描述

為了突出light head rcnn的速度優勢,作者使用了類似與Xception的一個小網路作為backbone,具體結構如表7所示,這裡有些細節博主暫時沒弄清楚。

這裡寫圖片描述

接著將小網路的light head rcnn與其他網路進行速度上的對比,如表8所示。

這裡寫圖片描述

可以看出,light head rcnn要速度有速度,要精度有精度,坐等原始碼公開了。

相關文章