20190414論文研討 FPN、Mask R-CNN

Feature Pyramid Networks(FPN)

研究背景與摘要


Feature pyramids(特征金字塔)是傳統多尺度目標識別系統的基本組成部分。但是最近的深度學習目標檢測系統(R-CNN、Fast R-CNN 等),都避免了這種特征表示方式,部分原因是特征金字塔需要大量的計算和存儲。

作者利用CNN固有的多尺度和金字塔層級結構,來構建特征金字塔表示。提出了一種具有橫向連接的、自頂向下的結構(稱為 FPN),用于在各種尺度上構建高級語義 feature maps。

1554816190101.png
  • (a) 早期手工設計特征和傳統目標檢測方法多使用。在多尺度進行特征表示,所有的層級上的特征都具有明確的語義。但內存占用多,不能端到端訓練。
  • (b) CNN 即具有這種結構,CNN 相比人工設計特征,能夠自己學習到更高級的語義特征,同時 CNN 對尺度變化魯棒,因此如圖,從單個尺度的輸入計算的特征也能用來識別,但是遇到明顯的多尺度目標檢測時,還是需要金字塔結構來進一步提升準確率。 也可以(a)、(b)結合使用。
  • (c) 從網絡不同層抽取不同尺度的特征做預測,這種方式不會增加額外的計算量。SSD 即利用了這種結構。作者認為SSD算法中沒有用到足夠低層的特征(在 SSD 中,最低層的特征是VGG網絡的 conv4_3),而在作者看來足夠低層的特征對于檢測小物體是很有幫助的。
  • (d) 利用CNN固有的多尺度和金字塔層級結構,頂層 feature map 通過上采樣與底層feature map結合,融合為新的 feature map,最終形成 feature pyramid(特征圖金字塔)。每層獨立預測。實現了從單尺度的單張輸入圖像,快速構建在所有尺度上都具有強語義信息的特征金字塔,同時無明顯的額外代價。

注意,FPN 是 CNN 框架的一個可選部件或者說可選操作,即它很可能會改善基本框架的性能,但不需要對基本框架進行較大的改動。

FPN 的技術細節


包括一條自底向上的通路,一條自頂向下的通路,和橫向連接

通過自頂向下的路徑和橫向連接將低分辨率、語義強的 feature map高分辨率、語義弱、更本地化(下采樣次數少)的 feature map 結合起來,其結果是一個在所有層級都具有豐富語義的 feature pyramid

1554817275569.png

自底向上

自底向上通路是指 backbone ConvNet (如 ResNet)的前向計算過程,它計算得到一種由若干尺度上的 feature map 組成的特征層次(金字塔)結構,每向上一層尺度縮小為 1/2。將特征金字塔的每一層稱為一個 stage。ConvNet 通常有許多層生成相同大小的輸出映射,我們說這些層處于相同的階段(stage),只取 stage 的最后一層輸出的 feature map,作為 feature pyramid 的參考集合。

1554880562870.png

具體來說,對于 ResNets,我們使用每一個stage的最后一個 residual block 的激活后輸出,作為 feature pyramid 的參考集合。我們conv2, conv3, conv4, and conv5 的輸出分別表示為{C2, C3, C4, C5}。

note that they have strides of {4, 8, 16, 32} pixels with respect to the input image

自頂向下

自頂向下的路徑是指,通過從更高的金字塔層次上,上采樣空間上更粗糙但語義更強的 feature maps,從而產生更高分辨率的 feature maps。(為了簡單起見,使用最近鄰向上采樣。)

橫向連接

Pyramid 每一層的橫向連接都將空間大小相同的(分別來自向上和向下通路的)feature maps 進行融合。

融合之后還會再采用 3×3 的卷積核,對每層的融合結果進行卷積,目的是消除上采樣的混疊效應(aliasing effect)。

其中上行 feature map 會經過一個1x1卷積來減少 channel 維度(文中限制到 256d)。構造金字塔時沒有引入額外的非線性。

融合后的 feature maps 稱為 {P2, P3, P4, P5}

FPN + Faster R-CNN


本文將FPN簡單地與 Faster R-CNN 結合,最小限度地修改了原網絡,改善了原網絡的性能。

1554882718039.png

Faster R-CNN = RPN + Fast R-CNN,因此下文中介紹FPN應用于Faster R-CNN種時,RPN 和 Fast R-CNN 部分分別需要做的改動。

FPN for RPN

在每一個scale層,都定義了不同大小的anchor,對于 {P2,P3,P4,P5,P6},定義 anchor 的大小為 {32^2,\ 64^2,\ 128^2,\ 256^2,\ 512^2?},比例為,1:2,1:1,2:1。所以整個特征金字塔有15種 anchors。

注:

  1. 越高分辨率的 feature maps,采集的 region proposals 尺寸越小,這也對應了作者所稱的,底層 feature map 對于小目標的檢測更有用。大尺度的RoI要從低分辨率的 feature map 上切,有利于檢測大目標,小尺度的RoI要從高分辨率的 feature map 上切,有利于檢測小目標。;
  2. P6 僅僅是對 P5的max pooing下采樣,是為了得到尺寸為 512^2? 的 anchor,P6是只用在 RPN中用來得到region proposal的,并不會作為后續Fast RCNN的輸入。這也是上圖紅色方塊和黃色方塊數目不一樣的原因。

RPN 這部分的訓練中,正負樣本的界定和 Faster R-CNN 差不多:如果某個 region proposal 和一個給定的 ground truth 有最高的 IOU,或者和任一 ground truth 的IOU 都大于0.7,則是正樣本。如果一個 anchor 和任意一個 ground truth的IOU都小于0.3,則為負樣本。其他區間忽略。

FPN for Fast R-CNN

Fast R-CNN 通常是應用在單尺度feature map上。但為了與FPN結合,需要針對pyramid的不同層,設計 RoI Pooling Layer.

把feature pyramid看作是由一個圖像金字塔產生的。不同尺度的RoI使用不同特征層作為ROI pooling層的輸入,大尺度RoI就用相對高層的feature map,比如P5;小尺度RoI就用相對底層的feature map,比如P3。

因此,我們可以基于RoI對應的region proposal尺寸大小,判斷使用哪一層對應的探測器。在形式上,我們將寬度為w,高度為h(在網絡輸入圖像上)的RoI分配到feature pyramid的Pk級(k=2, 3, 4, 5)。

1554884635662.png

注意:

  1. k0=4, 對應ImageNet標準的224^2大小,對應C4/P4。

  2. 所有的pyramid levels共享預測頭(類分類器和回歸框,即上圖黃色部分);feature pyramid所有的層級的RPN頭(RPN中的3×3、1×1卷積)都共享參數。

結果


1554886519934.png

參考資料


https://github.com/unsky/FPN

Feature Pyramid Networks for Object Detection 總結

FPN(feature pyramid networks)算法講解

Mask R-CNN

研究背景與摘要


目標檢測、語義分割與實例分割

img

Mask R-CNN 在 Faster R-CNN 目標檢測任務的基礎上,進一步實現了實例分割的功能。

相比于原始 Faster R-CNN 論文中的結構(VGG),本文采用了 ResNet-C4、ResNet-FPN 結構提取 feature maps,并對比試驗。(但這不屬于Mask R-CNN 的特點)。

Mask R-CNN 的優點:

  • 當時已有的實例分割方法中,多使用了不優雅的 trick ,本文只通過e2e的網絡就完美完成任務;結合 Faster R-CNN 的 Mask RCNN 可以同時完成目標檢測實例分割,且實例分割效果優于當時已有方法;
  • 易于實現和訓練,基本與 Faster R-CNN 相同,只需針對 mask branch 作少許改動;
  • 只比 Faster R-CNN 增加了一個很小的開銷(檢測速度 5 fps);
  • 可以很方便地推廣到其他任務中,如估計人體姿態、人體關鍵點估計。

技術細節


Architecture

img

Mask R-CNN ≈ Mask branch + Fast R-CNN

Mask R-CNN 與 Faster R-CNN 結構上的區別,主要有兩點:

  • 將 RoIPool Layer 改為 RoIAlign Layer,用于實現輸入與輸出間,像素到像素的匹配;
  • 在預測頭處添加了一個Mask Branch,該分支與原有的 Bounding Box Recognition Branch 并行;

RoIAlign

盡管 Mask RCNN 是 Faster RCNN 的一種直覺上的拓展,似乎加上 Mask Branch 就萬事大吉了。其實不然,要想得到好的結果,恰當地構造是至關重要的

特別是分割任務中,需要做到輸入與輸出 pixel-to-pixel alignment;而在 Faster R-CNN 的設計中,沒有考慮網絡的輸入和輸出之間的像素與像素對應,尤其是 ROIPool 層。

ROIPool 層將空間粗略地劃分,將原本連續的坐標離散化了。這導致了ROI和提取的特征在空間上不匹配。這可能對分類沒有什么影響(分類對微小的變化魯棒),但會嚴重影響 mask 的像素準確度。

img

為了修正這種像素不匹配,我們提出了一個簡單的、無粗略量化的層,稱為RoIAlign,它忠實地保留了精確的空間位置。在 mask 的精確性上,帶來了10%-50%的收益。

img

上圖中,虛線部分表示f eature map,實線表示ROI,這里將ROI切分成2x2的單元格。如果采樣點數是4,那我們首先將每個單元格子均分成四個小方格(如紅色線所示),每個小方格中心就是采樣點。這些采樣點的坐標通常是浮點數,所以需要根據feature map的網格點,對采樣點像素進行雙線性插值(如四個箭頭所示),就可以得到該像素點的值了。然后對每個單元格內的四個采樣點進行 maxpooling 或 avgpooling,就可以得到最終的 ROIAlign 的結果。

在相關實驗中,作者發現將采樣點設為4會獲得最佳性能,甚至直接設為1在性能上也相差無幾。

Mask Branch

Mask Branch 是一個小型 FCN,對于每個RoI,以 pixel-to-pixel 的方式預測輸出出一個m×m×k的分割結果(但只取類別概率最高的一層作為最終輸出mask)。

1555076090330.png

Loss & Decouple Mask and Class Prediction

具體來說,我們對每個ROI預測一個mxm的mask。

除了上文中提到的像素匹配問題,本文中實驗發現,對 mask 和 class 的預測解耦是必要的:本文中,mask branch 根據 classification branch 輸出的分類結果,針對每個class,獨立地預測一個二元的mask,即類與類之間沒有競爭。而普遍的應用 FCN 的分割網絡,則是對每個像素利用 softmax 和多類別交叉熵損失。這樣多各類別會互相競爭。

因此 Loss 定義為:
L=L_{cls}+L_{box}+L_{mask}
其中前兩項與 Faster R-CNN 中相同。

L_{mask}:對于每個ROI,mask branch的輸出維度是Km^2,即對于 K 個類別,分別預測一個 m^2 分辨率的 mask 輸出。因此,我們逐個像素應用 sigmoid,L_{mask}定義為二類的交叉熵損失的平均值(average binary cross-entropy loss)。對于真實類別為 k 的RoI,L_{mask} ? 僅僅在第k類對應的 mask 上計算(其他的 mask 輸出對 loss 沒有貢獻)。

如此定義 L_{mask} ?,允許網絡獨立地對每個類別產生 mask(類別之間沒有競爭)。本外另外使用專門的classification branch 來預測 class label,然后依據class label 選擇輸出的mask(即上文中的解耦)。實驗證明,解耦是實例分割效果良好的關鍵。

Train

超參數與 FasterRCNN 相同。

每個圖像調整短邊至800像素。每個GPU的每個batch有2張圖,每張圖有N個RoI(N_C4=64, N_FPN=512),正負ROI比為1:3.

ROI 正負樣本的定義與 Faster rcnn 相同,如果與Ground Truth 的IoU超過0.5認為是正樣本,否則負樣本。 L_{box}L_{mask}只在正樣本上計算。

可以采用階段性訓練,

Test

在測試過程中,proposal 數目為300 for C4, 1000 for FPN。

對這些 proposal 做 box prediction,然后進行非極大值抑制(有重疊部分的ROI,取class得分最大的作為輸出),得到最終框的結果。

隨后,mask branch 只對得分最高的100個檢測框進行mask預測(而訓練集上是所有的proposal并行計算損失的),這樣可以提高效率,只增加較小的開銷(約20%)。

mask branch針對每個RoI可以預測K個masks,對應K個類別。但我們只選用了第k個mask(即classification branch的預測結果)。

img

mask branch的輸出將被resize(通過插值方式將輸出的 mask 放大)成 proposal 的大小,然后以0.5為閾值二值化。

應用到人體關鍵點檢測


將人體關鍵點的位置建模為一個單點的 mask,采用 Mask R-CNN預測 K 個 mask,每一個 mask 對應一個人體關鍵點(如左肩、右肘等)

相對于基本的mask rcnn,有微小的改動:

  • 對于每一個 instance 的 K 個關鍵點,訓練目標是一個 one-hot 的 m×m 的 mask,即每張 mask 只有一個 pixel 標記為前景;
  • 在訓練過程中,對于每一個 Ground Truth關鍵點,最小化 m^2 路的 softmax 輸出的交叉熵損失,這樣更有利于檢測單點。
  • key point 任務的預測頭是常規 Mask R-CNN 預測頭的變體,包括8個3×3、512d的卷積層,然后逐漸2倍上采樣,產生56x56的輸出(實驗發現一個相對高分辨率的輸出,對關鍵點檢測的準確性更有用)。

結果


實例分割

1555078907564.png

人體關鍵點檢測

1555078941045.png

參考資料


令人拍案稱奇的Mask RCNN

實例分割--Mask RCNN詳解(ROI Align / Loss Fun)

先理解Mask R-CNN的工作原理,然后構建顏色填充器應用

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容