深度學(xué)習(xí)目標(biāo)檢測模型全面綜述:Faster R-CNN、R-FCN和SSD
Faster R-CNN、R-FCN 和 SSD 是三種目前***且應(yīng)用最廣泛的目標(biāo)檢測模型。其他流行的模型通常與這三者類似,都依賴于深度 CNN(如 ResNet、Inception 等)來進行網(wǎng)絡(luò)初始化,且大部分遵循同樣的 proposal/分類管道。本文介紹了深度學(xué)習(xí)目標(biāo)檢測的三種常見模型:Faster R-CNN、R-FCN 和 SSD。
隨著自動駕駛汽車、智能監(jiān)控攝像頭、面部識別以及大量對人有價值的應(yīng)用出現(xiàn),快速、精準(zhǔn)的目標(biāo)檢測系統(tǒng)市場也日益蓬勃。這些系統(tǒng)除了可以對圖像中的每個目標(biāo)進行識別、分類以外,它們還可以通過在該目標(biāo)周圍繪制適當(dāng)大小的邊界框(bounding box)來對其進行定位。這讓目標(biāo)檢測技術(shù)較傳統(tǒng)計算機視覺處理技術(shù)——圖像分類而言,難度上升了不少。
然而,幸運的是,目前最成功的目標(biāo)檢測方法是對圖像分類模型的擴展。幾個月前,Google 為 Tensorflow 發(fā)布了一個新的目標(biāo)檢測 API。與其同時發(fā)布的還有針對一些特定模型預(yù)構(gòu)建的框架和權(quán)重。
- 基于 MobileNets 框架的 Single Shot Multibox Detector(SSD)模型。
- 基于 Inception V2 框架的 SSD 模型。
- 使用 ResNet-101 框架的基于 Region 的全卷積網(wǎng)絡(luò)(R-FCN)模型。
- 基于 ResNet-101 框架的 Faster RCNN 模型。
- 基于 Inception ResNet v2 的 Faster RCNN 模型。
在以前的文章中 ,機器之心曾梳理了 Xception、Inception 和 ResNet 等基本網(wǎng)絡(luò)的架構(gòu)和背后的設(shè)計思路。在本文中,我們會對 Tensorflow 的目標(biāo)檢測模型 Faster R-CNN、R-FCN 以及 SSD 做同樣的介紹。希望在結(jié)束本文的閱讀之后,你可以了解到以下兩點:
- 深度學(xué)習(xí)是如何在目標(biāo)檢測中得到應(yīng)用的。
- 這些目標(biāo)檢測模型的設(shè)計是如何在相互之間獲得靈感的同時也有各自的特點。
FASTER R-CNN 模型
Faster R-CNN 模型現(xiàn)在是一個典型的基于深度學(xué)習(xí)的目標(biāo)檢測模型。在它的啟發(fā)下,出現(xiàn)了很多目標(biāo)檢測與分割模型,比如本文中我們將會看到的另外兩個模型。然而,要真正開始了解 Faster R-CNN 我們需要理解其之前的 R-CNN 和 Fast R-CNN。所以,現(xiàn)在我們快速介紹一下 Faster R-CNN 的來龍去脈。
R-CNN 模型
如果要擬人化比喻,那 R-CNN 肯定是 Faster R-CNN 的祖父了。換句話說,R-CNN 是一切的開端。
R-CNN,或稱 Region-based Convolutional Neural Network,其工作包含了三個步驟:
- 借助一個可以生成約 2000 個 region proposal 的「選擇性搜索」(Selective Search)算法,R-CNN 可以對輸入圖像進行掃描,來獲取可能出現(xiàn)的目標(biāo)。
- 在每個 region proposal 上都運行一個卷積神經(jīng)網(wǎng)絡(luò)(CNN)。
- 將每個 CNN 的輸出都輸入進:a)一個支持向量機(SVM),以對上述區(qū)域進行分類。b)一個線性回歸器,以收縮目標(biāo)周圍的邊界框,前提是這樣的目標(biāo)存在。
下圖具體描繪了上述 3 個步驟:
換句話說,首先,我們給出一些建議區(qū)域,然后,從中提取出特征,之后,再根據(jù)這些特征來對這些區(qū)域進行分類。本質(zhì)而言,我們將目標(biāo)檢測轉(zhuǎn)化成了圖像分類問題。R-CNN 模型雖然非常直觀,但是速度很慢。
Fast R-CNN
直接承接 R-CNN 的是 Fast R-CNN。Fast R-CNN 在很多方面與 R-CNN 類似,但是,憑借兩項主要的增強手段,其檢測速度較 R-CNN 有所提高:
- 在推薦區(qū)域之前,先對圖像執(zhí)行特征提取工作,通過這種辦法,后面只用對整個圖像使用一個 CNN(之前的 R-CNN 網(wǎng)絡(luò)需要在 2000 個重疊的區(qū)域上分別運行 2000 個 CNN)。
- 將支持向量機替換成了一個 softmax 層,這種變化并沒有創(chuàng)建新的模型,而是將神經(jīng)網(wǎng)絡(luò)進行了擴展以用于預(yù)測工作。
Fast R-CNN 模型結(jié)構(gòu)示意圖:
如圖所見,現(xiàn)在我們基于網(wǎng)絡(luò)***的特征圖(而非原始圖像)創(chuàng)建了 region proposals。因此,我們對整幅圖只用訓(xùn)練一個 CNN 就可以了。
此外,我們使用了一個 softmax 層來直接輸出類(class)的概率,而不是像之前一樣訓(xùn)練很多不同的 SVM 去對每個目標(biāo)類(object class)進行分類?,F(xiàn)在,我們只用訓(xùn)練一個神經(jīng)網(wǎng)絡(luò),而之前我們需要訓(xùn)練一個神經(jīng)網(wǎng)絡(luò)以及很多 SVM。
就速度而言,F(xiàn)ast R-CNN 提升了許多。
然而,存在一大未解決的瓶頸:用于生成 region proposal 的選擇搜索算法(selective search algorithm)。
FASTER R-CNN
到現(xiàn)在為止,我們完成了對 Faster R-CNN 兩大早期模型的溯源。下面我們開始研究 Faster R-CNN。Faster R-CNN 的主要創(chuàng)新是,它用一個快速神經(jīng)網(wǎng)絡(luò)代替了之前慢速的選擇搜索算法(selective search algorithm)。具體而言,它引入了一個 region proposal 網(wǎng)絡(luò)(RPN)。
RPN 工作原理:
- 在***卷積得到的特征圖上,使用一個 3×3 的窗口在特征圖上滑動,然后將其映射到一個更低的維度上(如 256 維),
- 在每個滑動窗口的位置上,RPN 都可以基于 k 個固定比例的 anchor box(默認(rèn)的邊界框)生成多個可能的區(qū)域。
- 每個 region proposal 都由兩部分組成:a)該區(qū)域的 objectness 分?jǐn)?shù)。b)4 個表征該區(qū)域邊界框的坐標(biāo)。
換句話說,我們會觀察我們***特征圖上的每個位置,然后關(guān)注圍繞它的 k 個不同的 anchor box:一個高的框、一個寬的框、一個大的框等等。對于每個這些框,不管我們是否認(rèn)為它包含一個目標(biāo),以及不管這個框里的坐標(biāo)是什么,我們都會進行輸出。下圖展示了在單個滑動框位置上發(fā)生的操作:
圖中 2k 分?jǐn)?shù)代表了 k 中每一個邊界框正好覆蓋「目標(biāo)」的 softmax 概率。這里注意到,盡管 RPN 輸出了邊界框的坐標(biāo),然而它并不會去對任何可能的目標(biāo)進行分類:它惟一的工作仍然是給出對象區(qū)域。如果一個 anchor box 在特定閾值之上存在一個「objectness」分?jǐn)?shù),那么這個邊界框的坐標(biāo)就會作為一個 region proposal 被向前傳遞。
一旦我們有了 region proposal,我們就直接把他們輸入一個本質(zhì)上是 Fast R-CNN 的模型。我們再添加一個池化層、一些全連接層以及***,一個 softmax 分類層和邊界框回歸器(bounding box regressor)。所以在某種意義上,F(xiàn)aster R-CNN=RPN+Fast R-CNN。
總體而言,F(xiàn)aster R-CNN 較 Fast R-CNN 在速度上有了大幅提升,而且其精確性也達到了最***的水平。值得一提的是,盡管未來的模型能夠在檢測速度上有所提升,但是幾乎沒有模型的表現(xiàn)能顯著超越 Faster R-CNN。換句話說,F(xiàn)aster R-CNN 也許不是目標(biāo)檢測最簡單、最快的方法,但是其表現(xiàn)還是目前***的。例如,Tensorflow 應(yīng)用 Inception ResNet 打造的 Faster R-CNN 就是他們速度最慢,但卻最精準(zhǔn)的模型。
也許 Faster R-CNN 看起來可能會非常復(fù)雜,但是它的核心設(shè)計還是與最初的 R-CNN 一致:先假設(shè)對象區(qū)域,然后對其進行分類。目前,這是很多目標(biāo)檢測模型使用的主要思路,包括我們接下來將要提到的這個模型。
R-FCN
還記得 Fast R-CNN 是如何通過在所有 region proposal 上共享同一個 CNN,來改善檢測速度的嗎?這也是設(shè)計 R-FCN 的一個動機:通過***化共享計算來提升速度。
R-FCN,或稱 Region-based Fully Convolutional Net(基于區(qū)域的全卷積網(wǎng)絡(luò)),可以在每個輸出之間完全共享計算。作為全卷積網(wǎng)絡(luò),它在模型設(shè)計過程中遇到了一個特殊的問題。
一方面,當(dāng)對一個目標(biāo)進行分類任務(wù)時,我們希望學(xué)到模型中的位置不變性(location invariance):無論這只貓出現(xiàn)在圖中的哪個位置,我們都想將它分類成一只貓。另一方面,當(dāng)進行目標(biāo)檢測任務(wù)時,我們希望學(xué)習(xí)到位置可變性(location variance):如果這只貓在左上角,那么我們希望在圖像左上角這個位置畫一個框。所以,問題出現(xiàn)了,如果想在網(wǎng)絡(luò)中 100% 共享卷積計算的話,我們應(yīng)該如何在位置不變性(location invariance)和位置可變性(location variance)之間做出權(quán)衡呢?
R-FCN 的解決方案:位置敏感分?jǐn)?shù)圖
每個位置敏感分?jǐn)?shù)圖都代表了一個目標(biāo)類(object class)的一個相關(guān)位置。例如,只要是在圖像右上角檢測到一只貓,就會激活一個分?jǐn)?shù)圖(score map)。而當(dāng)系統(tǒng)看見左下角出現(xiàn)一輛車時,另一個分?jǐn)?shù)圖也將會被激活。本質(zhì)上來講,這些分?jǐn)?shù)圖都是卷積特征圖,它們被訓(xùn)練來識別每個目標(biāo)的特定部位。
以下是 R-FCN 的工作方式:
- 在輸入圖像上運行一個 CNN(本例中使用的是 ResNet)。
- 添加一個全卷積層,以生成位置敏感分?jǐn)?shù)圖的 score bank。這里應(yīng)該有 k²(C+1) 個分?jǐn)?shù)圖,其中,k²代表切分一個目標(biāo)的相關(guān)位置的數(shù)量(比如,3²代表一個 3×3 的空間網(wǎng)格),C+1 代表 C 個類外加一個背景。
- 運行一個全卷積 region proposal 網(wǎng)絡(luò)(RPN),以生成感興趣區(qū)域(regions of interest,RoI)。
- 對于每個 RoI,我們都將其切分成同樣的 k²個子區(qū)域,然后將這些子區(qū)域作為分?jǐn)?shù)圖。
- 對每個子區(qū)域,我們檢查其 score bank,以判斷這個子區(qū)域是否匹配具體目標(biāo)的對應(yīng)位置。比如,如果我們處在「上-左」子區(qū)域,那我們就會獲取與這個目標(biāo)「上-左」子區(qū)域?qū)?yīng)的分?jǐn)?shù)圖,并且在感興趣區(qū)域(RoI region)里對那些值取平均。對每個類我們都要進行這個過程。
- 一旦每個 k²子區(qū)域都具備每個類的「目標(biāo)匹配」值,那么我們就可以對這些子區(qū)域求平均值,得到每個類的分?jǐn)?shù)。
- 通過對剩下 C+1 個維度向量進行 softmax 回歸,來對 RoI 進行分類。
下面是 R-FCN 的示意圖,用 RPN 生成 RoI:
當(dāng)然,即便有上述文字以及圖片的解釋,你可能仍然不太明白這個模型的工作方式。老實說,當(dāng)你可以實際看到 R-FCN 的工作過程時,你會發(fā)現(xiàn)理解起來會更加簡單。下面就是一個在實踐中應(yīng)用的 R-FCN,它正在從圖中檢測一個嬰兒:
我們只用簡單地讓 R-FCN 去處理每個 region proposal,然后將其切分成子區(qū)域,在子區(qū)域上反復(fù)詢問系統(tǒng):「這看起來像是嬰兒的『上-左』部分嗎?」,「這看起來像是嬰兒的『上-中』部分嗎?」,「這看起來像是嬰兒的『上-右』部分嗎?」等等。系統(tǒng)會對所有類重復(fù)這個過程。如果有足夠的子區(qū)域表示「是的,我的確匹配嬰兒的這個部分!」那么 RoI 就會通過對所有類進行 softmax 回歸的方式被分類成一個嬰兒?!?/p>
借助這種設(shè)置,R-FCN 便能同時處理位置可變性(location variance)與位置不變性(location invariance)。它給出不同的目標(biāo)區(qū)域來處理位置可變性,讓每個 region proposal 都參考同一個分?jǐn)?shù)圖 score bank 來處理位置不變形。這些分?jǐn)?shù)圖應(yīng)該去學(xué)習(xí)將一只貓分類成貓,而不用管這只貓在在那個位置。***的是,由于它是全卷積的,所以這意味著網(wǎng)絡(luò)中所有的計算都是共享的。
因此,R-FCN 比 Faster R-CNN 快了好幾倍,并且可以達到類似的準(zhǔn)確率。
SSD
我們***一個模型是 SSD,即 Single-Shot Detector。和 R-FCN 一樣,它的速度比 Faster R-CNN 要快很多,但其工作方式卻和 R-FCN 存在顯著不同。
我們前兩個模型分兩個步驟執(zhí)行 region proposal 和 region classification。首先,它們使用一個 region proposal 網(wǎng)絡(luò)來生成感興趣區(qū)域(region of interest);然后,它們既可以用全連接層也可以用位置敏感卷積層來對那些區(qū)域進行分類。然而,SSD 可以在單個步驟中完成上述兩個步驟,并且在處理圖像的同時預(yù)測邊界框和類。
具體而言,給定一個輸入圖像以及一系列真值標(biāo)簽,SSD 就會進行如下操作:
- 在一系列卷積層中傳遞這個圖像,產(chǎn)生一系列大小不同的特征圖(比如 10×10、6×6、3×3 等等。)
- 對每個這些特征圖中的每個位置而言,都使用一個 3×3 的卷積濾波器(convolutional filter)來評估一小部分默認(rèn)的邊界框。這些默認(rèn)邊的界框本質(zhì)上等價于 Faster R-CNN 的 anchor box。
- 對每個邊界框都同時執(zhí)行預(yù)測: a)邊界框的偏移;b)分類的概率。
- 在訓(xùn)練期間,用這些基于 IoU(Intersection over Union,也被稱為 Jaccard 相似系數(shù))系數(shù)的預(yù)測邊界框來匹配正確的邊界框。被***預(yù)測的邊界框?qū)⒈粯?biāo)簽為「正」,并且其它邊界框的 IoU 大于 0.5。
SSD 的工作方式聽上去很直接,但是訓(xùn)練它卻會面臨一個不一般的挑戰(zhàn)。在之前那兩個模型那里,region proposal 網(wǎng)絡(luò)可以確保每個我們嘗試進行分類的對象都會有一個作為「目標(biāo)」的最小概率值。然而,在 SSD 這里,我們跳過了這個篩選步驟。我們從圖像中每個單一位置那里進行分類并畫出形狀、大小不同的邊界框。通過這種辦法,我們可以生成比別的模型更多的邊界框,但是它們基本上全是負面樣本。
為了解決這個問題,SSD 進行了兩項處理。首先,它使用非極大值抑制(non maximum suppression,NMS)技術(shù)來將高度重疊的邊界框整合成一個。換句話說,如果有 4 個形狀、尺寸等類似的邊界框中有同一只狗,那么 NMS 就會保留信度***的那個邊界框而拋棄掉其它的。第二,SSD 模型使用了一種被稱為 hard negative mining 的技術(shù)以在訓(xùn)練過程中讓類保持平衡。在 hard negative mining 中,只有那些有***訓(xùn)練損失(training loss)的負面樣本(negative example)子集才會在每次訓(xùn)練迭代中被使用。SSD 的「正負」比一直保持在 1:3。
下圖是 SSD 的架構(gòu)示意圖:
如上所述,最終有可縮小尺寸的「額外特征層」。這些尺寸變化的特征圖有助于捕捉不同大小的目標(biāo)。例如,下面是一個正在執(zhí)行的 SSD。
在更小的特征圖中(比如 4×4),每一單元覆蓋圖像的一個更大區(qū)域,使其探測更大的目標(biāo)。region proposal 與分類同時被執(zhí)行:假設(shè) p 為目標(biāo)類別,每個邊界框與一個 (4+p)-維度向量相連接,其輸出 4 個框偏移坐標(biāo)和 p 分類概率。在***一步中,softmax 又一次被用來分類目標(biāo)。
最終,SSD 與最初的兩個模型并無不同。它簡單跳過「region proposal」這一步,而不是同時考慮圖像每個位置的每個邊界及其分類。由于 SSD 一次性完成所有,它是三個模型中最快的,且相對而言依然表現(xiàn)出色。
結(jié)論
Faster R-CNN、R-FCN 和 SSD 是三種目前***且應(yīng)用最廣泛的目標(biāo)檢測模型。其他流行的模型通常與這三者類似,都依賴于深度 CNN(如 ResNet、Inception 等)來進行網(wǎng)絡(luò)初始化,且大部分遵循同樣的 proposal/分類 pipeline。
但是,使用這些模型需要了解 Tensorflow 的 API。Tensorflow 有一份使用這些模型的初學(xué)者教程(https://github.com/tensorflow/models/blob/master/object_detection/object_detection_tutorial.ipynb)。