Faster R-CNN: 探索當今對象檢測的兔子洞

在此之前,我們討論了對象檢測,關於它是什麼以及最近如何使用深度學習解決它。 如果您還沒有閱讀我們之前的博客文章,我們建議您在繼續之前先看一下它。(深度學習之對象檢測的概念、現狀與挑戰)

去年,我們決定涉足Faster R-CNN,閱讀原始論文和所有參考論文(以此類推),直到我們清楚地瞭解它是如何工作以及如何實現它。

我們最終在Luminoth中實施了Faster R-CNN,這是一個基於TensorFlow的計算機視覺工具包,可以輕鬆訓練,監控和使用這些類型的模型。 到目前爲止,Luminoth已經引起了極大的興趣,我們甚至在ODSC Europe和ODSC West談到了它。

基於開發Luminoth的所有工作並基於我們所做的演示,我們認爲最好有一篇博文,其中包含我們在研究中收集的所有細節和鏈接,希望能成爲對該主題感興趣的人們的未來參考。

背景

Faster R-CNN最初發佈於NIPS 2015。在發佈之後,它經歷了幾次修訂,我們稍後會討論。 正如我們在之前的博客文章中提到的,更快的R-CNN是R-CNN論文的第三次迭代 - 其中Ross Girshick是作者和合着者。

一切都始於2014年的“用於精確對象檢測和語義分割的豐富特徵層級”(R-CNN),其使用稱爲選擇性搜索的算法來提出可能的感興趣區域和使用標準卷積神經網絡(CNN)對它們進行分類和調整。 它迅速演變爲2015年初發布的Fast R-CNN,其中一種稱爲興趣區域池化的技術允許共享昂貴的計算並使模型更快。 終於推出了Faster R-CNN,其中提出了第一個完全可微分的模型。

架構

Faster R-CNN架構很複雜,因爲它有幾個移動部件。 我們將從高級概述開始,然後逐一介紹每個組件的詳細信息。

這一切都始於一幅圖像,由此我們想要獲得:

  • 邊界框列表。
  • 分配給每個邊界框的標籤。
  • 每個標籤和邊界框的概率。

Faster R-CNN完整的架構

 

輸入圖像表示爲\mathit {Height} \times \mathit {Width} \times \mathit {Depth} tensors(多維數組),它們通過預先訓練的CNN,從一箇中間層輸出,最後得到一個卷積特徵圖,我們將其用到下一部分。

該技術在轉移學習的上下文中非常常用,尤其是使用在較大數據集上訓練的網絡權重來訓練小數據集上的分類器。我們將在以下部分深入研究這一點。

接下來,我們有一個所謂的區域提議網絡(簡稱RPN)。它基於CNN提取的特徵圖,來查找預先設定數量的區域(邊界框),這些區域可能包含對象。

將深度學習(DL)用於對象檢測的最困難的問題可能是生成一個可變長度的邊界框列表。在對深度神經網絡進行建模時,最後一個塊通常是一個固定大小的張量輸出(除非使用RNN)。例如,在圖像分類中,輸出是(N,)形狀的張量,其中N是類別的數量,其中位置i中的每個標量代表該圖像屬於某個類標記的概率。

在RPN中通過使用錨點解決可變長度問題:固定大小的參考邊界框,其均勻地放置在整個原始圖像中。我們不是檢測對象的位置,而是將問題分爲兩部分。對於每個錨,我們都會問:

  • 這個錨是否包含相關對象?
  • 我們如何調整此錨以更好地適應相關對象?

這可能會讓人感到困惑,但不要擔心,我們將在下面深入討論。

在獲得一個原始圖像上的可能對象及其位置的列表後,下面的將成爲一個更直接的問題: 使用由CNN提取的特徵和具有相關對象的邊界框,我們應用感興趣區域(RoI)池化並將與對象相對應的那些特徵提取到新的張量中。

最後是R-CNN模塊,它使用該信息來實現:

  • 對邊界框中的內容進行分類(或將其丟棄,若使用“背景”作爲標籤)。
  • 調整邊界框座標(以使它更適合對象)。

顯然,缺少一些主要的信息,但這基本上是關於R-CNN如何工作的一般概念。接下來,我們將詳細介紹每個組件的體系結構和損失/訓練。

基礎網絡

如前所述,第一步是使用預訓練的CNN進行分類(例如使用ImageNet)和使用中間層的輸出。 對於具有深入學習背景的人來說,這聽起來非常簡單,但重要的是要了解它的工作原理和原因,以及可視化中間層輸出的樣子。

關於哪種網絡架構最優,這個問題沒有達成真正的共識。 最初的Faster R-CNN使用了在ImageNet上預訓練的ZF和VGG,但從那時起,有許多不同的網絡具有不同數量的權重。 例如,MobileNet是一種針對速度優化的小型高效網絡架構,具有大約3.3M的參數,而ResNet-152(152層),曾經是ImageNet分類競賽中的最先進技術,大約有60M。 最近,像DenseNet這樣的新架構既改善了結果又降低了參數數量。

VGG

在我們討論哪個更好或更糟之前,讓我們嘗試使用標準VGG-16作爲示例來理解它是如何工作的。

VGG架構

VGG的名字來源於在ImageNet ILSVRC 2014競賽中使用它的團隊,發表在Karen Simonyan和Andrew Zisserman的論文“應用非常深的卷積網絡於大規模圖像識別”中。按照今天的標準,它不會被認爲是非常深的,但是當時它通常使用的層數增加了一倍以上,並且啓動了“更深→更多容量→更好”的波浪(當可以進行訓練時)。

當使用VGG進行分類時,輸入爲 3224×224×3的張量(即224x224像素RGB圖像)。這必須保持固定以進行分類,因爲網絡的最後一塊使用全連接(FC)層(而不是卷積),這需要固定長度的輸入。這通常通過在使用FC層之前平坦化最後一個卷積層的輸出,獲得秩1張量來完成。

由於我們將使用中間卷積層的輸出,因此輸入的大小不是我們的問題。至少,這不是該模塊的問題,因爲只使用卷積層。讓我們進一步瞭解底層細節,並定義我們將要使用的卷積層。該文件沒有具體說明使用哪一層;但在官方實施中,您可以看到他們使用conv5 / conv5_1圖層的輸出。

每個卷積層基於先前信息創建抽象。第一層通常學習邊緣,第二層在邊緣找到圖案以激活更復雜的形狀等等。最終我們得到了一個卷積特徵圖,其空間尺寸比原始圖像小得多,但深度更大。由於卷積層之間應用了池化層,並且深度由於卷積層學習的過濾器數量而增加,因此特徵圖的寬度和高度減小。

從圖像輸出卷積特徵圖

 

在其深度中,卷積特徵圖已經編碼了圖像的所有信息,同時保持了它相對於原始圖像編碼的“物體”的位置。 例如,如果圖像左上方有一個紅色方塊並且卷積層爲其激活,那麼該紅色方塊的信息仍將位於卷積特徵圖的左上角。

VGG vs ResNet

如今,ResNet架構大多成爲取代VGG作爲提取特徵的基礎網絡。 Faster R-CNN(Kaiming He,Shaoqing Ren和Jian Sun)的三位合着者也是“圖像識別的深度殘差學習”的共同作者,這是描述ResNets的原始論文。

ResNet相對於VGG的明顯優勢在於它更大,因此它具備更強大的能力來實際瞭解所需內容。 這對於分類任務是正確的,並且在對象檢測的情況下應該同樣如此。

此外,ResNet使用殘差連接和批量標準化可以輕鬆訓練深度模型,這在VGG首次發佈時尚未發明。

錨 (Anchor)

當我們正工作在已處理的圖像上時,我們需要找到提議,即: 用於分類的感興趣區域。我們之前提到錨點是解決變長問題的一種方法,但我們跳過大部分解釋。

我們的目標是在圖像中找到邊界框。它們具有矩形形狀,並且可以具有不同的尺寸和縱橫比。想象一下,我們試圖解決問題,事先知道圖像上有兩個對象。首先想到的是訓練一個返回8個值的網絡:兩個x_ {min},y_ {min},x_ {max},y_ {max} 元組定義每個對象的邊界框。這種方法存在一些基本問題。例如,圖像可以具有不同的尺寸和縱橫比,訓練一個能預測原始座標的模型可能變得非常複雜(如果可能的話)。另一個問題是無效預測:當預測 x_ {min}x_{max}時,我們必須以某種方式強制 x_ {min} < x_ {max}

事實證明,通過學習預測相對參考盒的偏移,是進行邊界框預測的一種更簡單的方法。我們採用參考框 x_ {center},y_ {center},width,height 並學習預測 \Delta _ {x_ {center}}, \Delta _ {y_ {center}}, \Delta _ {width},\Delta _ {height},通常是小值,調整參考框以更好地擬合我們想要的。

錨是固定的邊界框,它們放置在整個圖像中,具有不同的尺寸和比例,在首次預測對象位置時將用於參考。

由於我們正在處理大小爲conv_ {width} \times conv_ {height} \times conv_ {depth} 的卷積特徵圖,因此我們爲 conv_ {width} \times conv_ {height}的每個點創建了一組錨。重點是要理解: 即使我們是基於卷積特徵圖來定義錨,但最終錨也會參考原始圖像。

由於我們只有卷積層和池化層,因此特徵貼圖的尺寸將與原始圖像的尺寸成比例。數學上,如果圖像爲w \times h,則特徵圖將以w / r \times h / r結束,其中r稱爲下采樣率。如果我們在特徵圖的每個空間位置定義一個錨點,則最終圖像將是一系列由r個像素分隔的錨。在VGG的情況下,r= 16。

原始圖像的錨中心

 

爲了選擇一組錨,我們通常定義一組尺寸(例如64px,128px,256px)和一組寬高比(例如0.5,1,1.5)並使用所有可能的尺寸組合和比率。

左圖: 一組錨   中圖: 單個點的錨   右圖:所有錨

 

區域提議網絡

RPN使用卷積特徵圖並在圖像上生成提議

 

正如我們之前提到的,RPN獲取所有參考框(錨)並輸出一組對象的好建議。它通過爲每個錨提供兩個不同的輸出來實現這一點。

第一個是錨是對象的概率。如果你願意的話,就是“對象得分”。請注意,RPN並不關心它是什麼類的對象,只要它實際上看起來像一個對象(而不是背景)。我們將使用此對象得分來過濾掉第二階段的錯誤預測。第二個輸出是邊界框迴歸,用於調整錨以更好地適應它預測的對象。

使用基礎網絡返回的卷積特徵圖作爲輸入,RPN以完全卷積的方式得以有效地實現。首先,我們使用具有512個通道和3x3核尺寸的卷積層,然後我們使用1x11x1核尺寸獲得兩個並行卷積層,其通道數取決於每個點的錨的數目。

RPN架構的卷積實現 (k是anchor的數目)

 

對於分類層,我們爲每個錨輸出兩個預測:它是背景的分數(不是對象),它是前景的分數(實際對象)。

對於迴歸或邊界框調整圖層,我們輸出4個預測:增量\Delta_ {x_ {center}},\Delta_ {y_ {center}},\Delta_ {width},\Delta_ {height},我們將應用於錨以獲得最終建議。

使用最終提議座標及其“對象”得分,我們就可以獲得一組很好的對象提議。

訓練,目標和損失功能

RPN執行兩種不同類型的預測:二分類和邊界框迴歸調整。

對於訓練,我們採用所有錨並將它們分爲兩個不同的類別。那些與標定框(ground-truth)對象重疊並且大於0.5 IoU的交叉點被認爲是“前景”,那些不與任何標定框重疊或者與標定框重疊小於0.1 IoU的被認爲是“背景” ”。

然後,我們隨機抽樣這些錨點,構成一個數量爲256的小批次 - 儘量保證前景和背景錨點之間的平衡比例。

RPN使用這個小批量的所有錨以二元交叉熵來計算分類損失。然後,它僅使用標記爲前景的那些錨點來計算迴歸損失。爲了計算迴歸的目標,我們使用前景錨點和最接近的標定框對象,並計算將錨點轉換爲對象所需的正確\Delta

本文建議使用平滑L1損失,而不是使用簡單的L1或L2損失來表示迴歸誤差。平滑L1基本上是L1,但是當L1誤差足夠小時,由某個\sigma定義,誤差被認爲幾乎是正確的,並且損失以更快的速率減小。

出於多種原因,使用動態批次可能具有挑戰性。儘管我們試圖在被認爲是背景的錨和被認爲是前景的錨之間保持平衡的比例,但這並不總是可行的。根據圖像中的標定對象以及錨點的大小和比例,可能最終得到零前景錨點。在這些情況下,我們轉向使用與標定框有最大IoU的錨點。這遠非理想,但實際上我們總是有前景樣本和目標來學習。

後處理

非最大抑制 因爲錨點通常重疊,所以提議最終也會在同一個對象上重疊。 爲了解決重複提議的問題,我們使用一種稱爲非最大抑制(NMS)的簡單算法方法。 NMS採用按分數排序的提議列表和已排序列表上的iterateqs,丟棄那些與某個更高分數提議的IoU大於預定閾值的提議。

雖然這看起來很簡單,但謹慎對待IoU閾值非常重要。 太低,你可能最終錯過了對象的提議; 太高了,你最終可能會爲同一個對象獲得太多提議。 常用值爲0.6。

提議選擇 應用NMS後,我們會按分數排序前N個提議。 在論文中使用了N = 2000N = 2000,但是可以將該數字降低到50,並且仍然可以獲得非常好的結果。

獨立應用

RPN可以單獨使用而無需第二階段模型。 在單一類別對象的問題中,對象概率可以用作最終類概率。 這是因爲對於這種情況,“前景”=“單一類”和“背景”=“不是單一類”。

可以從RPN獨立使用中受益的機器學習問題是流行的面部檢測和文本檢測(但仍然具有挑戰性)。

僅使用RPN的一個優點是在訓練和預測中都獲得了速度的提高。 由於RPN是僅使用卷積層的非常簡單的網絡,因此預測時間可以比使用分類基礎網絡更快。

興趣池化區域

在RPN步驟之後,我們有一堆對象提議,沒有爲它們分類。 我們要解決的下一個問題是如何採用這些邊界框並將它們分類爲我們想要的類別。

最簡單的方法是採用每個提議,裁剪,然後通過預先訓練的基礎網絡。 然後,我們可以使用提取的特徵作爲圖像分類器的輸入。 其主要問題是運行所有2000個提議的計算效率非常低且速度慢。

Faster R-CNN試圖通過重用現有的卷積特徵圖來解決或至少緩解這個問題。 這是通過使用感興趣區域池化爲每個提議提取固定大小的特徵圖來完成的。 R-CNN需要固定大小的特徵圖,以便將它們分類爲固定數量的類。

興趣區域池化

在對象檢測的實現中,廣泛使用的一種更簡單的方法,包括Luminoth的Faster R-CNN,是使用每個提議裁剪卷積特徵圖,然後通過插值(通常爲雙線性)將每個裁剪調整爲固定大小的14 \times 14 \times \mathit {convdepth}。 裁剪後,使用2x2內核的最大池化來獲得每個提議的最終7 \times 7 \times \mathit {convdepth}特徵圖。

選擇這些具體形狀的原因與下一個步(R-CNN)使用它的方式有關。 重要的是要了解這些可根據第二階段使用進行定製。

基於區域的卷積神經網絡

基於區域的卷積神經網絡(R-CNN)是Faster R-CNN管道中的最後一步。 在從圖像中獲取卷積特徵圖之後,使用它來獲取RPN的對象提議並最終提取每個提議的特徵(通過RoI池),我們最終需要使用這些特徵進行分類。 R-CNN試圖模仿分類CNN的最後階段,其中使用完全連接的層來輸出每個可能的對象類的分數。

R-CNN有兩個不同的目標:

  1. 將提議分類爲其中一個類,加上背景類(用於刪除不良提議)。
  2. 根據預測的類更好地調整提議的邊界框。

在最初的Faster R-CNN論文中,R-CNN獲取每個提議的特徵圖,將其展平並使用兩個帶ReLU激活的尺寸爲4096的完全連接層。

然後,它爲每個不同的對象使用兩個不同的完全連接的層:

  • 具有N + 1個單元的完全連接層,其中N是類的總數,而額外的一個用於背景類。
  • 具有4N單元的完全連接層。 我們想要一個迴歸預測,因此對於N個可能類別的每一個都需要\Delta_ {center_ {x}},\Delta_ {center_ {y}},\Delta_ {width},\Delta_ {height}

R-CNN 架構

訓練和目標

R-CNN的目標以與RPN目標幾乎相同的方式計算,但考慮到不同的可能類別。我們採用提議和標定框,並計算它們之間的IoU。

具有與任意標定框IoU大於0.5的的提議被賦予該標定框。那些介於0.1和0.5之間的被標記爲背景。與我們在爲RPN組裝目標時所做的相反,我們忽略了沒有任何交集的提議。這是因爲在這個階段我們假設我們有很好的建議,我們更有興趣解決更難的案例。當然,所有這些值都是超參數,可以調整它們以更好地適應您要查找的對象類型。

邊界框迴歸的計算目標是提議與其對應的標定框之間的偏移量,這僅針對已根據IoU閾值分配了類別的提議。

我們隨機抽取一個數目爲64的小批次,其中我們有多達25%的前景提案(具有類別)和75%的背景。

遵循與我們對RPN損失相同的路徑,分類損失現在使用的是多類交叉熵損失,使用所有選定的提議, 以及使用平滑L1損失到與標定框匹配的25%提議。在獲得損失時我們必須要小心,因爲用於邊界框迴歸的R-CNN完全連接網絡的輸出對每個類都有一個預測。在計算損失時,我們只需要考慮正確的類別。

後期處理

與RPN類似,我們最終會得到一堆分配了類的對象,這些對象在返回之前需要進一步處理。

爲了應用邊界框調整,我們必須考慮哪個是該提議的概率最高的類。 我們還必須忽略具有背景類的概率最高的那些提議。

在獲得最終對象並忽略那些預測爲背景的對象之後,我們應用基於類的NMS。 這是通過按類對對象進行分組,按概率對它們進行排序,然後在再次加入NMS之前將NMS應用於每個獨立組來完成的。

對於我們的最終對象列表,我們還可以設置概率閾值和每個類的對象數量限制。

訓練

在原始論文中,使用多步驟方法訓練Faster R-CNN,獨立訓練部分並在最終完整訓練方法之前合併訓練的權重。從那時起,人們發現,進行端到端的聯合訓練可以帶來更好的結果。

在將完整模型放在一起之後,我們最終得到了4種不同的損失,其中兩種用於RPN,兩種用於R-CNN。我們在RPN和R-CNN中有可訓練的層,我們也有基本網絡,對於基本網絡我們可以訓練(微調)或不訓練。

訓練基礎網絡的決定取決於我們想要學習的對象的性質和可用的計算能力。如果我們想要檢測與基礎網絡所訓練的原始數據集上的對象類似的對象,那麼除了試圖擠壓我們可以獲得的極致性能之外,沒有任何實際需要。另一方面,訓練基礎網絡在時間和必要的硬件上都是昂貴的,以便能夠適應完整的梯度。

使用加權和來組合四種不同的損失。這是因爲我們可能希望分類損失相對於迴歸損失更重,或者可能使R-CNN損失比RPN更多。

除了常規損失之外,我們還有正則化損失,爲簡潔起見我們跳過這些損失,但可以在RPN和R-CNN中定義。我們對某些層使用L2正則化,並且取決於所使用的基礎網絡以及是否經過訓練,它也可能具有正則化。

我們使用帶動量的隨機梯度下降進行訓練,將動量值設置爲0.9。您可以輕鬆地使用任何其他優化器訓練更快的R-CNN,而不會遇到任何大問題。

學習率從0.001開始,然後在50K步驟後降至0.0001。這是通常最重要的超參數之一。在使用Luminoth進行訓練時,我們通常從默認值開始並在此刻進行調整。

評估

使用標準平均精度(mAP)在某個特定IoU閾值(例如[email protected])進行評估。 mAP是來自信息檢索的度量,通常用於計算排名問題和評估對象檢測問題時的錯誤。

我們將不深入討論細節,因爲這些類型的度量標準應該有自己的博客文章,但重要的一點是當你錯過了一個應該檢測到的對象框時,以及當你檢測到一些不存在的東西,或者多次檢測同一個對象時,mAP會懲罰你。 。

結論

到目前爲止,您應該清楚地知道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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章