零基礎入門:對象檢測及其演算法指南
摘要: 本文將向您介紹對象檢測及各種演算法,如:Fast R-CNN演算法,YOLO演算法,SSD演算法等。我們將從零基礎入手,一直到對象檢測最先進的演算法,並了解每種演算法的具體方法和顯著特徵。
圖像分類是拍攝一張圖像並對其中的對象進行預測。例如:當我們構建一個貓狗分類器時,我們拍攝了貓或狗的圖像,並預測它們屬於哪個類別。
如果貓和狗都出現在同一張圖像中,你會怎樣做呢?
我們的模型將會預測出什麼呢?為了解決這一問題,我們可以訓練一個可預測這兩個類別(貓和狗)的多標籤分類器。然而,我們仍然不知道貓或狗所在的位置。識別圖像中給定類別對象的位置稱為定位(Localization)。如果不知道對象類別,我們不僅要確定其位置,還要預測每個對象的類別。
預測對象的位置和類別稱為對象檢測(Object Detection)。過去從圖像中預測對象的類別,而現在我們必須預測對象類別及包含該對象的矩形——稱為邊界框(Bounding Box)。這需要4個變數唯一確定一個矩形。因此,對於圖像中的每個對象實例,應預測以下5個變數:
class_name,ounding_box_top_left_x_coordinate,ounding_box_top_left_y_coordinate,ounding_box_width,ounding_box_height。
就像多標籤圖像分類一樣,我們可以擁有多類別對象檢測器來檢測單張圖像中的多種類別的對象:
在以下章節中,我將介紹當前所有流行的科學方法來訓練對象檢測器。從2001年 Viola和Jones提出Haar Cascades開始,目前已經有很多種方法來進行對象檢測。本文將聚焦於所有使用神經網路和深度學習的最先進的方法。
我們將對象檢測建模為一個分類問題。我們從輸入圖像所有可能的位置獲取固定大小的窗口,並將這些小塊送入圖像分類器。
滑動式窗口檢測器演示
每個窗口被送入分類器,該分類器可以預測窗口內對象的類別(或者是背景)。因此,我們確定了圖像中對象的類別和位置。那麼如何確定窗口的大小以便它總是包含對象?請看下面的例子:
小尺寸對象
正如你所看到的,對象可以有不同的尺寸。我們通過測量圖像來創建一個圖像金字塔來解決這一問題。想法如下:調整圖像到多個不同的尺寸,並基於這樣一個事實,即選擇的窗口將完全包含這些調整過的圖像中的對象。最常見的情況就是,將圖像下採樣(縮小),直到達到某些條件下的最小尺寸。在每個圖像上運行一個固定大小的窗口檢測器,這樣,在這個金字塔上通常會有64層。現在,所有的窗口被送入一個分類器檢測感興趣的對象。這解決了大小和位置兩個問題。
還有一個問題:寬高比。很多對象可以以不同的形狀呈現出來,例如:坐下的人與站立或睡覺的人的寬高比不同。我們將稍後進行闡述。
目前,對象檢測的演算法有很多,如RCNN,Faster-RCNN,SSD等,為什麼會有這麼多的方法?每個方法的顯著特點是什麼?我們來看一下:
1.使用HOG Features進行對象檢測
2005年,Navneet Dalal和Bill Triggs闡述了面向梯度直方圖的特徵提取(HOG features),其計算簡單且適用於很多現實問題。金字塔上運行滑動窗口所獲得的每個窗口上,我們計算HOG features——被送入支持向量機(SVM)——來創建分類器。我們能夠在視頻上實時運行以進行行人檢測,人臉檢測以及其他的對象檢測用例。
2.區域卷積神經網路(R-CNN)
我們已經將對象檢測建模為一個分類問題,其效果取決於分類的準確性。深度學習興起以後,通常的想法是用一個更準確的基於卷積神經網路(CNN)的分類器代替基於HOG的分類器。但是現在有一個問題:CNN運行太慢,計算上也較為昂貴。在滑動窗口檢測器上產生的很多小塊上運行卷積神經網路是不太可能的。R-CNN通過使用被稱為選擇性搜索(Selective Search)的對象候選演算法解決了這一問題,該演算法將送至分類器的邊界框數量接近2000個候選框(Region Proposal)。選擇性搜索使用局部提示(如紋理,強度,顏色和/或內部度量等)生成對象所在的所有可能位置。現在,我們將這些邊界框送入基於CNN的分類器。請記住,CNN的全連接部分需要一個固定大小的輸入,因此,我們調整(不保留寬高比)所有生成的邊界框至一個固定大小(224*224的VGG),並送至CNN中。因此R-CNN有3個重要的部分:
(1)運行選擇性搜索生成可能的對象;
(2)將這些小塊送至CNN,然後用SVM預測每個小塊的類別;
(3)分別訓練邊界框回歸,優化小塊。
3.空間金字塔池化網路(SPP-net)
然而,R-CNN運行由選擇性搜索產生的2000個候選框需要大量的時間。SPP-net試圖解決了這一問題:只需要計算一次整個圖像的CNN representation,並且可以使用其計算由選擇性搜索生成的每個塊的CNN representation。這在和該區域對應的最後一個卷積層的特徵映射部分中,通過執行池化類型操作來完成。可通過考慮在中間層發生的下採樣(VGG中將坐標除以16),映射該區域到一個卷積層來計算與該區域對應的卷積層的矩形。
我們還面臨另外一個挑戰:我們需要為CNN的全連接層生成固定大小的輸入。因此,SPP-net引入了更多的技巧:在最後一層的卷積層後使用了空間池化,而不是傳統的最大池化。SPP-net層將一個任意大小的區域劃分為恆定數量的箱(bins)並執行最大池化,產生了恆定大小的矢量,如下圖所示:
然而,SPP-net有一個很大的缺點:通過空間池化層進行的反向傳播並不能忽略。
4. Fast R-CNN
Fast R-CNN採用了SPP-net和RCNN演算法的思想,並解決了SPP-net中的關鍵問題,即可以進行端到端的訓練。為了通過空間池化來傳播梯度,它使用一個反向傳播進行計算,這與最大池化梯度計算非常相似,其區別在於池化區域重疊,因此一個單元可以從多個區域中抽取梯度。
Fast R-CNN還在神經網路訓練中增加了邊界框回歸。因此網路中有兩個頭部:分類頭部和邊界框回歸頭部。多任務目標是Fast R-CNN的一個顯著特點,因為它不再需要單獨訓練網路來分類和定位。CNN的端到端學習減少了整體訓練時間,並且其準確性比SPP網路高。
5. Faster R-CNN
Faster RCNN有什麼改進呢?它速度更快。Fast RCNN中最慢的部分是選擇性搜索或邊框(Edge boxes),Faster RCNN採用區域生成網路(RPN)這個非常小的卷積網路代替選擇性搜索來生成感興趣區域。
為了應對長寬比和對象大小的改變,Faster R-CNN引入了anchor boxes。在每個位置,原始圖像使用3種比例的anchor boxes:128*128,256*256,512*512。同樣,寬高比也有3種比例:1:1,2:1,1:2。因此,每個位置共有9個anchor boxes,RPN可在這9個anchor boxes上預測其為背景或前景的概率。我們用邊界框回歸改進每個位置的anchor boxes。因此,RPN給出了不同大小的邊界框及其對應類別的概率。像Fast-RCNN一樣,可通過空間池化進一步傳輸不同大小的邊界框。Faster-RCNN比Fast-RCNN快十倍,Fast-RCNN的數據集類似於VOC-2007。Faster-RCNN一直都是最精確的對象檢測演算法之一的原因就在於此。下圖是R-CNN各種版本之間的比較。
基於回歸的對象檢測器
上述方法都是通過建立一個傳輸途徑(pipeline)產生第一個候選對象送至分類器或回歸頭部,將檢測作為分類問題來處理。然而,有幾種方法將檢測作為回歸問題,其中兩個最流行的是YOLO和SSD。讓我們來看一下:
6.YOLO
YOLO將檢測看做一個簡單的回歸問題,它需要一張輸入圖像並學習類別概率和邊界框坐標。YOLO將每張圖像劃分為S*S個網格,每個網格預測N個邊界框和置信度。置信度反映了邊界框的準確性及邊界框是否真正包含了一個對象(不管是什麼類)。針對訓練中的每個類,YOLO預測了每個邊界框的分類值。你可以結合兩個類來計算每個類出現在預測框中的概率。
因此,YOLO共預測了S*S*N個邊界框。然而,大部分邊界框的置信度較低,如果我們設置一個閥值(30%置信度),則可以刪除大部分邊界框。
7. Single Shot Detectors(SSD)
SSD在運行速度和準確度間取得了較好的平衡。SSD在輸入圖像上僅僅運行一個卷積網路,並計算出一個特徵映射。現在,我們在這個特徵映射上運行一個3*3大小的卷積內核,來預測邊界框和分類概率。SSD也使用了各種寬高比的anchor boxes(Faster-RCNN比較相似),並且學習了偏移量而不是學習邊界框。SSD在多個卷積層後預測了邊界框,因此能夠檢測出各種比例的對象。
面對這麼多演算法,你應該選擇哪一種?如果您對追求準確性,應該選擇Faster-RCNN;如果您更注重計算,SSD則是一個更好的建議;如果您想要較高的運行速度,而不要求精確度太高,YOLO將會是一個很好的選擇。
下圖為SSD,YOLO和Faster-RCNN在檢測不同大小對象時的性能對比。當對象為大尺寸時,SSD的精確度似乎和Faster-RCNN較為類似;當尺寸較小時,二者精確度的差距就會擴大。
希望這篇文章能讓您對當前最流行的對象檢測演算法有個直觀的理解。
以上為譯文。
本文由阿里云云棲社區組織翻譯。
文章原標題《object-detection》,譯者:Mags,審校:袁虎。
TAG:雲棲社區 |