目標檢測的復雜性由如下兩個因素引起,
1. 大量的候選框需要處理,
2. 這些候選框的定位是很粗糙的, 必須被微調
Faster R-CNN 網絡將提出候選框的網絡(RPN)和檢測網絡(Fast R-CNN)融合到一個網絡架構中, 從而很優雅的處理上面的兩個問題, 即候選框的提出和候選框的微調, 兩個模塊具體作用為:
1. RPN (Region Proposal Network),用於提出候選框 RoI(Region of Interest, 直譯為感興趣的區域, 即我們認為可能包含物體的區域);
2. Fast R-CNN (簡稱 FRCN) 檢測器,它使用了 RPN 提出的 RoIs 進行分類和框的微調。
簡單來說, Faster R-CNN 的前向推導過程如下
1. 圖片經過 anchor 產生先驗框 anchor boxes;
2. anchor boxes 通過 bbox regressor 調整位置;
3. 利用 objectness cls(分類器)的輸出(判斷候選框中是否包含物體, 有或者沒有)降序排序, 基於排序進行 NMS, 首先處理得分較高的, 與較高得分的 bounding box 的 iou 值大於閾值的剔除掉(很大概率框中物體是同一物體), 提出 RoIs(訓練時使用2000個)
4. 將 RoIs 交給 Fast R-CNN.
下面我們依次介紹 Fast R-CNN 和 RPN 這兩個模塊從而詳細的了解下 Faster RCNN 目標檢測的流程.
Fast R-CNN

Fast RCNN 的前向傳播如下:
1. Fast RCNN 首先處理 整張圖片, 提取整張圖片的特征(提取的特征具體為最后一層卷積層輸出的 Feature Map),
2. 然后使用 Seletive Search (一種性能不錯的 Region Proposal 方法, 不過很慢, 處理一張圖片大約需要2s, RPN 也是為了處理該問題提出的, 很優雅)生成 RoIs
3. 通過 RoI 映射, RoI 池化層從后一層卷積層輸出的 Feature Map 中提取固定長度的特征向量, 然后該特征向量被饋送到全連接層,最終輸入到兩個輸出層, 一個是K+1(K類+背景類) 路分類器和另一個是 4K categories-specific Bounding Box 坐標的回歸器(對於每一個類別都會預測一組 bounding box坐標).
4. 按照物體的類別分組, 然后對於每一類按照預測概率(即 softmax 輸出)降序排序, 進行 NMS, 去掉重復框.
假設數據集包括 K 種物體, 加上背景類, 共有 K+1類, [u ≥ 1], 所以 bbox reg(回歸器)原本只需要預測 4K 個坐標(論文中也是這么說的), 但是為何 Caffe 的 prototxt 代碼中是預測 4(K+1) 個Bounding Box坐標, 而不是4K 個呢? 反正背景類的也用不上, 只是為了數學上運算方便?
在介紹 Fast R-CNN 之前先來介紹一下一些很重要的概念, 對於理解 Fast R-CNN 至關重要.
RoI 池化層
RoI定義: RoI (Region of Interest), 直譯為感興趣的區域, 其實就是一個我們認為很有可能會包含物體的區域, 具體來說就是輸入圖片上的的一個矩形區域; 每個 RoI 由四元組(x,y,h,w)定義,(x,y) 為一個 RoI 矩形框左上角坐標, (h,w)為矩形的高度和寬度;
RoI 映射: RoI 的矩形框映射與最后一層卷積層輸出的 Feature Map 之間的映射關系為, 尺度減小比例大約為卷積網絡所有的 DownSampling stride 相乘
那么我們獲得 RoI 對應的特征之后, 怎么處理呢?
這就說要這一節的主角啦, RoI 池化層(RoI pooling layer 或 RoI max pooling), 它的作用是將高寬為 h×w RoI 特征窗口划分為包含 H×W 個大小約 \(\frac{h}{H}×\frac{w}{W}\) 的子窗口的網格,然后將每個子窗口中的最大值匯集到相應的輸出網格單元中來, 其中 H 和 W 是超參數, 獨立於任何特定的 RoI。
Fast R-CNN 網絡架構
Fast R-CNN VGG16 在 VGGNet16 網絡上做如下 3 點改動:
1. 網絡輸入變為兩個, 即整張圖片和Selective Search 提出的 RoIs (即 object proposal)
2. 將 VGGNet 最后一層 Max Pooling 替換為 RoI MaxPooling 層, 輸出大小為固定為 H×W 的 Feature Maps(輸出固定尺寸的 feature maps 是為了能與后面全連接層協調)
3. 最后一層全連接層使用 2 個全連接層替換, 用於分類(N 類物體 + 背景類的概率分布)和 bbox 框的微調
Fast R-CNN 在 SPPNet 基礎上改進, 借鑒了 SPPNet 使用 整張圖片 作為網絡輸入, 然后通過 RoI 映射獲取 RoI (輸入圖片上的矩形塊)對應的特征, 大大減少檢測網絡特征提取所帶來的開銷, 相比較 R-CNN 來說, 簡化了模型訓練方法並極大的提高模型的訓練速度和推導速度, Fast R-CNN VGG16 模型訓練速度是 R-CNN 的10倍, SPPNet 的3倍, 推導速度是 R-CNN 的213x倍, SPPNet 的10x倍, 而且檢測性能更好, 在 PASCAL VOC2012 數據集上, mAP 約為 66%(R-CNN ~ 62%).
R-CNN 的網絡輸入為 RoI 對應圖片塊, 而不是整張圖片和 RoI, R-CNN 基於每個 RoI 圖片塊都會進行一次的神經網絡的前向推導進行特征提取, 由於不同的 RoI 之間有很多重疊的部分, 所以這樣的計算方式有多重復計算, 計算冗余很大.
Fast R-CNN 的網絡結構大約如下
?, 正則表達式用法, 表示多層 conv-bn-relu Block
Caffe Fast R-CNN VGG16 MSCOCO 網路結構
roi_pool5: 512x7x7
fc6: 4096
fc7: 4096
cls_score: 81
bbox_pred: 324

損失函數設計

其實就是交叉熵

正例和負例的定義
訓練時, 與正例對應的 gt-box 定義為與該 region proposal 有具有最大 IOU 值的 gt-box, 且 IOU 值要大於等於0.5, 與任何 gt-box 的 IOU 值都小於 [0.1, 0.5) 的設置為負例, 小於0.1的做 hard example mining. 正例和負例的樣本比例大於為 1:3
Truncated SVD
對於圖像分類來說,與卷積層計算量相比,計算全連接層的計算量很少。而對於 Fast R-CNN 檢測架構來說,對於一張圖片, 我們只需要進行一次前向推導進行特征提取, 而 RoI 池化層之后的全連接層的計算需要進行多次, 這是由於對於一張圖片, 需要處理 RoI 的數量很大,比如論文中, 輸入 batch 為
2, 隨機提取 128 個 RoI, 即每張圖片 64 個 RoI, 即一張圖片檢測過程中, RoI 池化層之前的計算只需要一次, RoI 池化層之后的計算進行 64 次. 實驗證明(如下圖) 有 近一半 的正向傳播時間用於計算全連接層。 通 Truncated SVD 分解, 可以很容易地加速全連接層的計算。

Fast RCNN 算法的尺度不變性(Scale invariance)
我們采用兩種策略實現尺度不變目標檢測, 方法如下
方法1: 暴力學習(brute learning), 只輸入單尺度, 通過讓網絡自己學習目標的尺度不變性
方法2: 使用圖像金字塔(image pyramids), 提供多尺度輸入
定義圖片的 scale 為它的最短邊的長度(最長邊不超過1000, 寬高比保持不變), 論文中這里
1 scale [600]
5 scale [480, 576, 688, 864, 1200]
PASCAL 圖片平均大小 384x473, 單 scale 方案需要上采樣倍數約為(upsample)1.6, 那么Faster RCNN VGG16 有效的平均步長約為 16/1.6=10 pixels

從上圖可知, Faster RCNN 驗證了 SPPNet 論文中的觀測現象, 單尺度檢測的性能幾乎和多尺度檢測性能一樣好(其實還是好了不少, ~1.2%mAP, 就是計算量開銷太大, 不太值得, 特別是在深度模型下, 單尺度檢測在性能和速度上取得了很好的權衡). \(\color{red}{說明深度 \text{ConvNet} 擅長於學習尺度不變性.}\)
那些層需要微調?
那么所有的卷積層都需要微調嗎?
簡而言之, 不需要微調所有的卷積層; 在較小的網絡中,我們發現第一層卷積層是通用的,與任務無關, 是否微調第一層卷積層對於檢測任務的 mAP 沒有影響, 而且我們發現微調的卷積層越淺, 對 mAP 的貢獻越小, Faster R-CNN VGG16 從第三層卷積層(conv3)開始微調, 而且訓練 RoI 池化層之前的卷積層很重要

從越淺層開始微調, 需要訓練的時間越長.
multi-task training

RPN
RPN(Region Proposal Network) 的提出, 將候選框提出過程融入卷積網絡中, 通過與檢測網絡共享特征提取網絡, 從而整個目標檢測系統是一個單一的,統一的網絡。 具體為使用 RPN 的技術代替之前候選框提出算法 Selection Search, 完成候選框(RoI)的提出, 那么 RPN 需要完成兩個任務:
- 判斷 anchors 中是否包含將要檢測的 K 類物體(是或者否), 這里只是判斷是否包含物體, 而沒有判斷到底是什么物體, 即 objectness proposal
- 提出 anchor 對應的 bounding box 的坐標, 即 region proposal
RPN 提出候選框是在輸入圖片上的坐標, 然后通過 RoI 映射投影到最后一層卷積層輸出 Feature Map 上, 那么來看看首先看看 RPN 到底由那些部分組成.
RPN 簡介
An RPN is a Fully Convolutional Network that simultaneously predicts object bounds and objectness scores at each position.
在 FRCN 中, 檢測網絡的運行時間大大減少(大約200ms), 推導時間的瓶頸就在 region proposal 上了, FRCN 使用 SS(Selective Search) 來提出候選框, SS CPU版本(無 GPU 版)執行時間大約為 2s, 相對於 FRCN 檢測網絡來說, 就慢了個數量級. 鑒於這樣一種觀察, Faster RCNN 中使用 RPN 代替 SS 進行 region proposal, 用於加快了推導速度, RPN 提出region proposal 的時間約為 0.01s, 比 SS 快了~200倍, 而且性能還要更好.
EdgeBoxes 通過在提出候選框的速度和質量上做權衡, 需要時間大約 0.2s
RPN 為全卷積網絡(FCN), rpn_cls_score 和 rpn_bbox_pred 為 1x1 卷積
rpn_conv/3x3 num output: 512
// (4個尺度的候選框, 64 128 256 512, 3中寬高比, 共12個候選框)
rpn_cls_score num output: 24 (前景概率+背景概率)x12
rpn_bbox_pred num output: 48 (四個坐標) x 12
rpn_loss_cls: SoftmaxLoss
rpn_loss_bbox: SmoothL1

RPN 輸入輸出就如下,
輸入: 整張圖片
輸出: objectness classification(前景 or 背景) + bounding box regression
\(\color{red}{\bf來說說 RPN 中關鍵概念 \space anchor}\)
anchor 定義為在最后一層共享卷積層上滑動的 3x3 卷積核的中心點, 稱該點為 anchor, 將 anchor 投影到輸入圖片上, 那么以一個 anchor 為中心,一共可以生成 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 不過卻能解決 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, 那么1000x600 的圖片就能生成大約 60x40x9≈20000個 anchor boxes). 當然列舉了這么多 anchor boxes, 這region proposal 也太粗糙啊, 總不能就這樣把這么多的質量層次不齊 anchor boxes 都送給 Fast R-CNN來檢測吧. 那該怎么剔除質量不好的呢? 這就是后面 RPN 的 bounding box regression 和 objectness classification 要解決的事情:)
有必要先說說 RPN 的 objectness cls 和 bbox regression 有什么用?
一句話就是 "少生優育"
bbox regression: 調整輸入的 anchor boxer 的坐標, 使它更接近真實值, 就是一個 bbox regression, 輸出稱為 RPN proposal, 或者 RoIs. 提高 anchor boxer 的質量
objectness cls: 一些 RPN proposal(anchor boxer經過)可能相互重疊度很高, 為了減少冗余, 通過 objectness cls 的輸出的分數 score 對這些 RPN proposal 做 NMS(non-maximum suppression), 論文中設置 \(\color{red}{threshold 為 0.7}\), 只保留 threshold < 0.7 的RPN proposal, 減少 anchor boxes 的數量
RPN 的任務是什么?
訓練 RPN 網絡來選擇那些比較好的 anchor boxes.
因為現在我們要訓練 RPN, 我們只提出了 anchor boxer, 卻不知道這些 anchor boxes是不是包含物體, 就是沒有標簽啊! 那么問題來了? objectness cls 分類器和 bbox 回歸器訓練時沒有標簽啊. 怎么辦?
辦法就是使用 gt-bbox(ground-truth bounding box) 為指標生成 lable, 注意這里我們只是檢測圖片中有沒有物體, 而不判斷是哪一類物體.
positive anchor
從 gt-box 的角度來看的話, 我們希望每一個 gt-box 至少要有一個 anchor box 來預測它, 所以首先, 我們將與這個 gt-box 有最大 IoU 值 anchor box 標記為 positive anchor; 然后, 我們將與任意一個 gt-box 的 IoU 大於等於 0.7 的 anchor box 標記為 positive anchor;
這時候我們獲得了 RPN 分類器的 label. 那么如何獲取 bbox 回歸器的 lable 呢?
在 positive anchor 中, 從 anchor-box 的角度出發, 選擇最容易預測的 gt-box 進行預測, 即選擇與該 anchor-box 具有最大 IoU 的 gt-box 進行預測(即該 gt-box 作為回歸目標); 可以看出, 一個 gt-box 可以由多個 anchor box 負責, 但是一個 anchor box 最多負責預測一個 gt-box.
(上面的邏輯是anchor_target_layer.py 代碼實現中的邏輯)
從理論角度來說, 可能還是存在 gt-box 沒有被任何一個 anchor box 預測(雖然 gt-box 與某個 anchor-box 具有最大 IoU, 但是該 anchor-box 與其他的 gt-box 有最大 IoU, 而且理論上說 可能某個 anchor box 與多個 gt-box 有最大 IoU, 那么 anchor box 只會選擇其中一個預測), 當然只是理論上, 實際上, 這要物體的重疊度不是很高, 這就不是問題, 而且 anchor box 也足夠的多.
negative anchor
與任意 gt-box 的 IOU < 0.3, 即標記為 negative anchor, 標記為 0, 即不包含物體, 是背景, 從后面的損失函數知道, 背景不參與回歸損失函數.
樣本不平衡問題
如在二分類中正負樣本比例存在較大差距,導致模型的預測偏向某一類別。如果正樣本占據1%,而負樣本占據99%,那么模型只需要對所有樣本輸出預測為負樣本,那么模型輕松可以達到99%的正確率。一般此時需使用其他度量標准來判斷模型性能。比如召回率 ReCall
RPN 網絡訓練時, 從一張圖片隨機抽取 256 個 anchor box, 其中 positive anchor, negative anchor 的比例大於為 1:1(由於 negative anchor 的數量比 positive anchor 的個數多得多, 所以如果使用全部的 anchor box, 那么損失函數就與偏向負例), 如果 positive anchor 少於 128個, 使用 negative anchor 補全到256個.
- IOU 位於 positive anchors, negative anchors 之間 anchor boxer 背景和物體摻雜, 的對於訓練目標沒有貢獻, 不使用, 標記為 -1
- RPN 中 positive anchor 閾值為 0.7, FRCN 中 positive anchor 為 0.5, 可能是由於 RPN 中大約有 20000 個 anchor boxer, 而 RPN 提出的 RoIs 為 2000 個, RPN 為了去掉更多的 bbox, 所以閾值為選擇的高一點?
損失函數設計
注意一點, 每個 regressor 只負責一個 (scale, aspect), 不與其他 regressor 共享權重, 所以需要訓練 k 個 regressor, 即對於每個 anchor box, 都會預測一組坐標, 每組包含 k 個 bounding box 坐標
其他不多說, 只貼貼公式

In our current implementation (as in the released code), the cls term in upper Eqn is normalized by the mini-batch size (i.e., N_cls = 256) and the reg term is normalized by the number of anchor locations (i.e., N_reg ∼ 2, 400(1000/16x600/26~240)). By default we set λ = 10, and thus both cls and reg terms are roughly equally weighted.



- \(p^*_i\) 為一個 batch 中的第 i 個 anchor box 的真實標簽, \(p_i\) 為分類器預測概率, 如果是 positive anchor, \(P^*_i\)為 1, 否則為 0.
- \(L_{reg}(t_i, t_i^*) = smooth_{L1}(t_i-t_i^*)\)
- \(p^*_iL_{reg}\) 表示 regression loss 只會被 positive anchor 激活.
- anchor boxes 的坐標表示為 (x, y, w ,h), (x, y) 為 box 的中心坐標.
- \(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
- NMS 不會降低檢測性能. 通過 NMS 得到 300 個 proposal的測試mAP為 55.1%, 使用top-ranked 6000個 proposal的mAP為 55.2%, 從而說明經過NMS之后的 top ranked proposal都是很精確的.
- 移除 RPN 的 classification(cls) 的話(自然沒法做 NMS, NMS 就是依據cls 來做的), 當 proposal 很少時, 精確率下降很大, N = 100 時, mAP 為44.6%, 這說明了 cls 的得分越高的 proposal 中包含物體的可能性越高.
- 移除 RPN 的 boundingbox regression(reg) 的話, mAP 下降到 52.1% 說明了多 scale, 多 aspect 的 anchor boxes 並不足以應對精確檢測, regressed box bounds 可以產生高質量的 proposals
- 對於超參 scale, aspect 敏感性如下

