1. 程式人生 > >斯坦福:「目標檢測」深度學習全面指南

斯坦福:「目標檢測」深度學習全面指南

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

來源:雷克世界

概要:Faster R-CNN,R-FCN和SSD是目前市面上最好和最廣泛使用的三個目標檢測模型。而其他受歡迎的模型往往與這三個模型非常相似,所有這些都依賴於深度CNN的知識來完成最初的繁重工作,並且大部分遵循相同的提議/分類流程。

隨著自動駕駛汽車、智慧視訊監控、人臉檢測和各種人員計數應用的興起,快速和準確的目標檢測系統也應運而生。這些系統不僅能夠對影象中的每個目標進行識別和分類,而且通過在其周圍畫出適當的邊界來對其進行區域性化(localizing)。這使得目標檢測相較於傳統的計算機視覺前身——影象分類來說更加困難。

然而,幸運的是,目前最為成功的目標檢測方法是影象分類模型的擴充套件。幾個月前,Google釋出了一個用於Tensorflow的新的目標檢測API。隨著這個版本的釋出,一些特定模型的預先構建的體系結構和權重為:

•帶有MobileNets的Single Shot Multibox Detector(SSD)

•帶有Inception V2的SSD

•具有Resnet 101的基於區域的完全卷積網路(R-FCN)

•具有Resnet 101的Faster R-CNN

•具有Inception Resnet v2的Faster R-CNN

在我上一篇博文(https://medium.com/towards-data-science/an-intuitive-guide-to-deep-network-architectures-65fdc477db41)中,我介紹了上面列出的三種基礎網路架構背後的知識:MobileNets、Inception和ResNet。這一次,我想為Tensorflow的目標檢測模型做同樣的事情:Faster R-CNN、R-FCN和SSD。在讀完這篇文章之後,我們希望能夠深入瞭解深度學習是如何應用於目標檢測的,以及這些目標檢測模型是如何激發而出,以及從一個發散到另一個的。

Faster R-CNN

Faster R-CNN現在是基於深度學習的目標檢測的標準模型。它幫助激發了許多後來基於它之後的檢測和分割模型,包括我們今天要研究的另外兩種模型。不幸的是,在不瞭解它的前任R-CNN和Fast R-CNN的情況下,我們是不能夠真正開始理解Faster R-CNN,所以現在我們來快速瞭解一下它的起源吧。

R-CNN

R-CNN是Faster R-CNN的鼻祖。換句話說,R-CNN才是一切的開端。

R-CNN或基於區域的卷積神經網路由3個簡單的步驟組成:

1.使用一種稱為“選擇性搜尋”的演算法掃描可能是目標的輸入影象,生成約2000個區域提案。

2.在這些區域提案之上運行卷積神經網路(CNN)。

3.取每個CNN的輸出並將其饋送到a)SVM(支援向量機)以對該區域進行分類,以及b)如果存在該目標,則線性迴歸器可以收緊該目標的邊界框。

這三個步驟如下圖所示:

640?wx_fmt=png

換句話說,我們首先提出區域,然後提取特徵,然後根據它們的特徵對這些區域進行分類。 從本質上來說,我們是將目標檢測轉化為影象分類問題。R-CNN是非常直觀的,但同時也很慢。

Fast R-CNN

R-CNN的直系後裔是Fast-R-CNN。Fast R-CNN在許多方面都類似於原版,但是通過兩個主要的增強來提高其檢測速度:

1.在提出區域之前在影象上執行特徵提取,因此在整個影象上僅執行一個CNN而不是在超過2000個重疊區域執行2000個CNN。

2.用softmax層代替SVM,從而擴充套件神經網路進行預測,而不是建立一個新的模型。

新模型看起來像這樣:

640?wx_fmt=png

正如我們從影象中看到的那樣,我們現在正在根據網路的最後一個特徵對映,而不是從原始影象本身生成區域提案。因此,我們可以為整個影象訓練一個CNN。

此外,代替訓練許多不同的SVM來對每個目標類進行分類的方法是,有一個單獨的softmax層可以直接輸出類概率。現在我們只有一個神經網需要訓練,而不是一個神經網路和許多SVM。

Fast-R-CNN在速度方面表現更好,只剩下一個大瓶頸:用於生成區域提案的選擇性搜尋演算法。

Faster R-CNN

在這一點上,我們回到了原來的目標:Faster R-CNN,Faster R-CNN的主要特點是用快速神經網路來代替慢速的選擇性搜尋演算法。具體來說,介紹了區域提議網路(RPN)。

以下是RPN的工作原理:

•在初始CNN的最後一層,3x3滑動視窗移動到特徵對映上,並將其對映到較低維度(例如256-d)。

•對於每個滑動視窗位置,它基於k個固定比例錨定框(預設邊界框)生成多個可能的區域。

•每個區域提議包括a)該區域的“目標”得分,以及b)表示該區域邊界框的4個座標。

換句話說,我們來看看最後特徵對映中的每一個位置,並考慮圍繞它的k個不同的框:一個高框,一個寬框,一個大框等。對於每個框,我們要考慮的是它是否包含一個目標,以及該框的座標是什麼。這就是它在一個滑動視窗位置的樣子:

640?wx_fmt=png

2k分數表示每個k邊界框在“目標”上的softmax概率。請注意,雖然RPN輸出的是邊界框座標,但它並沒有嘗試對任何潛在目標進行分類:其唯一的工作仍然是提出目標區域。 如果錨箱(anchor box)的“物件”得分高於某個閾值,則該框的座標將作為區域提議向前傳遞。

一旦我們有了區域提議,我們將把它們直接饋送到一個本質上是Fast R-CNN的網路中。我們新增一個池化層,一些完全連線層,最後新增一個softmax分類層和邊界盒迴歸(bounding box regressor)。在某種意義上,Faster R-CNN = RPN + Fast R-CNN。

640?wx_fmt=png

總而言之,Faster R-CNN取得了更好的速度和最先進的精度。值得注意的是,儘管未來的模型確實提高了檢測速度,但是很少有模型能夠能夠以顯著的優勢戰勝Faster R-CNN。換句話說,Faster R-CNN可能不是目標檢測的最簡單或最快的方法,但它仍然是效能最好的方法之一。例如,具有Inception ResNet的Tensorflow的Faster R-CNN是他們最慢但最準確的模型。

最後要說的是,Faster R-CNN可能看起來很複雜,但其核心設計與原始R-CNN相同:假設目標區域,然後對其進行分類。現在這是許多目標檢測模型中的主要流水線,當然也包括下一個我們要介紹的。

R-FCN

還記得Fast R-CNN是如何通過在所有區域提議中共享單個CNN計算,以可以提高原始檢測速度的嗎?這種想法也是R-FCN背後的動機:通過最大化共享計算來提高速度。

R-FCN或基於區域的完全卷積網路,在每個單個輸出中共享100%的計算。它是一個完全卷積,在模型設計中遇到了一個獨特的問題。

一方面,當對目標進行分類時,我們想在模型中學習位置不變性:不管貓出現在影象中的什麼位置,我們都希望的是將其分類為貓。另一方面,當執行目標象的檢測時,我們想要學習位置方差:如果貓在左上角,我們要在左上角繪製一個框。那麼,如果我們試圖在100%的網路中共享卷積計算,那麼我們如何在位置不變性和位置方差之間進行妥協呢?

R-FCN的解決方案:位置敏感分數圖(position-sensitive score maps)

每個位置敏感分數圖表示一個目標類的一個相對位置。例如,一個分數圖可以啟用它檢測到的貓的右上角的任何位置,另一個得分圖可能會啟用它看到一輛汽車的底部。現在你明白了吧,本質上說,這些分數圖是經過訓練以識別每個目標的某些部分的卷積特徵圖。

現在,R-FCN的工作原理如下:

1. 在輸入影象上執行CNN(在這種情況下,應為ResNet)。

2.新增一個完整的卷積層以產生上述“位置敏感分數圖”的分數庫。應該有k²(C + 1)個分數圖,其中k ^2表示用於劃分目標的相對位置數(例如,3^2表示 3×3網格),C + 1表示類加上背景的數量。

3.執行完全卷積區域提議網路(RPN)來生成感興趣的區域(RoI)。

4.對於每個RoI,將其劃分為與分數圖相同的k²個“bin”或子區域。

5.對於每個bin,請檢查分數庫,以檢視該bin是否與某個目標的相應位置相匹配。例如,如果我在“左上角”bin,我將抓住與目標的“左上角”對應的得分圖,並平均RoI區域中的這些值。每個類都要重複此過程。

6.一旦k²個bin中的每一個都有一個與每個類相對應的“目標匹配”值,那麼,每個類就可以平均每個bin以得到一個單一的分數。

7.在剩餘的C + 1維向量上用softmax對RoI進行分類。

總而言之,R-FCN看起來像這樣,RPN產生了RoI的內容:

640?wx_fmt=png

即使有了解釋和影象,你可能仍然對此模型的工作原理有些困惑。老實說,當你可以想象它在做什麼時,R-FCN可能就更容易理解了。這又一個用R-FCN進行實踐的例子,檢測一個嬰兒:

640?wx_fmt=png

簡單地說,R-FCN考慮到每個區域的建議,將其劃分為子區域,並在子區域內進行迭代,問:“這樣看起來像嬰兒的左上角嗎?”,“這樣看起來像嬰兒的正上方嗎?”“這樣看起來像一個嬰兒的右上角嗎?”等等。它重複了所有可能的類。如果有足夠多的子區域說“是的,我和寶寶的那一部分匹配”,那麼在對所有類進行softmax之後,RoI被歸類為一個寶寶。

通過這種設定,R-FCN能夠通過提出不同的目標區域來解決位置方差,並且通過使每個區域提議返回到相同的分數圖,來同時解決位置不變性。這些分數圖應該學會將貓分類為貓,而不管貓出現在哪裡。最重要的是,它是完全卷積的,意味著所有的計算都在整個網路中共享。

因此,R-FCN比Faster R-CNN快幾倍,並且具有可觀的準確性。

SSD

我們的最終模型是SSD,它表示Single-Shot Detector。像R-FCN一樣,它提供了比Faster R-CNN更快的速度,但是是以一種截然不同的方式。

我們的前兩個模型分別在兩個不同的步驟中進行區域建議和區域分類。首先,他們使用區域提議網路來產生感興趣的區域;接下來,他們使用完全連線層或位置敏感卷積層來對這些區域進行分類。而SSD在“single shot”中將兩者同時進行,在處理影象時,同時預測邊框和類。

具體來說,給定一個輸入影象和一組地面真相標籤,SSD將執行以下操作:

1.通過一系列卷積層傳遞影象,在不同的尺度上產生幾個不同的特徵對映(例如10×10,然後6×6,然後3×3等)。

2.對於每個這些特徵對映中的每個位置,使用3x3的卷積濾波器來評估一小組預設邊界框。這些預設邊界框本質上等同於Faster R-CNN的錨箱。

3.對於每個框,同時預測a)邊界框偏移量和b)類概率。

4.在訓練過程中,將地面真相框與基於IoU的預測方框進行匹配。最好的預測框將被標記為“positive”,以及其他所有具有實際值> 0.5的IoU框。

SSD聽起來很簡單,但訓練起來卻有一個獨特的挑戰。在前兩種模型中,區域提議網路確保了我們試圖分類的所有東西都有一個成為“目標”的最小可能性。但是,使用SSD,我們跳過了該過濾步驟。我們使用多種不同的形狀,以幾種不同的尺度,對影象中的每個單個位置進行分類和繪製邊界框。因此,我們可能會產生比其他模型更多的邊界框,而幾乎所有這些都是負面的樣本。

為了解決這個不平衡問題,SSD做了兩件事情。首先,它使用非最大抑制將高度重疊的邊框組合在一個邊框中。換句話說,如果有四個具有相同形狀和尺寸等因素的邊框包含著同樣一隻狗,則NMS將保持具有最高置信度的那一個,而將其餘的丟棄。其次,該模型在訓練期間使用一種稱為難分樣本挖掘(hard negative mining to balance classes)的技術來平衡類。在難分樣本挖掘中,在訓練的每次迭代中僅使用具有最高訓練損失(即假陽性)的負面樣本的一部分子集。SSD的負和正比例為3:1。

它的架構如下所示:

640?wx_fmt=png

正如我上面提到的那樣,“額外的特徵層”在最後尺寸將縮小。這些不同大小的特徵對映有助於捕獲不同大小的目標。例如,以下是SSD的操作:

640?wx_fmt=png

在較小的特徵對映(例如4×4)中,每個單元覆蓋影象種的較大區域,使得它們能夠檢測較大的目標。區域提議和分類同時執行:給定p目標類,每個邊界框都與一個(4+p)的空間向量相關聯,輸出4個方框偏移座標和p類的概率。在最後一步中,softmax再次被用於對目標進行分類。

最終,SSD與前兩個模型並沒有太大差別。它只是跳過“區域提議”這個步驟,而是考慮影象種每個位置的每個單個邊界框,同時進行分類。因為SSD能夠一次性完成所有操作,所以它是這三個模型中速度最快的,而且執行效能具有一定的可觀性。

結論

Faster R-CNN,R-FCN和SSD是目前市面上最好和最廣泛使用的三個目標檢測模型。而其他受歡迎的模型往往與這三個模型非常相似,所有這些都依賴於深度CNN的知識(參見:ResNet,Inception等)來完成最初的繁重工作,並且大部分遵循相同的提議/分類流程。

在這一點上,想要使用這些模型的話,你只需要知道Tensorflow的API。Tensorflow有一個關於使用這些模型的一個入門教程,點選此處連結獲得教程。(https://github.com/tensorflow/models/blob/master/research/object_detection/object_detection_tutorial.ipynb