□文/Joyce Xu
斯坦福目標檢測深度學習指南
□文/Joyce Xu
隨著人工智能的應(yīng)用越來越廣泛,目標檢測的重要性也更加突出。目前,F(xiàn)aster R-CNN、R-FCN和SSD這三種目標檢測模型是市面上最好,也是最廣泛使用的,而它們之間的關(guān)系和原理又是怎樣的呢?
隨著自動駕駛汽車、智能視頻監(jiān)控、人臉檢測和各種人員計數(shù)應(yīng)用的興起,快速和準確的目標檢測系統(tǒng)也應(yīng)運而生。這些系統(tǒng)不僅能夠?qū)D像中的每個目標進行識別和分類,而且通過在其周圍畫出適當?shù)倪吔鐏韺ζ溥M行局部化(localizing)。這使得目標檢測相較于傳統(tǒng)的計算機視覺前身——圖像分類來說更加困難。
然而,幸運的是,目前最為成功的目標檢測方法是圖像分類模型的擴展。幾個月前,Google發(fā)布了一個用于Tensorflow的新的目標檢測API。隨著這個版本的發(fā)布,一些特定模型的預先構(gòu)建的體系結(jié)構(gòu)和權(quán)重為:
·帶有MobileNets的Single Shot Multibox Detector(SSD)
·帶有Inception V2的SSD
·具有Resnet 101的基于區(qū)域的完全卷積網(wǎng)絡(luò)(R-FCN)
·具有Resnet 101的Faster R-CNN
·具有Inception Resnet V2的Faster R-CNN
在我上一篇博文(https∶//medium.com/towards-data-science/an-intuitive-guide-todeep-network-architectures-65fdc477db41)中,我介紹了上面列出的三種基礎(chǔ)網(wǎng)絡(luò)架構(gòu)背后的知識:MobileNets、Inception和 ResNet。這一次,我想為Tensorflow的目標檢測模型做同樣的事情:Faster R-CNN、R-FCN和SSD。在讀完這篇文章之后,我們希望能夠深入了解深度學習是如何應(yīng)用于目標檢測的,以及這些目標檢測模型是如何激發(fā)而出,以及從一個發(fā)散到另一個的。
Faster R-CNN現(xiàn)在是基于深度學習的目標檢測的標準模型。它幫助激發(fā)了許多后來基于它之后的檢測和分割模型,包括我們今天要研究的另外兩種模型。不幸的是,在不了解它的前任R-CNN和Fast R-CNN的情況下,我們是不能夠真正理解Faster R-CNN的,所以現(xiàn)在我們來快速了解一下它的起源吧。
R-CNN是Faster R-CNN的鼻祖。換句話說,R-CNN才是一切的開端。
R-CNN或基于區(qū)域的卷積神經(jīng)網(wǎng)絡(luò)由3個簡單的步驟組成:
1.使用一種稱為“選擇性搜索”的算法掃描可能是目標的輸入圖像,生成約2000個區(qū)域提案。
2.在這些區(qū)域提案之上運行卷積神經(jīng)網(wǎng)絡(luò)(CNN)。
3.取每個CNN的輸出并將其饋送到a,SVM(支持向量機)以對該區(qū)域進行分類,以及b如果存在該目標,則線性回歸器可以收緊該目標的邊界框。
這三個步驟如下圖所示:
R-CNN的三個組成步驟
換句話說,我們首先提出區(qū)域,然后提取特征,然后根據(jù)它們的特征對這些區(qū)域進行分類。 從本質(zhì)上來說,我們是將目標檢測轉(zhuǎn)化為圖像分類問題。R-CNN是非常直觀的,但同時也很慢。
R-CNN的直系后裔是Fast R-CNN。Fast R-CNN在許多方面都類似于原版,但卻是通過兩個主要的增強來提高其檢測速度:
1.在提出區(qū)域之前在圖像上執(zhí)行特征提取,因此在整個圖像上僅運行一個CNN而不是在超過2000個重疊區(qū)域運行2000個CNN。
2.用softmax層代替SVM,從而擴展神經(jīng)網(wǎng)絡(luò)進行預測,而不是創(chuàng)建一個新的模型。
新模型看起來像這樣:
Fast R-CNN模型
正如我們從圖像中看到的那樣,我們現(xiàn)在正在根據(jù)網(wǎng)絡(luò)的最后一個特征映射,而不是從原始圖像本身生成區(qū)域提議。因此,我們可以為整個圖像訓練一個CNN。
此外,代替訓練許多不同的SVM來對每個目標類進行分類的方法是,有一個單獨的softmax層可以直接輸出類概率?,F(xiàn)在我們只有一個神經(jīng)網(wǎng)絡(luò)需要訓練,而不是一個神經(jīng)網(wǎng)絡(luò)和許多SVM。
Fast R-CNN在速度方面表現(xiàn)更好,只剩下一個大瓶頸:用于生成區(qū)域提議的選擇性搜索算法。
在這一點上,我們回到了原來的目標:Faster R-CNN。Faster R-CNN的主要特點是用快速神經(jīng)網(wǎng)絡(luò)來代替慢速的選擇性搜索算法。具體來說,介紹了候選區(qū)域生成網(wǎng)絡(luò)(RPN)。
以下是RPN的工作原理:
·在初始CNN的最后一層,3x3滑動窗口移動到特征映射上,并將其映射到較低維度(例如256-d)。
·對于每個滑動窗口位置,它基于k個固定比例錨定框(默認邊界框)生成多個可能的區(qū)域。
·每個區(qū)域提議包括a該區(qū)域的“目標”得分,以及b表示該區(qū)域邊界框的4個坐標。
換句話說,我們來看看最后特征映射中的每一個位置,并考慮圍繞它的k個不同的框:一個高框,一個寬框,一個大框等。對于每個框,我們要考慮的是它是否包含一個目標,以及該框的坐標是什么。這就是它在一個滑動窗口位置的樣子:
2k分數(shù)表示每個k邊界框在“目標”上的softmax概率。請注意,雖然RPN輸出的是邊界框坐標,但它并沒有嘗試對任何潛在目標進行分類:其唯一的工作仍然是提出目標區(qū)域。 如果錨箱(anchor box)的“對象”得分高于某個閾值,則該框的坐標將作為區(qū)域提議向前傳遞。
候選區(qū)域生成網(wǎng)絡(luò)工作原理
一旦我們有了區(qū)域提議,我們將把它們直接饋送到一個本質(zhì)上是Fast R-CNN的網(wǎng)絡(luò)中。我們添加一個池化層,一些完全連接層,最后添加一個softmax分類層和邊界盒回歸(bounding box regressor)。在某種意義上,F(xiàn)aster R-CNN = RPN + Fast R-CNN。
Faster R-CNN模型
總而言之,F(xiàn)aster R-CNN取得了更好的速度和最先進的精度。值得注意的是,盡管未來的模型確實提高了檢測速度,但是很少有模型能夠以顯著的優(yōu)勢戰(zhàn)勝Faster R-CNN。換句話說,F(xiàn)aster R-CNN可能不是目標檢測的最簡單或最快的方法,但它仍然是性能最好的方法之一。例如,具有Inception ResNet的Tensorflow的Faster R-CNN是他們最慢但最準確的模型。
最后要說的是,F(xiàn)aster R-CNN可能看起來很復雜,但其核心設(shè)計與原始R-CNN相同:假設(shè)目標區(qū)域,然后對其進行分類。現(xiàn)在這是許多目標檢測模型中的主要流水線,當然也包括下一個我們要介紹的。
還記得Fast R-CNN是如何通過在所有候選區(qū)域生成中共享單個CNN計算,以可以提高原始檢測速度的嗎?這種想法也是R-FCN背后的動機:通過最大化共享計算來提高速度。
R-FCN或基于區(qū)域的完全卷積網(wǎng)絡(luò),在每個單個輸出中共享100%的計算。它是一個完全卷積,在模型設(shè)計中遇到了一個獨特的問題。
一方面,當對目標進行分類時,我們想在模型中學習位置不變性:不管貓出現(xiàn)在圖像中的什么位置,我們都希望的是將其分類為貓。另一方面,當執(zhí)行目標對象的檢測時,我們想要學習位置方差:如果貓在左上角,我們要在左上角繪制一個框。那么,如果我們試圖在100%的網(wǎng)絡(luò)中共享卷積計算,那么我們?nèi)绾卧谖恢貌蛔冃院臀恢梅讲钪g進行妥協(xié)呢?
R-FCN的解決方案:位置敏感分數(shù)圖(position-sensitive score maps)。
每個位置敏感分數(shù)圖表示一個目標類的一個相對位置。例如,一個分數(shù)圖可以激活它檢測到的貓的右上角的任何位置,另一個得分圖可能會激活它看到一輛汽車的底部?,F(xiàn)在你明白了吧,本質(zhì)上說,這些分數(shù)圖是經(jīng)過訓練以識別每個目標的某些部分的卷積特征圖。
現(xiàn)在,R-FCN的工作原理如下:
1. 在輸入圖像上運行CNN(在這種情況下,應(yīng)為ResNet)。
2.添加一個完整的卷積層以產(chǎn)生上述“位置敏感分數(shù)圖”的分數(shù)庫。應(yīng)該有k2(C + 1)個分數(shù)圖,其中k ^2表示用于劃分目標的相對位置數(shù)(例如,3^2表示 3×3網(wǎng)格),C+ 1表示類加上背景的數(shù)量。
3.運行完全卷積候選區(qū)域生成網(wǎng)絡(luò)(RPN)來生成感興趣的區(qū)域(RoI)。
4.對于每個RoI,將其劃分為與分數(shù)圖相同的k2個“bin”或子區(qū)域。
5.對于每個bin,請檢查分數(shù)庫,以查看該bin是否與某個目標的相應(yīng)位置相匹配。例如,如果我在“左上角”bin,我將抓住與目標的“左上角”對應(yīng)的得分圖,并平均RoI區(qū)域中的這些值。每個類都要重復此過程。
6.一旦k2個bin中的每一個都有一個與每個類相對應(yīng)的“目標匹配”值,那么,每個類就可以平均每個bin以得到一個單一的分數(shù)。
7.在剩余的C + 1維向量上用softmax對RoI進行分類。
總而言之,R-FCN看起來像這樣,RPN產(chǎn)生了RoI的內(nèi)容:
用于分類的R-FCN可視化
當RoI不能正確地將目標重疊時進行可視化
即使有了解釋和圖像,你可能仍然對此模型的工作原理有些困惑。老實說,當你可以想象它在做什么時,R-FCN可能就更容易理解了。這里有一個用R-FCN進行實踐的例子,檢測一個嬰兒:
R-FCN模型運行原理
簡單地說,R-FCN考慮到每個區(qū)域的建議,將其劃分為子區(qū)域,并在子區(qū)域內(nèi)進行迭代,問:“這樣看起來像嬰兒的左上角嗎?”“這樣看起來像嬰兒的正上方嗎?”“這樣看起來像一個嬰兒的右上角嗎?”等等。它重復了所有可能的類。如果有足夠多的子區(qū)域說“是的,我和寶寶的那一部分匹配”,那么在對所有類進行softmax之后,RoI被歸類為一個寶寶。
通過這種設(shè)置,R-FCN能夠通過提出不同的目標區(qū)域來解決位置方差,并且通過使每個候選區(qū)域生成返回到相同的分數(shù)圖,來同時解決位置不變性。這些分數(shù)圖應(yīng)該學會將貓分類為貓,而不管貓出現(xiàn)在哪里。最重要的是,它是完全卷積的,意味著所有的計算都在整個網(wǎng)絡(luò)中共享。
因此,R-FCN比Faster R-CNN快幾倍,并且具有可觀的準確性。
我們的最終模型是SSD,它表示Single-Shot Detector。像R-FCN一樣,它提供了比Faster R-CNN更快的速度,但是是以一種截然不同的方式。
我們的前兩個模型分別在兩個不同的步驟中進行區(qū)域建議和區(qū)域分類。首先,他們使用候選區(qū)域生成網(wǎng)絡(luò)來產(chǎn)生感興趣的區(qū)域;接下來,他們使用完全連接層或位置敏感卷積層來對這些區(qū)域進行分類。而SSD在“single shot”中將兩者同時進行,在處理圖像時,同時預測邊框和類。
具體來說,給定一個輸入圖像和一組地面真相標簽,SSD將執(zhí)行以下操作:
1.通過一系列卷積層傳遞圖像,在不同的尺度上產(chǎn)生幾個不同的特征映射(例如10×10,然后6×6,然后3×3等)。
2.對于每個這些特征映射中的每個位置,使用3x3的卷積過濾器來評估一小組默認邊界框。這些默認邊界框本質(zhì)上等同于Faster R-CNN的錨箱。
3.對于每個框,同時預測a邊界框偏移量和b類概率。
4.在訓練過程中,將地面真相框與基于IoU的預測方框進行匹配。最好的預測框?qū)⒈粯擞洖椤皃ositive”,以及其他所有具有實際值> 0.5的IoU框。
SSD聽起來很簡單,但訓練起來卻有一個獨特的挑戰(zhàn)。在前兩種模型中,候選區(qū)域生成網(wǎng)絡(luò)確保了我們試圖分類的所有東西都有一個成為“目標”的最小可能性。但是,使用SSD,我們跳過了該過濾步驟。我們使用多種不同的形狀,以幾種不同的尺度,對圖像中的每個單個位置進行分類和繪制邊界框。因此,我們可能會產(chǎn)生比其他模型更多的邊界框,而幾乎所有這些都是負面的樣本。
為了解決這個不平衡問題,SSD做了兩件事情。首先,它使用非最大抑制將高度重疊的邊框組合在一個邊框中。換句話說,如果有四個具有相同形狀和尺寸等因素的邊框包含著同樣一只狗,則NMS將保持具有最高置信度的那一個,而將其余的丟棄。其次,該模型在訓練期間使用一種稱為難分樣本挖掘(hard negative mining to balance classes)的技術(shù)來平衡類。在難分樣本挖掘中,在訓練的每次迭代中僅使用具有最高訓練損失(即假陽性)的負面樣本的一部分子集。SSD的負和正比例為3:1。
它的架構(gòu)如下所示:
SSD模型構(gòu)架
SSD所進行的操作
正如我上面提到的那樣,“額外的特征層”在最后尺寸將縮小。這些不同大小的特征映射有助于捕獲不同大小的目標。例如,以下是SSD的操作:
在較小的特征映射(例如4×4)中,每個單元覆蓋圖像種的較大區(qū)域,使得它們能夠檢測較大的目標。候選區(qū)域生成和分類同時執(zhí)行:給定p目標類,每個邊界框都與一個(4+p)的空間向量相關(guān)聯(lián),輸出4個方框偏移坐標和p類的概率。在最后一步中,softmax再次被用于對目標進行分類。
最終,SSD與前兩個模型并沒有太大差別。它只是跳過“候選區(qū)域生成”這個步驟,考慮圖像每個位置的每個單個邊界框,同時進行分類。因為SSD能夠一次性完成所有操作,所以它是這三個模型中速度最快的,而且執(zhí)行性能具有一定的可觀性。
Faster R-CNN、R-FCN和SSD是目前市面上最好和最廣泛使用的三個目標檢測模型。而其他受歡迎的模型往往與這三個模型非常相似,所有這些都依賴于深度CNN的知識(參見:ResNet,Inception等)來完成最初的繁重工作,并且大部分遵循相同的提議/分類流程。
在這一點上,想要使用這些模型的話,你只需要知道Tensorflow的API。Tensorflow有一個關(guān)于使用這些模型的一個入門教程,可輸入鏈接獲得教程。(https∶//github.com/tensorflow/models/blob/master/research/object_detection/object_detection_tutorial.ipynb)