基於區域的全卷積神經網絡(R-FCN)簡介


在 Faster R-CNN 中,檢測器使用了多個全連接層進行預測。如果有 2000 個 ROI,那么成本非常高。

feature_maps = process(image)
ROIs = region_proposal(feature_maps)
for ROI in ROIs
   patch = roi_pooling(feature_maps, ROI)
   class_scores, box = detector(patch)         # Expensive!
   class_probabilities = softmax(class_scores)

R-FCN 通過減少每個 ROI 所需的工作量實現加速。上面基於區域的特征圖與 ROI 是獨立的,可以在每個 ROI 之外單獨計算。剩下的工作就比較簡單了,因此 R-FCN 的速度比 Faster R-CNN 快。

feature_maps = process(image)
ROIs = region_proposal(feature_maps)        
score_maps = compute_score_map(feature_maps)
for ROI in ROIs
   V = region_roi_pool(score_maps, ROI)    
   class_scores, box = average(V)                   # Much simpler!
   class_probabilities = softmax(class_scores)

現在我們來看一下 5 × 5 的特征圖 M,內部包含一個藍色方塊。我們將方塊平均分成 3 × 3 個區域。現在,我們在 M 中創建了一個新的特征圖,來檢測方塊的左上角(TL)。這個新的特征圖如下圖(右)所示。只有黃色的網格單元 [2, 2] 處於激活狀態。

在左側創建一個新的特征圖,用於檢測目標的左上角。

我們將方塊分成 9 個部分,由此創建了 9 個特征圖,每個用來檢測對應的目標區域。這些特征圖叫作位置敏感得分圖(position-sensitive score map),因為每個圖檢測目標的子區域(計算其得分)。

生成 9 個得分圖

下圖中紅色虛線矩形是建議的 ROI。我們將其分割成 3 × 3 個區域,並詢問每個區域包含目標對應部分的概率是多少。例如,左上角 ROI 區域包含左眼的概率。我們將結果存儲成 3 × 3 vote 數組,如下圖(右)所示。例如,vote_array[0][0] 包含左上角區域是否包含目標對應部分的得分。

將 ROI 應用到特征圖上,輸出一個 3 x 3 數組。

將得分圖和 ROI 映射到 vote 數組的過程叫作位置敏感 ROI 池化(position-sensitive ROI-pool)。該過程與前面討論過的 ROI 池化非常接近。

將 ROI 的一部分疊加到對應的得分圖上,計算 V[i][j]。

在計算出位置敏感 ROI 池化的所有值后,類別得分是其所有元素得分的平均值。

ROI 池化

假如我們有 C 個類別要檢測。我們將其擴展為 C + 1 個類別,這樣就為背景(非目標)增加了一個新的類別。每個類別有 3 × 3 個得分圖,因此一共有 (C+1) × 3 × 3 個得分圖。使用每個類別的得分圖可以預測出該類別的類別得分。然后我們對這些得分應用 softmax 函數,計算出每個類別的概率。

以下是數據流圖,在我們的案例中,k=3。

總結

我們首先了解了基礎的滑動窗口算法:

for window in windows
   patch = get_patch(image, window)
   results = detector(patch)

然后嘗試減少窗口數量,盡可能減少 for 循環中的工作量。

ROIs = region_proposal(image)
for ROI in ROIs
   patch = get_patch(image, ROI)
   results = detector(patch)

文章出處:https://mp.weixin.qq.com/s/5zE78EU_NdV5ZeW5t1yV7A


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM