Light-Head R-CNN
文章目錄
- 論文信息
- two-stage 檢測器的速度瓶頸
- 網絡架構對比
- 主干網絡 Backbone
- Thin feature maps for RoI warping
- RPN
- 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中,雖然少了兩個全連接層,但是需要構建一個 Classes×p×pClasses×p×pClasses×p×p 大小的Score Map( ppp 為后接的池化層的大小),也是需要非常大的內存和計算量。
由于Faster R-CNN 和 R-FCN 的重頭設計,即使換用小的主干網絡,速度也很難有較大的提升,于是作者結合兩者優點,提出如下兩點改進:
-
使用 Large Separable Convolution 來生成一個 “Thin” 的Score Map,Score Map只有 α×p×p\alpha×p×pα×p×p 通道。在論文中,作者用了 α=10\alpha=10α=10。
-
在 ROI Pooling 后接上一個全連接層。為什么要接上這個全連接層呢?因為原來的 R-FCN 的 Score Map 是 Classes×p×pClasses×p×pClasses×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,通道數是 classes×p×pclasses × p × pclasses×p×p(p是接下來的pooling形狀),接著是沿著每個 ROI 做pool,然后 average vote 最后的預測。
采用這種方式,R-CNN subnet 其實是沒有計算量的(但是效果上不如有 ROI-wise 的 Faster R-CNN),但是要為ROI pooling生成一個大的score map, 還是挺耗時的。
(圖中 CCC 表示物體檢測的類別數,+1+1+1 表示背景類。)
- Light-Head R-CNN
Light-Head R-CNN結合了Faster R-CNN和R-FCN的優點:
對 ResNet 卷積層中 conv5 的 2048 通道輸出,使用large separable convolution 降低特征圖(feature maps)厚度并簡化計算量,生成 “薄”的 thin feature map(α×p×p\alpha×p×pα×p×p,α=10\alpha=10α=10),避免了 R-FCN feature map 太大,且隨類別數 CCC 增加而增大的問題。
在 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×k1×k1×k 和 k×1k×1k×1 的兩層卷積來代替 k×kk×kk×k 的卷積核,其結構如下:
其中 kernel 大小:k=15k=15k=15,很大,所以叫 large conv,這主要是為了保證不丟失太多精度。因為這一層之前的 feature map 有2048 channel,這一層只有 490 channel,這么多channel數的減少要通過 large conv 進行一定的補償。
另外,separate conv 能夠減少計算量,Cmid=64(forS)/256(forL)Cmid=64 (for S) / 256 (for L)Cmid=64(forS)/256(forL),Cout=10×p×pCout=10×p×pCout=10×p×p,遠小于 R-FCN 的 classes?p?pclasses*p*pclasses?p?p。
RPN
RPN 網絡用于生成候選區域(region proposals)。通過 softmax 判斷 anchors 屬于前景(foreground)或者背景(background),同時利用bounding box regression 修正 anchors 的偏移和縮放,獲得精確的proposals。
Light-head R-CNN中使用RPN網絡生成候選區域,具體過程如下:
-
3×33×33×3 卷積以及生成候選框(RoI):
在Light-head R-CNN中,使用 Resnet 的 conv4 的輸出作為 RPN 的輸入特征圖,其維度是 14×14×102414×14×102414×14×1024。對特征圖進行 3×33×33×3 卷積,并對feature map 進行滑窗操作。
當前滑窗的中心在原像素空間的映射點稱為 anchor,以此 anchor 為中心,可以得到 15 個候選框(proposals):
-
使用 5 種面積尺寸(scales),即{ 322,642,1282,2562,512232^2, 64^2, 128^2, 256^2, 512^2322,642,1282,2562,5122 }
-
在每個面積尺寸下,取 3 種不同的縱橫比(Aspect Ratios): { 1:1、1:2、2:11:1、1:2、2:11: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),其中 IOUthresh=0.7IOU thresh=0.7IOUthresh=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: kernelsize=15,Cmid=64,Cout=490(10×7×7)kernel size = 15, Cmid = 64, Cout = 490(10×7×7)kernelsize=15,Cmid=64,Cout=490(10×7×7).
-
采用 PSPooling + RoI-align. 用 alignment 技術做了 RoI warping,它能減少被 pool 的 feature map通道[ k×kk × kk×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.
總結
以上是生活随笔為你收集整理的Light-Head R-CNN的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Xception
- 下一篇: 目标函数、损失函数、代价函数