Faster R-CNN:詳解目標檢測的實現過程

本文詳細解釋了 Faster R-CNN 的網絡架構和工做流,一步步帶領讀者理解目標檢測的工做原理,做者本人也提供了 Luminoth 實現,供你們參考。git

 

  • Luminoth 實現:https://github.com/tryolabs/luminoth/tree/master/luminoth/models/fasterrcnngithub

 

  去年,咱們決定深刻了解 Faster R-CNN,閱讀原始論文以及其中引用到的其餘論文,如今咱們對其工做方式和實現方法有了清晰的理解。算法

  咱們最終在 Luminoth 中實現了 Faster R-CNN,Luminoth 是基於 TensorFlow 的計算機視覺工具包,易於訓練和監控,支持多種不一樣的模型。到目前爲止,Luminoth 已經吸引了很大的關注,咱們在 ODSC Europe 和 ODSC West 的論壇中也介紹過這個項目。(ODSC,Open Data Science Conference,專一於開源數據科學的會議)。網絡

  基於開發 Luminoth 的工做和過去的報告,咱們認爲把全部實現 Faster RCNN 的細節和相關連接整合到一篇博客中是一個不錯的點子,這對將來其餘對此領域感興趣的人會頗有意義。架構

背景

  Faster R-CNN 最先在 2015 年的 NIPS 發佈。其在發佈後經歷了幾回修改,這在以後博文中會有討論。Faster-RCNN 是 RCNN 系列論文的第三次迭代,這一系列論文的一做和聯合做者是 Ross Girshick。框架

  這一切始於 2014 年的一篇論文「Rich feature hierarchies for accurate object detection and semantic segmentation」(R-CNN),其使用了稱爲 Selective Search 的算法用來提取感興趣候選區域,並用一個標準的卷積神經網絡 (CNN) 去分類和調整這些區域。Fast R-CNN 從 R-CNN 演變優化而來,Fast R-CNN 發佈於 2015 年上半年,其中一種稱爲感興趣區域池化的技術,使得網絡能夠共享計算結果,從而讓模型提速。這一系列算法最終被優化爲 Faster R-CNN,這是第一個徹底可微分的模型。機器學習

框架

  Faster R-CNN 的框架由幾個模塊部件組成,因此其框架有些複雜。咱們將從高層次的概述開始,以後會介紹不一樣組成部分的具體細節。函數

  從一張圖片開始,咱們將會獲得:工具

    • 一個邊框列表性能

    • 每一個邊框會被分配一個標籤

    • 每對標籤和邊框所對應的機率

完整的 Faster R-CNN 框架

  輸入的圖片以(長×寬×高)的張量形式表徵,以後會被饋送入預訓練好的卷積神經網絡,在中間層獲得特徵圖。使用該特徵圖做爲特徵提取器並用於下一流程。

  上述方法在遷移學習中常用,尤爲在爲小數據集訓練分類器時,其一般取用了在另外一個較大數據集訓練好的權重。咱們在下一章節會深刻了解這個部分。接着,咱們會使用到區域建議網絡(Region Proposal Network,RPN)。使用 CNN 計算獲得的特徵,去尋找到預設好數量的可能包含目標的區域 (邊框)。

  使用深度學習進行目標檢測最大的困難多是生成一個長度可變的邊框列表。使用深度神經網絡建模時,模型最後一部分一般是一個固定尺寸的張量輸出(除了循環神經網絡)。例如,在圖片分類中,輸出是 (N,) 形狀的張量,N 是類別的數量,其中在第 i 個位置標量含有該圖片屬於類別 i 的機率。

  RPN 中長度可變列表的問題可使用錨點解決:使用固定尺寸的參考邊框在原始圖片上一致地定位。不是直接探測目標在哪,而是把問題分兩個方面建模,對每一個錨點,咱們考慮:

    • 這個錨點包含相關目標嗎?

    • 如何調整錨點以更好的擬合到相關目標?

  可能會有點困擾,可是不要緊,下面會深刻了解。

  在取得一系列的相關目標和其在原始圖片上的位置後,目標探測問題就能夠相對直觀地解決了。使用 CNN 提取到的特徵和相關目標的邊框,咱們在相關目標的特徵圖上使用感興趣區域池化 (RoI Pooling),並將與目標相關的特徵信息存入一個新的張量。以後的流程與 R-CNN 模型一致,利用這些信息:

    • 對邊框內的內容分類(或者捨棄它,並用「背景」標記邊框內容)

    • 調整邊框的座標(使之更好地包含目標)

  顯然,這樣作會遺失掉部分信息,但這正是 Faster-RCNN 如何進行目標探測的基本思想。下一步,咱們會仔細討論框架、損失函數以及訓練過程當中各個組件的具體細節。

基礎網絡

  以前提到過,Faster R-CNN 第一步要使用在圖片分類任務 (例如,ImageNet) 上預訓練好的卷積神經網絡,使用該網絡獲得的中間層特徵的輸出。這對有深度學習背景的人來講很簡單,可是理解如何使用和爲何這樣作纔是關鍵,同時,可視化中間層的特徵輸出也很重要。沒有一致的意見代表哪一個網絡框架是最好的。原始的 Faster R-CNN 使用的是在 ImageNet 上預訓練的 ZF 和 VGG,但以後出現了不少不一樣的網絡,且不一樣網絡的參數數量變化很大。例如,MobileNet,以速度優先的一個小型的高效框架,大約有 330 萬個參數,而 ResNet-152(152 層),曾經的 ImageNet 圖片分類競賽優勝者,大約有 6000 萬個參數。最新的網絡結構如 DenseNet,能夠在提升準確度的同時縮減參數數量。

VGG

  在討論網絡結構孰優孰劣以前,讓咱們先以 VGG-16 爲例來嘗試理解 Faster-RCNN 是如何工做的。

VGG 網絡結構

  VGG,其名字來自於在 ImageNet ILSVRC 2014 競賽中使用此網絡的小組組名,首次發佈於論文「Very Deep Convolutional Networks for Large-Scale Image Recognition」, 做者是 Karen Simonyan 和 Andrew Zisserman。以今天的標準來看這個網絡談不上深度,可是在發佈之際 VGG16 比當時經常使用的網絡要多一倍的層數,其推進了「深度 → 更強大性能 → 更好結果」的浪潮(只要訓練是可行的)。

  當使用 VGG 進行分類任務時,其輸入是 224×224×3 的張量 (表示一個 224×224 像素大小的 RGB 圖片)。在分類任務中輸入圖片的尺寸是固定的,由於網絡最後一部分的全鏈接層須要固定長度的輸入。在接入全鏈接層前,一般要將最後一層卷積的輸出展開成一維張量。

  由於要使用卷積網絡中間層的輸出,因此輸入圖片的尺寸再也不有限制。至少,在這個模塊中再也不是問題,由於只有卷積層參與計算。讓咱們深刻了解一下底層的細節,看看具體要使用哪一層卷積網絡的輸出。Faster R-CNN 論文中沒有具體指定使用哪一層;可是在官方的實現中能夠觀察到,做者使用的是 conv5/conv5_1 這一層 (caffe 代碼)。

  每一層卷積網絡都在前一層的信息基礎上提取更加抽象的特徵。第一層一般學習到簡單的邊緣,第二層尋找目標邊緣的模式,以激活後續卷積網絡中更加複雜的形狀。最終,咱們獲得一個在空間維度上比原始圖片小不少,但表徵更深的卷積特徵圖。特徵圖的長和寬會隨着卷積層間的池化而縮小,深度會隨着卷積層濾波器的數量而增長。

從圖片到卷積特徵圖

  卷積特徵圖將圖片的全部信息編碼到深度的維度上,同時保留着原始圖片上目標物體的相對位置信息。例如,若是圖片左上角有一個紅色矩形,通過卷積層的激活,那麼紅色矩形的位置信息仍然保留在卷積特徵圖的左上角。

VGG vs ResNet

  現在,ResNet 已經取代大多數 VGG 網絡做爲提取特徵的基礎框架。Faster-RCNN 的三位聯合做者 (Kaiming He, Shaoqing Ren 和 Jian Sun) 也是論文「Deep Residual Learning for Image Recognition」的做者,這篇論文最初介紹了 ResNets 這一框架。

  ResNet 對比 VGG 的優點在於它是一個更深層、大型的網絡,所以有更大的容量去學習所須要的信息。這些結論在圖片分類任務中可行,在目標探測的問題中也應該一樣有效。

  ResNet 在使用殘差鏈接和批歸一化的方法後更加易於訓練,這些方法在 VGG 發佈的時候尚未出現。

錨點

  如今,咱們將使用處理事後的特徵圖並建議目標區域,也就是用於分類任務的感興趣區域。以前提到過錨點是解決長度可變問題的一種方法,如今將詳細介紹。

  咱們的目標是尋找圖片中的邊框。這些邊框是不一樣尺寸、不一樣比例的矩形。設想咱們在解決問題前已知圖片中有兩個目標。那麼首先想到的應該是訓練一個網絡,這個網絡能夠返回 8 個值:包含(xmin, ymin, xmax, ymax)的兩個元組,每一個元組都用於定義一個目標的邊框座標。這個方法有着根本問題,例如,圖片多是不一樣尺寸和比例的,所以訓練一個能夠直接準確預測原始座標的模型是很複雜的。另外一個問題是無效預測:當預測(xmin,xmax)和(ymin,ymax)時,應該強制設定 xmin 要小於 xmax,ymin 要小於 ymax。

  另外一種更加簡單的方法是去預測參考邊框的偏移量。使用參考邊框(xcenter, ycenter, width, height),學習預測偏移量(Δxcenter,Δycenter,Δwidth,Δheight),所以咱們只獲得一些小數值的預測結果並挪動參考變量就能夠達到更好的擬合結果。

  錨點是用固定的邊框置於不一樣尺寸和比例的圖片上,而且在以後目標位置的預測中用做參考邊框。

  咱們在處理的卷積特徵圖的尺寸分別是 conv_width×conv_height×conv_depth,所以在卷積圖的 conv_width×conv_height 上每個點都生成一組錨點。很重要的一點是即便咱們是在特徵圖上生成的錨點,這些錨點最終是要映射回原始圖片的尺寸。

  由於咱們只用到了卷積和池化層,因此特徵圖的最終維度與原始圖片是呈比例的。數學上,若是圖片的尺寸是 w×h,那麼特徵圖最終會縮小到尺寸爲 w/r 和 h/r,其中 r 是次級採樣率。若是咱們在特徵圖上每一個空間位置上都定義一個錨點,那麼最終圖片的錨點會相隔 r 個像素,在 VGG 中,r=16。

原始圖片的錨點中心

  爲了選擇一組合適錨點,咱們一般定義一組固定尺寸 (例如,64px、128px、256px,此處爲邊框大小) 和比例 (例如,0.五、一、1.5,此處爲邊框長寬比) 的邊框,使用這些變量的全部可能組合獲得候選邊框 (這個例子中有 1 個錨點和 9 個邊框)。

左側:錨點、中心:特徵圖空間單一錨點在原圖中的表達,右側:全部錨點在原圖中的表達

區域建議網絡

RPN 採用卷積特徵圖並在圖像上生成建議

  像咱們以前提到的那樣,RPN 接受全部的參考框(錨點)併爲目標輸出一套好的建議。它經過爲每一個錨點提供兩個不一樣的輸出來完成。

  第一個輸出是錨點做爲目標的機率。若是你願意,能夠叫作「目標性得分」。注意,RPN 不關心目標的類別,只在乎它其實是不是一個目標(而不是背景)。咱們將用這個目標性得分來過濾掉很差的預測,爲第二階段作準備。第二個輸出是邊框迴歸,用於調整錨點以更好的擬合其預測的目標。

  RPN 是用徹底卷積的方式高效實現的,用基礎網絡返回的卷積特徵圖做爲輸入。首先,咱們使用一個有 512 個通道和 3x3 卷積核大小的卷積層,而後咱們有兩個使用 1x1 卷積核的並行卷積層,其通道數量取決於每一個點的錨點數量。

RPN 架構的卷積實現,其中 k 是錨點的數量

  對於分類層,咱們對每一個錨點輸出兩個預測值:它是背景(不是目標)的分數,和它是前景(實際的目標)的分數。

  對於迴歸或邊框調整層,咱們輸出四個預測值:Δxcenter、Δycenter、Δwidth、Δheight,咱們將會把這些值用到錨點中來獲得最終的建議。

  使用最終的建議座標和它們的目標性得分,而後能夠獲得一套很好的對於目標的建議。

訓練、目標和損失函數

  RPN 執行兩種不一樣類型的預測:二進制分類邊框迴歸調整。爲了訓練,咱們把全部的錨 anchor box 分紅兩類。一類是「前景」,它與真實目標重疊而且其 IoU(Intersection of Union)值大於 0.5;另外一類是「背景」,它不與任何真實目標重疊或與真實目標的 IoU 值 小於 0.1。

  而後,咱們對這些錨點隨機採樣,構成大小爲 256 的 mini batch (維持前景錨點和背景錨點之間的平衡比例)。

  RPN 用全部以 mini batch 篩選出來的 anchor box 和二進制交叉熵(binary cross entropy)來計算分類損失。而後它只用那些標記爲前景的 mini batch 錨點來計算迴歸損失。爲了計算迴歸的目標,咱們使用前景 anchor box 和最接近的真實目標,並計算將 anchor box 轉化爲目標所需的正確 Δ。(由於不須要考慮其類別)

  論文中建議使用 Smooth L1 loss 來計算迴歸偏差,而不是用簡單的 L1 或 L2 loss。Smooth L1 基本上就是 L1,可是當 L1 的偏差足夠小,由肯定的 σ 定義時,能夠認爲偏差幾乎是正確的且損失以更快的速率減少。

  使用 dynamic batches 是具備挑戰性的,這裏的緣由不少。即便咱們試圖維持前景錨點和背景錨點之間的平衡比例,但這並不老是可能的。根據圖像上的真實目標以及錨點的大小和比例,可能會獲得零前景錨點。在這種狀況下,咱們轉而使用對於真實框具備最大 IoU 值的錨點。這遠非理想狀況,可是爲了老是有前景樣本和目標能夠學習,這仍是挺實用的。

後處理

  非極大抑制(Non-maximum suppression):因爲錨點常常重疊,所以建議最終也會在同一個目標上重疊。爲了解決重複建議的問題,咱們使用一個簡單的算法,稱爲非極大抑制(NMS)。NMS 獲取按照分數排序的建議列表並對已排序的列表進行迭代,丟棄那些 IoU 值大於某個預約義閾值的建議,並提出一個具備更高分數的建議。

  雖然這看起來很簡單,但對 IoU 的閾值設定必定要很是當心。過低,你可能會丟失對目標的建議;過高,你可能會獲得對同一個目標的不少建議。經常使用值是 0.6

  建議選擇:應用 NMS 後,咱們保留評分最高的 N 個建議。論文中使用 N=2000,可是將這個數字下降到 50 仍然能夠獲得至關好的結果。

獨立應用程序

  RPN 能夠獨立使用,而不須要第二階段的模型。在只有一類對象的問題中,目標性機率能夠用做最終的類別機率。這是由於在這種狀況下,「前景」=「目標類別」以及「背景」=「不是目標類別」。

  一些從獨立使用 RPN 中受益的機器學習問題的例子包括流行的(但仍然是具備挑戰性的)人臉檢測和文本檢測。

  僅使用 RPN 的優勢之一是訓練和預測的速度都有所提升。因爲 RPN 是一個很是簡單的僅使用卷積層的網絡,因此預測時間比使用分類基礎網絡更快。

興趣區域池化

  在 RPN 步驟以後,咱們有不少沒有分配類別的目標建議。咱們接下來要解決的問題就是如何將這些邊框分類到咱們想要的類別中。

最簡單的方法是採用每一個建議,裁剪出來,而後讓它經過預訓練的基礎網絡。而後,咱們能夠用提取的特徵做爲基礎圖像分類器的輸入。這種方法的主要問題是運行全部 2000 個建議的計算效率和速度都是很是低的。

  Faster R-CNN 試圖經過複用現有的卷積特徵圖來解決或至少緩解這個問題。這是經過用興趣區域池化爲每一個建議提取固定大小的特徵圖實現的。R-CNN 須要固定大小的特徵圖,以便將它們分類到固定數量的類別中。

興趣區域池化

  一種更簡單的方法(被包括 Luminoth 版本的 Faster R-CNN 在內的目標檢測實現方法所普遍使用),是用每一個建議來裁剪卷積特徵圖,而後用插值(一般是雙線性的)將每一個裁剪調整爲固定大小(14×14×convdepth)。裁剪以後,用 2x2 核大小的最大池化來得到每一個建議最終的 7×7×convdepth 特徵圖。

  選擇這些確切形狀的緣由與下一模塊(R-CNN)如何使用它有關,這些設定是根據第二階段的用途獲得的。

基於區域的卷積神經網絡

  基於區域的卷積神經網絡(R-CNN)是 Faster R-CNN 工做流的最後一步。從圖像上得到卷積特徵圖以後,用它經過 RPN 來得到目標建議並最終爲每一個建議提取特徵(經過 RoI Pooling),最後咱們須要使用這些特徵進行分類。R-CNN 試圖模仿分類 CNNs 的最後階段,在這個階段用一個全鏈接層爲每一個可能的目標類輸出一個分數。

  R-CNN 有兩個不一樣的目標:

    1. 將建議分到一個類中,加上一個背景類(用於刪除很差的建議)。

    2. 根據預測的類別更好地調整建議的邊框。

  在最初的 Faster R-CNN 論文中,R-CNN 對每一個建議採用特徵圖,將它平坦化並使用兩個大小爲 4096 的有 ReLU 激活函數的全鏈接層。

  而後,它對每一個不一樣的目標使用兩種不一樣的全鏈接層:

    • 一個有 N+1 個單元的全鏈接層,其中 N 是類的總數,另一個是背景類。

    • 一個有 4N 個單元的全鏈接層。咱們但願有一個迴歸預測,所以對 N 個類別中的每個可能的類別,咱們都須要 Δcenterx、Δcentery、Δwidth、Δheight。

R-CNN 架構

訓練和目標

  R-CNN 的目標與 RPN 的目標的計算方法幾乎相同,可是考慮的是不一樣的可能類別。咱們採用建議和真實邊框,並計算它們之間的 IoU。

  那些有任何真實邊框的建議,只要其 IoU 大於 0.5,都被分配給那個真實數據。那些 IoU 在 0.1 和 0.5 之間的被標記爲背景。與咱們在爲 RPN 分配目標時相反的是,咱們忽略了沒有任何交集的建議。這是由於在這個階段,咱們假設已經有好的建議而且咱們對解決更困難的狀況更有興趣。固然,這些全部的值都是能夠爲了更好的擬合你想找的目標類型而作調整的超參數。

  邊框迴歸的目標是計算建議和與其對應的真實框之間的偏移量,僅針對那些基於 IoU 閾值分配了類別的建議。

  咱們隨機抽樣了一個尺寸爲 64 的 balanced mini batch,其中咱們有高達 25% 的前景建議(有類別)和 75% 的背景。

  按照咱們對 RPN 損失所作的相同處理方式,如今的分類損失是一個多類別的交叉熵損失,使用全部選定的建議和用於與真實框匹配的 25% 建議的 Smooth L1 loss。因爲 R-CNN 邊框迴歸的全鏈接網絡的輸出對於每一個類都有一個預測,因此當咱們獲得這種損失時必須當心。在計算損失時,咱們只須要考慮正確的類。

後處理

  與 RPN 類似,咱們最終獲得了不少已經分配了類別的目標,在返回它們以前須要進一步處理。

  爲了實施邊框調整,咱們必須考慮哪一個類別具備對該建議的最高几率。咱們也須要忽略具備最高几率的背景類的建議。

  在獲得最終目標和忽略被預測爲背景的目標以後,咱們應用基於類的 NMS。這經過按類進行分組完成,經過幾率對其排序,而後將 NMS 應用於每一個獨立的組。

  對於咱們最後的目標列表,咱們也能夠設置一個機率閾值而且對每一個類限制目標的數量。

訓練

  在最初的論文中,Faster R-CNN 是用多步法訓練的,獨立地訓練各部分而且在應用最終的全面訓練方法以前合併訓練的權重。以後,人們發現進行端到端的聯合訓練會帶來更好的結果。

  把完整的模型放在一塊兒後,咱們獲得 4 個不一樣的損失,兩個用於 RPN,另外兩個用於 R-CNN。咱們在 RPN 和 R-CNN 中有可訓練的層,咱們也有能夠訓練(微調)或不能訓練的基礎網絡。

  是否訓練基礎網絡的決定取決於咱們想要學習的目標特性和可用的計算能力。若是咱們想檢測與在原始數據集(用於訓練基礎網絡)上的數據類似的目標,那麼除了嘗試壓縮咱們能得到的全部可能的性能外,其餘作法都是沒有必要的。另外一方面,爲了擬合完整的梯度,訓練基礎網絡在時間和必要的硬件上都是昂貴的。

  用加權和將四種不一樣的損失組合起來。這是由於相對於迴歸損失,咱們可能但願給分類損失更大的權重,或者相比於 RPN 可能給 R-CNN 損失更大的權重。

  除了常規的損失以外,咱們也有正則化損失,爲了簡潔起見,咱們能夠跳過這部分,可是它們在 RPN 和 R-CNN 中均可以定義。咱們用 L2 正則化一些層。根據正在使用哪一個基礎網絡,以及若是它通過訓練,也有可能進行正則化。

  咱們用隨機梯度降低的動量算法訓練,將動量值設置爲 0.9。你能夠輕鬆的用其餘任何優化方法訓練 Faster R-CNN,而不會遇到任何大問題。

  學習率從 0.001 開始,而後在 50K 步後降低到 0.0001。這是一般最重要的超參數之一。當用 Luminoth 訓練時,咱們常常從默認值開始,並以此開始作調整。

評估

  在一些特定的 IoU 閾值下,使用標準平均精度均值(mAP)來完成評估(例如,mAP@0.5)。mAP 是源於信息檢索的度量標準,而且經常使用於計算排序問題中的偏差和評估目標檢測問題。

  咱們不會深刻討論細節,由於這些類型的度量標準值得用一篇完整博客來總結,但重要的是,當你錯過了你應該檢測到的框,以及當你發現一些不存在的東西或屢次檢測到相同的東西時,mAP 會對此進行懲罰。

結論

  到目前爲止,你應該清楚 Faster R-CNN 的工做方式、設計目的以及如何針對特定的狀況進行調整。若是你想更深刻的瞭解它的工做原理,你應該看看 Luminoth 的實現。

  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/

相關文章
相關標籤/搜索