1. 程式人生 > >Light-Head R-CNN

Light-Head R-CNN

文章目錄

論文資訊

原文地址:Light-Head R-CNN: In Defense of Two-Stage Object Detector

程式碼實現:地址

作者:Zeming Li,Chao Peng,Gang Yu,Xiangyu Zhang,Yangdong Deng,Jian Sun

two-stage 檢測器的速度瓶頸

目標檢測(detection)主要分為兩個流派,one-stage(SSD,YOLO系列等)和 two-stage(R-CNN系列等),前者速度快,後者精度高。

two-stage的檢測框架一般將任務分為兩步:

  • 第一步:產生足夠多的候選框(proposal),作者稱之為Body(檢測器體)

  • 第二步:對候選框進行識別,作者稱為Head(檢測器頭)

通常,想要取得最好的準確率,Head的設計一般比較 Heavy,就是計算量引數較多,計算量比較大。作者發現,像 Faster RCNN 和 R-FCN 都有共同點,就是有一個非常 Heavy 的 Head 接到主體框架上:

  • Faster RCNN 在對 ResNet 的 conv5 進行 ROI Pooling 後,接了兩個全連線層。由於 ROI Pooling 後的特徵非常大,所以第一個 fc 層非常耗記憶體,並且影響速度。每個 Region Proposal 都要經過兩個 fc 層也導致計算量非常大。

  • 在 R-FCN中,雖然少了兩個全連線層,但是需要構建一個 C l a

    s s e s × p × p Classes×p×p 大小的Score Map( p p 為後接的池化層的大小),也是需要非常大的記憶體和計算量。

由於Faster R-CNN 和 R-FCN 的重頭設計,即使換用小的主幹網路,速度也很難有較大的提升,於是作者結合兩者優點,提出如下兩點改進:

  • 使用 Large Separable Convolution 來生成一個 “Thin” 的Score Map,Score Map只有 α × p × p \alpha×p×p 通道。在論文中,作者用了 α = 10 \alpha=10

  • 在 ROI Pooling 後接上一個全連線層。為什麼要接上這個全連線層呢?因為原來的 R-FCN 的 Score Map 是 C l a s s e s × p × p Classes×p×p 通道,正好對應 Classes 的預測,現在沒有這麼多個通道了,沒辦法用原來的投票方法了,所以接上一個全連線層也是為了後面能夠接上 Faster R-CNN 的迴歸和分類。

Light-Head R-CNN 與其他網路的速度對比如下圖,主幹網路分別使用 (a small Xception like network,Resnet-50,Resnet-101):

網路架構對比

作者將Light-Head R-CNN 與 Faster R-CNN 和 R-FCN 的架構進行了對比:

  • Faster R-CNN

Faster R-CNN 在 ROI Pooling 以後要對每個 ROI 進行計算,也就是 R-CNN subnet,這部分包括兩個 fc 層,且第一個 fc 層要全連線上一層的全部channel,使用 ResNet101 作為主幹網路時,在上一層有 2048 個channel,這個計算量就很大了,所以說 ROI-wise 部分的計算太重了。

  • R-FCN

R-FCN 為了對 ROI-wise subnet 進行加速,就採用了一種全卷積的策略。R-FCN 首先為每個 region 預測一個score maps,通道數是 c l a s s e s × p × p classes × p × p (p是接下來的pooling形狀),接著是沿著每個 ROI 做pool,然後 average vote 最後的預測。

採用這種方式,R-CNN subnet 其實是沒有計算量的(但是效果上不如有 ROI-wise 的 Faster R-CNN),但是要為ROI pooling生成一個大的score map, 還是挺耗時的。

(圖中 C C 表示物體檢測的類別數, + 1 +1 表示背景類。)

  • Light-Head R-CNN

Light-Head R-CNN結合了Faster R-CNN和R-FCN的優點:

  1. 對 ResNet 卷積層中 conv5 的 2048 通道輸出,使用large separable convolution 降低特徵圖(feature maps)厚度並簡化計算量,生成 “薄”的 thin feature map( α × p × p \alpha×p×p α = 10 \alpha=10 ),避免了 R-FCN feature map 太大,且隨類別數 C C 增加而增大的問題。

  2. 在 thin feature map 後面接 ROI Pooling,此時得到的 ROI-wise feature map 也薄,這樣後面再接 fc 層,此時的計算量就小了,避免了Faster R-CNN 在 R-CNN subnet 的第一個 fc 層計算量過大的問題。

Light-Head R-CNN 將原來 R-FCN 的 score map 的職責兩步化了:thin score map 主攻位置資訊,R-CNN子網路中的 fc 主攻分類資訊。另外,global average pool 的操作被去掉,用於保持精度。

主幹網路 Backbone

在Head小了以後,Light-Head R-CNN就可以在速度和精度之間做權衡,可以選擇性地使用大的或者小的backbone網路了。文章中給出了兩種設定:

  • “ L” 表示使用大的 backbone network,更注重精度。這裡用的 L 網路是resnet101。

  • “S” 表示使用小的 backbone network,更注重速度。這裡用的 S 網路是Xception-like model。

Thin feature maps for RoI warping

使用 large separable convolution,應該是借鑑了 Inception 3 的思想,用 1 × k 1×k k × 1 k×1 的兩層卷積來代替 k × k k×k 的卷積核,其結構如下:

其中 kernel 大小: k = 15 k=15 ,很大,所以叫 large conv,這主要是為了保證不丟失太多精度。因為這一層之前的 feature map 有2048 channel,這一層只有 490 channel,這麼多channel數的減少要通過 large conv 進行一定的補償。

另外,separate conv 能夠減少計算量, C m i d = 64 ( f o r S ) / 256 ( f o r L ) Cmid=64 (for S) / 256 (for L) C o u t = 10 × p × p Cout=10×p×p ,遠小於 R-FCN 的 c l a s s e s p p classes*p*p

RPN

RPN 網路用於生成候選區域(region proposals)。通過 softmax 判斷 anchors 屬於前景(foreground)或者背景(background),同時利用bounding box regression 修正 anchors 的偏移和縮放,獲得精確的proposals。

Light-head R-CNN中使用RPN網路生成候選區域,具體過程如下:

  • 3 × 3 3×3 卷積以及生成候選框(RoI):

    在Light-head R-CNN中,使用 Resnet 的 conv4 的輸出作為 RPN 的輸入特徵圖,其維度是 14 × 14 × 1024 14×14×1024 。對特徵圖進行 3 × 3 3×3 卷積,並對feature map 進行滑窗操作。

    當前滑窗的中心在原畫素空間的對映點稱為 anchor,以此 anchor 為中心,可以得到 15 個候選框(proposals):

    • 使用 5 種面積尺寸(scales),即{ 3 2 2 , 6 4 2 , 12 8 2 , 25 6 2 , 51 2 2 32^2, 64^2, 128^2, 256^2, 512^2 }

    • 在每個面積尺寸下,取 3 種不同的縱橫比(Aspect Ratios): { 1 : 1 1 : 2 2 : 1 1:1、1:2、2:1 }。

  • 以3×3卷積核的中心點,作為 anchor 的中心點,通過滑動視窗和 anchor 機制得到影象的多尺度候選框。

  • 使用1×1卷積核,基於 anchor 種類數量進行卷積,得到所有 anchors 的foreground softmax scores 和 bounding box regression 偏移量。

  • 根據 bounding box regression 偏移量,獲取位置修正後的 anchors。

  • 按照 foreground softmax scores 由大到小排序 anchors,提取前 6000 個 foreground anchors。

  • 限定超出影象邊界的 foreground anchors 為影象邊界,防止後續 RoI Pooling 時 proposal 超出影象邊界

  • 剔除非常小(width < threshold or height < threshold)的 foreground anchors。

  • 進行非最大抑制(non maximum suppression,NMS),其中 I O U t h r e s h = 0.7 IOU thresh=0.7

  • 再次按照 NMS 後的 foreground softmax scores 由大到小排序foreground anchors,提取前 1000 個結果作為 proposal 輸出。

Light-Head R-CNN 精度提升技巧

為了提升演算法精度,作者又加入了其他 trick,分別是:

  • 在 PSRoI pooling 中加入RoIAlign ( Mask-RCNN ) 中的插值技術,提升了1.7%.

  • 將NMS threshold從 0.3 改成 0.5 之後,提升了0.6%.

  • 使用 multi-scale 進行training,提升1%.

Light-Head R-CNN 速度提升技巧

為了平衡精度與速度,作者做了如下一些改變:

  • 用 tiny Xception 代替 Resnet-101.

  • 棄用 atrous algorithm.

  • 將 RPN channel 減少一半到256.

  • Large separable convolution: k e r n e l s i z e = 15 , C m i d = 64 , C o u t = 490 10 × 7 × 7 kernel size = 15, Cmid = 64, Cout = 490(10×7×7) .

  • 採用 PSPooling + RoI-align. 用 alignment 技術做了 RoI warping,它能減少被 pool 的 feature map通道[ k × k k × k 倍,k是 pooling size],RoI-align能提升結果。

採用上述trick之後,能夠在COCO上達到102FPS,同時達到30.7% mmAP的精度:

作者的測試環境:The code is tested on a server with 8 Pascal Titian XP gpu, 188.00 GB memory, and 40 core cpu.