1. 程式人生 > >Faster RCNN 關鍵點總結

Faster RCNN 關鍵點總結

reg 函數 不知道 pla positive 是什麽 高質量 部分 regress

技術分享圖片?

術語 描述
RoI Region of Interest
RPN Region Proposal Network
FRCN Fast RCNN

Faster R-CNN,由兩個模塊組成:

第一個模塊是深度全卷積網絡 RPN,用於 region proposal;
第二個模塊是 Fast R-CNN 檢測器,它使用了RPN產生的region proposal進行檢測。

FRCN

技術分享圖片?

網絡輸入

  • 整張圖片
  • object proposals(提出矩形圖片坐標)

網絡輸出

  • N + 1 (N 類物體 + 背景) 類概率分布
  • N 個 bounding box 坐標 (category-specific bounding-box regressors)

目標檢測的兩大困難

  • 有大量的框需要處理,
  • 而且這些框是不準確的, 需要去微調

主要貢獻: 簡化了 RCNN 訓練步驟;
性能: VOC2007/2010, mAP 約為 66.7%;

前向傳播

網絡首先使用卷積層和最大池化層處理整個圖像生成 feature map。 然後,對於每個 object proposal,RoI池化層從 feature map 中提取固定長度的特征向量。每個特征向量被饋送到全連接層,最終輸入到兩個輸出層, 為 (N類+背景類)分類器和 Bounding Box 回歸器.

RoI pooling layer

RoI定義:

可以說是最後一個卷積 feature map 上的一個矩形區域, 每個 RoI 由四元組(r,c,h,w)定義,為其左上角(r,c) 及其高度和寬度(h,w);

那麽 RoI 是如何產生的呢 ?

我們先來看看 Region Proposal 是什麽? 即輸入圖片上的一個矩形區域, 二者的映射關系, 大約為卷積網絡所有的 downsampling strirde 相乘, 將 Region Proposal 映射到最後一個卷積 feature map 上的一個矩形區域上.

那麽我們獲得 RoI 之後, 怎麽處理它呢?

這就說要這一節的主角啦, RoI 池化層(RoI pooling layer 或 RoI max pooling), 它的作用是將高寬為 h×w RoI 窗口劃分為包含 H×W 個大小約 \(\frac{h}{H}×\frac{w}{W}\)

的子窗口的網格,然後將每個子窗口中的最大值匯集到相應的輸出網格單元中來, 其中 H 和 W 是超參數, 獨立於任何特定的 RoI。

損失函數設計

技術分享圖片?

技術分享圖片?

Truncated SVD

對於圖像分類來說,與卷積層相比,計算全連接層所花費的時間很少。而對於檢測問題來說,由於要處理的 RoI 的數量很大,並且有近一半的正向傳播時間用於計算全連接層。 通過截斷的 SVD 壓縮, 可以很容易地加速大的全連接層的計算速度。

\[W ≈ UΣ_t V^T\]

技術分享圖片?

Scale invariance: to brute force or finesse ?

技術分享圖片?

卷積神經網絡的第一層是通用的,任務無關的,所以檢測微調時, 不需要考慮第一層, FRCN 從 conv_3 層開始微調

RPN 介紹

RPN 的提出, 將 region proposal 融入 CNN 網絡中, 整個系統是一個單一的,統一的對象檢測網絡。 具體為使用 RPN 的技術代替之前 Selection Search, 完成 region proposal, 那麽 RPN 需要完成兩個任務:

  1. 判斷 anchors 中是否包含將要檢測的 K 類物體(是或者否), 這裏只是判斷是否包含物體, 而沒有判斷到底是什麽物體, 即 objectness proposal
  2. 提出 anchor 對應的 bounding box 的坐標, 即 region proposal

RPN 提出的是在圖片上的坐標, 然後通過 RoI 映射投影到最後一層卷積 feature map 上

下面我們說說是訓練 RPN 的事, 首先看看 RPN 是什麽?

RPN 是什麽?

RPN 輸入輸出就如下,

輸入: 整張圖片
輸出: objectness classification + bounding box regression

\(\color{red}{\bf來說說 RPN 中關鍵概念 \space anchor}\)

anchor 其實就是預訓練網絡卷積層的最後一層 feature map 上的一個像素,以該 anchor 為中心(更確切的說是以 feature map 的尺寸 SxS 分割輸入圖像為 SxS 個 cell, 將 anchor 對應於相應cell的中心, 然後通過尺寸和寬高比在圖像上形成 anchor boxes),可以生成 k 種 anchor boxes(理解為 region proposal 就好了); 每個 anchor box 對應有一組縮放比例( scale)和寬高比(aspect). 論文中共使用 3 種 scale(128, 256, 512), 3 種 aspect(1:2, 1:1, 2:1), 所以每個 anchor 位置產生 9 個 anchor boxs.

技術分享圖片?

為何要提出 anchor呢?

來說說 anchor 的優點: 它只依賴與單個 scale 的 images 和 feature map, 滑動窗口也只使用一個尺寸的 filter. 不過卻能解決 multiple scales and sizes的問題.

為何選擇 128 ,256, 512? 論文中用到的網絡如 ZFNet 在最後一層卷積層的 feature map 上的一個像素的感受野就有 171(如何計算感受野看這裏), filter size 3x3, 3x171=513. 而且論文中提到: 我們的算法允許比底層接受域更大的預測。 這樣的預測並非不可能 - 如果只有對象的中間部分是可見的,那麽仍然可以大致推斷出對象的範圍。

在預訓練網絡卷積層的最後一層 feature map 上進行 3x3 的卷積, anchor 就位於卷積核的中心位置.

記住這裏 anchor boxes 坐標對應的就是在圖片上的坐標, 而不是在最後一層卷積層 feature map 上的坐標.

anchor box 這麽簡單粗暴, 為什麽有效?

列舉了這麽多, 相當於窮舉了吧, 比如論文中所說,由於最後一層的全局 stride 為16, 那麽100x600 的圖片就能生成大約 60x40x9≈20000個 anchor boxes). 當然列舉了這麽多 anchor boxes, 這region proposal 也太粗糙啊, 總不能就這樣把這麽多的質量層次不齊 anchor boxes 都送給 Fast R-CNN來檢測吧. 那該怎麽剔除質量不好的呢? 這就是後面 RPN 的 bounding box regression 和 objectness classification 要解決的事情:)

有必要先說說 RPN 的 objectness classification 和 bounding box regression 有什麽用?

一句話就是 "少生優育"

bounding box regression: 調整輸入的 anchor boxer 的坐標, 使它更接近真實值, 就是一個 bbox regression, 輸出稱為 RPN proposal, 或者 RoIs. 提高 anchor boxer 的質量

objectness classification: 一些 RPN proposal(anchor boxer經過)可能相互重疊度很高, 為了減少冗余, 通過objectness classification的輸出的分數score 對這些RPN proposal做 NMS(non-maximum suppression), 論文中設置threshold 為 0.7, 只保留 threshold < 0.7 的RPN proposal, 減少 anchor boxes 的數量

RPN 的任務是什麽?

訓練 RPN 網絡來選擇那些比較好的 anchor boxes.

因為現在我們要訓練 RPN, 我們只提出了 anchor boxer, 卻不知道這些 anchor boxes是不是包含物體, 就是沒有標簽啊! 那麽問題來了? objectness classification 分類時沒有標簽啊. 怎麽辦?

辦法就是使用 image 檢測用 gt-bbox(ground-truth bounding box), 註意這裏我們只是檢測圖片中有沒有物體, 而不判斷是哪一類物體.

positive anchors

與任意 gt-box 的 IoU > 0.7, 或者具有最大 IoU, 即標記為1, 就是包含物體, 當然該 gt-box 就是 anchor boxes bounding box regression任務對應的標簽

negative anchors

與任意 gt-box 的 IoU < 0.3, 即標記為 negative anchor, 標記為0, 就是不包含物體, 是背景, 從後面的損失函數知道, 背景不參與回歸損失函數.

IoU 位於 positive anchors, negative anchors 之間 anchor boxer 背景和物體摻雜, 的對於訓練目標沒有貢獻, 不使用.

bounding box regression && objectness classification

註意一點, 每個 regressor 只負責一個 <scale, aspect>, 不與它 regressor共享權重, 所以需要訓練 k 個 regressor.

其他不多說, 只貼貼公式

技術分享圖片?
技術分享圖片?

技術分享圖片?

  1. \(p^*_i\) 為一個 batch 中的第 i 個 anchor box 的真實標簽, \(p_i\) 為分類器預測概率, 如果是positive anchor, \(P_i^*\)為1, 否則為0.
  2. $L_{reg}(t_i, t_i^) = smooth_{L1}(t_i-t_i^), $
  3. \(p^*_iL_{reg}\) 表示regression loss 只會被 positive anchor 激活.
  4. anchor boxes 的坐標表示為 (x, y, w ,h), (x, y) 為 box 的中心坐標.
  5. \(x,\space x_a, \space x^*\) 分別代表 bbox regressor 的預測坐標, anchor box 的坐標, 和 anchor box 對應的 gt-box 坐標.

訓練

交替訓練: 在這個解決方案中,我們首先訓練 RPN,並使用這些 proposal 來訓練 Fast R-CNN。 由 Fast R-CNN 調節的網絡然後用於初始化 RPN,並且該過程被重復。
細節:

re-size image 最短邊為 600 像素
total stride for ZFNet, VGGNet 16 pixels

跨圖像邊緣的 anchor boxes 處理

跨越圖像邊界的 anchor boxes 需要小心處理。 在訓練期間,忽略了所有的跨界 anchor boxes,所以他們不會影響損失函數。 對於典型的1000×600圖像,總共將有大約20000個(≈60×40×9)anchor boxes。 在忽略跨界錨點的情況下,每個圖像有大約 6000 個 anchor boxes 用於訓練。 如果跨界異常值在訓練中不被忽略,它們會引入大的難以糾正誤差項的,並且訓練不會收斂。 然而,在測試過程中,我們仍然將完全卷積RPN應用於整個圖像。 這可能會生成跨邊界anchor boxes,我們將其剪切到圖像邊界(即將坐標限制在圖片坐標內)。

一些實驗總結

技術分享圖片?

RPN+FRCN( ZFNet), mAP=59.9
RPN+FRCN( VGGNet), mAP=69.9

  1. Faster RCNN 使用 RPN 代替 SS 進行 region proposal, 極大的加快了檢測速度, RPN 提出region proposal 的時間相比較 SS 來說,(1.5s -> 0.01s). 而且性能還要更好
  2. NMS 不會降低檢測性能. 通過 NMS 得到 300 個 proposal的測試mAP為 55.1%, 使用top-ranked 6000個 proposal的mAP為 55.2%, 從而說明經過NMS之後的 top ranked proposal都是很精確的.
  3. 移除 RPN 的 classification(cls) 的話(自然沒法做 NMS, NMS 就是依據cls 來做的), 當 proposal 很少時, 精確率下降很大, N = 100時, mAP 為44.6%, 這說明了cls 越高的 proposal 的準確性越高.
  4. 移除 RPN 的 bbox regression(reg)的話, mAP 下降到 52.1% 說明了多 scale, 多 aspect 的 anchor boxes 並不足以應對精確檢測, regressed box bounds 可以產生高質量的 proposals
  5. 對於超參 scale, aspect 敏感性如下

技術分享圖片?

預測過程

  1. 圖片經過 RPN 產生anchor boxes
  2. anchor boxes 通過 bounding box regressor 調整位置
  3. 使用 objectness classification 分類器的打分進行 NMS, 減少數量
  4. 將 region proposal 交給 fast rcnn 檢測.

Faster RCNN 關鍵點總結