詳解目標檢測Faster R-CNN

目標檢測的一般結構:

詳解目標檢測Faster R-CNN

背景

R-CNN - 是 Faster R-CNN 的啟發版本. R-CNN 是採用 Selective Search算法來提取(propose)可能的 RoIs(regions of interest) 區域,然後對每個提取區域採用標準 CNN 進行分類。

出現於2015年早期的Fast R-CNN 是 R-CNN 的改進,其採用興趣區域池化(Region of Interest Pooling,RoI Pooling) 來共享計算量較大的部分,提高模型的效率.

Faster R-CNN隨後被提出,其是第一個完全可微分的模型. 是 R-CNN 論文的第三個版本。

網絡結構

Faster R-CNN 的結構是複雜的,因為其有幾個移動部件。這裡先對整體框架宏觀介紹,然後再對每個部分的細節分析。

問題描述:

針對一張圖片,需要獲得的輸出有:

  • 邊界框(bounding boxes) 列表
  • 每個邊界框的類別標籤
  • 每個邊界框和類別標籤的概率
詳解目標檢測Faster R-CNN

Faster R-CNN 結構

首先,輸入圖片表示為 Height×Width×Depth 的張量(多維數組)形式,經過預訓練 CNN 模型的處理,得到卷積特徵圖(conv feature map). 即,將 CNN 作為特徵提取器,送入下一個部分.

這種技術在遷移學習(Transfer Learning)中比較普遍,尤其是,採用在大規模數據集訓練的網絡權重,來對小規模數據集訓練分類器。

然後,RPN(Region Propose Network) 對提取的卷積特徵圖進行處理。RPN 用於尋找可能包含 objects 的預定義數量的區域(regions,邊界框).

基於深度學習的目標檢測中,可能最難的問題就是生成長度不定(variable-length)的邊界框列表。在構建深度神經網絡時,最後的網絡輸出一般是固定尺寸的張量輸出(採用RNN的除外)。例如,在圖片分類中,網絡輸出是 (N,) 的張量,N 是類別標籤數,張量的每個位置的標量值表示圖片是類別i的概率值.

在 RPN 中,通過採用 anchors 來解決邊界框列表長度不定的問題,即,在原始圖像中統一放置固定大小的參考邊界框。不同於直接檢測 objects 的位置,這裡將問題轉化為兩部分:

對每一個 anchor 而言,

  • anchor 是否包含相關的 object?
  • 如何調整 anchor 以更好的擬合相關的 object?

這裡可能不容易理解,後面會深入介紹。

當獲得了可能的相關objects 和其在原始圖像中的對應位置之後,問題就更加直接了. 採用 CNN 提取的特徵和包含相關 objects 的邊界框,採用 RoI Pooling 處理,並提取相關 object 的特徵,得到一個新的向量.

最後,基於 R-CNN 模塊,得到:

  • 對邊界框內的內容進行分類,(或丟棄邊界框,採用 background 作為一個 label)
  • 調整邊界框座標,以更好的使用 object

顯而易見,上面忽略了一些重要的細節信息。 但,包括了 Faster R-CNN 的大致思想。

下面對網絡結構和每個部分的訓練及loss 進行詳細說明.

基礎網絡

正如上面所說,Faster R-CNN 第一步是採用基於分類任務(如,ImageNet)的 CNN 模型作為特徵提取器. 聽起來是比較簡單的,但,重要的是理解其如何工作和為什麼會有效,並可視化中間層,查看其輸出形式。

網絡結構很難說哪種是最好的。Faster R-CNN 最早是採用在 ImageNet訓練的ZF和VGG,其後出現了很多其它權重不同的網絡. MobileNet 是一種小型效率高的網絡結構,僅有 3.3M 參數;而ResNet-152 的參數量達到了60M. 新網絡結構DenseNet 在提高了結果的同時,降低了參數數量。

VGG

在討論網絡結構孰優孰劣之前,這裡以 VGG16 為例。

詳解目標檢測Faster R-CNN

VGG16 網絡結構

VGG16 是 ImageNet ILSVRC 2014 競賽的模型,其是由 Karen Simonyan 和 Andrew Zisserman 發表在論文 Very Deep Convolutional Networks for Large-Scale Image Recognition 上.

今天來看,VGG16 網絡結構是不算深的,但在當時,其將網絡層比常用的網絡結構擴展了兩倍,開始了 "deeper→more capacity→better"的網絡結構設計方向(在訓練允許的情況)。

VGG16 圖片分類時,輸入為 224×224×3 的張量(一張 224×224 像素的 RGB 圖片). 網絡結構最後採用 FC 層(而不是 Conv 層)得到固定長度的向量,以進行圖片分類。對最後一個卷積層的輸出拉伸為rank 1的張量,然後送入 FC 層。

由於 Faster R-CNN 是採用 VGG16 的中間卷積層的輸出,因此,不用關心輸入的尺寸. 而且,該模塊僅利用了卷積層. 進一步去分析模塊所使用的哪一層卷積層. 論文中沒有指定所使用的卷積層,但在官方實現中是採用的卷積層 conv5/conv5_1 的輸出.

每個卷積層利用前面網絡信息來生成抽象描述. 第一層一般學習邊緣edges信息,第二層學習邊緣edges中的圖案patterns,以學習更復雜的形狀等信息. 最終,可以得到卷積特徵圖,其空間維度(分辨率)比原圖小了很多,但更深. 特徵圖的 width 和 height 由於卷積層間的池化層而降低,而 depth 由於卷積層學習的 filters 數量而增加.

詳解目標檢測Faster R-CNN

圖像到卷積特徵圖

在 depth 上,卷積特徵圖對圖片的所有信息進行了編碼,同時保持相對於原始圖片所編碼"things"的位置. 例如,如果在圖片的左上角存在一個紅色正方形,而且卷積層有激活響應,那麼該紅色正方形的信息被卷積層編碼後,仍在卷積特徵圖的左上角.

VGG vs ResNet

ResNet 結構逐漸取代 VGG 作為基礎網絡,用於提取特徵。 Faster R-CNN 的共同作者也是 ResNet 網絡結構論文 Deep Residual Learning for Image Recognition 的共同作者。

ResNet 相對於 VGG 的明顯優勢是,網絡更大,因此具有更強的學習能力。這對於分類任務是重要的,在目標檢測中也如此。

另外,ResNet 採用殘差連接(residual connection) 和 BN (batch normalization) 使得深度模型的訓練比較容易. 這對於 VGG 首次提出的時候沒有出現.

Anchors

在獲得了處理後的圖片後,需要尋找 proposals,如用於分類的 RoIs(regions of interest). anchors 是用來解決長度不定問題的.

目標是尋找圖片中的邊界框bounding boxes,邊界框是具有不同尺寸sizes和長寬比aspect ratios 的矩形.

假設,已經知道圖片中有兩個 objects,首先想到的是,訓練一個網絡,輸出 8 個值:兩對元組 xmin,ymin,xmax,ymax,分別定義了每個 object 的邊界框. 這種方法存在一些基本問題. 例如,當圖片的尺寸和長寬比不一致時,良好訓練模型來預測,會非常複雜. 另一個問題是無效預測:預測 xmin和 xmax 時,需要保證 xmin

事實上,有一種更加簡單的方法來預測 objects 的邊界框,即,學習相對於參考boxes 的偏移量. 假設參考 box:xcenter,ycenter,width,height,待預測量 Δxcenter、Δycenter、Δwidth、Δheight,一般都是很小的值,以調整參考 box 更好的擬合所需要的.

Anchors 是固定尺寸的邊界框,是通過利用不同的尺寸和比例在圖片上放置得到的 boxes,並作為第一次預測 object 位置的參考 boxes.

因為是對提取的 Convwidth×Convheight×ConvDepth 卷積特徵圖進行處理,因此,在 Convwidth×Convheight 的每個點創建 anchors. 需要理解的是,雖然 anchors 是基於卷積特徵圖定義的,但最終的 anchos 是相對於原始圖片的.

由於只有卷積層和 pooling 層,特徵圖的維度是與原始圖片的尺寸成比例關係的. 即,數學地表述,如果圖片尺寸 w×h,特徵圖的尺寸則是 w/r×h/r. 其中,r 是下采樣率(subsampling ratio). 如果在卷積特徵圖空間位置定義 anchor,則最終的圖片會是由 r 像素劃分的 anchors 集. 在 VGG 中,r=16.

詳解目標檢測Faster R-CNN

原始圖片上的 Anchor Centers

為了選擇 anchors 集,一般是先定義許多不同尺寸(如,64px,128px,256px等)和boxes 長寬比(如,0.5,1,1.5等),並使用所有可能的尺寸和比例組合.

詳解目標檢測Faster R-CNN

左:Anchors;中:單個點的 Anchor;右:全部Anchors

RPN - Region Proposal Network

詳解目標檢測Faster R-CNN

RPN 結構 - RPN 輸入是卷積特徵圖,輸出圖片生成的 proposals

RPN 利用所有的參考 boxes(anchors),輸出一系列 objecs 的良好的 proposals. 針對每個 anchor,都有兩個不同的輸出:

  • anchor 內是某個 object 的概率.

RPN 不關注於 anchor 是某個 object class,只是確定其可能是一個 object (而不是背景background). 即: RPN 不關心 object 類別,只確定是 object 還是 background。

利用 object score,去濾出將要用於第二階段的效果不佳的 boxes.

  • anchor 邊界框迴歸輸出

邊界框的輸出用於調整 anchors 來更好的擬合預測的 object.

RPN 是全卷積(full conv) 網絡,其採用基礎網絡輸出的卷積特徵圖作為輸入. 首先,採用 512 channel,3×3 kernel 的卷積層,然後是兩個並行的 1×1 kernel 的卷積層,該卷積層的 channels 數量取決每個點的 anchors 的數量.

詳解目標檢測Faster R-CNN

RPN 結構的全卷積實現,k 是 anchors 數量

對於分類層,每個 anchor 輸出兩個預測值:anchor 是背景(background,非object)的 score 和 anchor 是前景(foreground,object) 的 score。

對於迴歸層,也可以叫邊界框調整層,每個 anchor 輸出 4 個預測值:Δxcenter、Δycenter、Δwidth、Δheight,即用於 anchors 來得到最終的 proposals。

根據最終的 proposal 座標和其對應的 objectness score,即可得到良好的 objects proposals.

訓練、目標和損失函數

RPN 有兩種類型的預測值輸出:二值分類和邊界框迴歸調整。

訓練時,對所有的 anchors 分類為兩種類別. 與 ground-truth object 邊界框的IoU(Intersection over Union) 大於 0.5 的 anchors 作為 foreground;小於 0.1 的作為 background.

然後,隨機採樣 anchors 來生成batchsize=256 的 mini-batch,儘可能的保持 foreground 和 background anchors 的比例平衡.

RPN 對 mini-batch 內的所有 anchors 採用 來計算分類 loss. 然後,只對 mini-batch 內標記為 foreground 的 anchros 計算迴歸 loss. 為了計算迴歸的目標targets,根據 foreground anchor 和其最接近的 groundtruth object,計算將 anchor 變換到 object groundtruth 的偏移值 correct Δ.

沒有采用簡單的 L1 或 L2 loss 用於迴歸誤差,而是採用 Smooth L1 loss. Smooth L1 和 L1 基本相同,但是,當 L1 誤差值非常小時,表示為一個確定值 σ, 即認為是接近正確的,loss 就會以更快的速度消失.

採用動態 batches 是很有挑戰性的. 即使已經嘗試保持 background 和 foreground 的 anchors 的平衡比例,也不總是可行的. 根據圖片中 groundtruth objects 和 anchors 的尺度與比例,很有可能得不到 foreground anchors. 這種情況時,將採用與 groundtruth boxes 具有最大 IoU 的 anchors. 這與理想情況相差很遠,但實際中一般總能有 foreground 樣本和要學習目標.

4.2. 後處理

  • 非極大值抑制(Non-maximum suppression)

由於 Anchors 一般是有重疊的overlap,因此,相同 object 的 proposals 也存在重疊.

為了解決重疊 proposals 問題,採用 NMS 算法處理,丟棄與一個score 更高的 proposal 間 IoU 大於預設閾值的 proposals.

雖然 NMS 看起來比較簡單,但 IoU 閾值的預設需要謹慎處理. 如果 IoU 值太小,可能丟失 objetcs 的一些 proposals;如果 IoU 值過大,可能會導致 objects 出現很多 proposals. IoU 典型值為 0.6.

  • Proposal 選擇

NMS 處理後,根據 sore 對 topN 個 proposals 排序. 在 論文中 N=2000,其值也可以小一點,如 50,仍然能的高好的結果.

單獨應用 RPN

RPN 可以獨立使用,不用 2-stage 模型.

當處理的問題是,單個 object 類時,objectness 概率即可作為最終的類別概率. 此時,"foreground" = "single class","background"="not single class"。

可以應用於人臉檢測(face detection),文字檢測(text detection),等。

僅單獨採用 RPN 的優點在於,訓練和測試速度較快. 由於 RPN 是僅有卷積層的簡單網絡,其預測效率比採用分類 base 網絡的效率高。

RoI Pooling

RPN 處理後,可以得到一堆沒有 class score 的 object proposals。

待處理問題為,如何利用這些邊界框 bounding boxes,並分類。

一種最簡單的方法是,對每個 porposal,裁剪,並送入pre-trained base 網絡,提取特徵;然後,將提取特徵來訓練分類器. 但,這就需要對所有的 2000 個 proposals 進行計算,效率低,速度慢。

則通過重用卷積特徵圖(conv feature map) 來加快計算效率. 即,採用 RoI(region of interest) Pooling 對每個 proposal 提取固定尺寸的特徵圖. R-CNN 是對固定尺寸的特徵圖分類。

詳解目標檢測Faster R-CNN

RoI Pooling

目標檢測中,包括 Faster R-CNN,常用一種更簡單的方法,即:採用每個 proposal 來對卷積特徵圖裁剪crop,然後利用插值算法(一般為雙線性插值 bilinear)將每個 crop resize 到固定尺寸 14×14×ConvDepth. 裁剪後,利用 2×2 kernel 的 Max Pooling 得到每個 proposal 的最終 7×7×ConvDepth 特徵圖。

之所以選擇該精確形狀,與其在下面的模塊(R-CNN)中的應用有關.。

R-CNN – Region-based CNN

R-CNN是Faster R-CNN 框架中的最後一個步驟.

  • 計算圖片的卷積特徵圖conv feature map;
  • 然後採用 RPN 對卷積特徵圖處理,得到 object proposals;
  • 再利用 RoI Pooling 對每個 proposal 提取特徵;
  • 最後,利用提取特徵進行分類

R-CNN 是模仿分類 CNNs 的最後一個階段,採用全連接層來輸出每個可能的 object 類別class 的score。

R-CNN 有兩個不同的輸出:

  • 對每個 proposal 分類,其中類別包括一個 background 類(用於去除不良 proposals)
  • 根據預測的類別class,更好的調整 proposal 邊界框

在 論文中,R-CNN 對每個 proposal 的特徵圖,拉平flatten,並採用 ReLU 和兩個大小為 4096 維的全連接層進行處理.

然後,對每個不同 objects 採用兩個不同的全連接層處理:

  • 一個全連接層有 N+1 個神經單元,其中 N 是類別 class 的總數,包括 background class
  • 一個全連接層有 4N 個神經單元. 迴歸預測輸出,得到 N 個可能的類別classes 分別預測 Δcenterx,Δcentery,Δwidth,Δheight
詳解目標檢測Faster R-CNN

R-CNN 結構

訓練和目標

R-CNN 的目標基本上是與 RPN 目標的計算是一致的,但需要考慮不同的可能的 object 類別 classes。

根據 proposals 和 ground-truth boxes,計算其 IoU。

與任何一個 ground-truth box 的 IoU 大於 0.5 的 proposals 被設為正確的 boxes. IoU 在 0.1 到 0.5 之間時設為 background。

與 RPN 中目標組裝相關,這裡忽略沒有任何交叉的 proposals. 這是因為,在此階段,假設已經獲得良好的 proposals,主要關注於解決難例. 當然,所有的這些超參數都是可以用於調整以更好的擬合 objects。

邊界框迴歸的目標計算的是 proposal 與其對應的 ground-truth間的偏移量,只對基於 IoU 閾值設定類別class 後的 proposals 進行計算。

隨機採用一個平衡化的 mini-batch=64,其中,25% 的 foreground proposals(具有類別class) 和 75% 的background proposals。

類似於 RPNs 的 losses,對於選定的 proposals,分類 loss 採用 multiclass entropy loss;對於 25% 的 foreground proposals 採用 SmoothL1 loss 計算其與 groundtruth box 的匹配.

由於 R-CNN 全連接網絡對每個類別class 僅輸出一個預測值,當計算邊框迴歸loss 時需謹慎.當計算 loss 時,只需考慮正確的類別。

後處理

類似於 RPN,R-CNN 最終輸出一堆帶有類別 class 的objects,在返回結果前,再進一步進行處理。

為了調整邊界框,需要考慮概率最大的類別的 proposals. 忽略概率最大值為 background class 的proposals。

當得到最終的 objects 時,並忽略被預測為 background 的結果,採用 class-based NMS. 主要是通過對 objects 根據類別class 分組,然後根據概率排序,並對每個獨立的分組採用 NMS 處理,最後再放在一起。

最終得到的 objects 列表,仍可繼續通過設定概率閾值的方式,來限制每個類的 objects 數量。

Faster R-CNN 訓練

在論文中是採用分步 multi-step 方法,對每個模塊分別訓練再合併訓練的權重. 自此,End-to-end 的聯合訓練被發現能夠得到更好的結果.

當將完整的模型合併後,得到 4 個不同的 losses,2 個用於 RPN,2 個用於 R-CNN. RPN 和 R-CNN 的base基礎網絡可以是可訓練(fine-tune)的,也可以是不能訓練的。

base基礎網絡的訓練與否,取決於待學習的objects與可用的計算力. 如果新數據與 base基礎網絡訓練的原始數據集相似,則不必進行訓練,除非是想嘗試其不同的表現. base基礎網絡的訓練是比較時間與硬件消耗較高,需要適應梯度計算。

4 種不同的 losses 以加權和的形式組織. 可以根據需要對分類 loss 和迴歸 loss 設置權重,或者對 R-CNN 和 RPNs 設置不同權重。

採用 SGD 訓練,momentum=0.9. 學習率初始值為 0.001,50K 次迭代後衰減為 0.0001. 這是一組常用參數設置。

評價 Evaluation

評價準則:指定 IoU 閾值對應的 Mean Average Precision (mAP),如 [email protected].

mAP 來自信息檢索,常用與計算 ranking 問題的誤差計算,以及評估目標檢測結果.

總結

至此,對 Faster R-CNN 的處理方式有了清晰的理解,可以根據實際應用場合來做一些應用。

如果想進一步深入理解,可以參考 Luminoth Faster R-CNN 實現。

Faster R-CNN 可以用於解決複雜的計算機視覺問題,並取得很好的效果. 雖然這裡模型是目標檢測,但對於語義分割,3D目標檢測等,都可以基於以上模型. 或借鑑於 RPN,或借鑑於 R-CNN,或兩者都有. 因此,能夠深度理解其工作原理,對於更好的解決其它問題很有幫助。

原文:https://tryolabs.com/blog/2018/01/18/faster-r-cnn-down-the-rabbit-hole-of-modern-object-detection/


分享到:


相關文章: