《論文研讀系列》SSD-Single Shot Multibox Detector
SSD: 一種單次多框檢測器
- 論文| Single Shot Multibox Detector
- 鏈接|
SSD: Single Shot MultiBox Detector
- 作者| Wei Liu Email author
- http://cv-tricks.com/object-detection/single-shot-multibox-detector-ssd/
設計思想 :
小白之所以重新溫習下SSD,是覺得SSD演算法可以更好地幫助理解目標檢測中其他前進的演算法。SSD僅在輸入圖像上運行一個卷積網路並計算特徵映射。作者在這個特徵映射上運行一個3×3大小的卷積核來預測邊界框和分類概率。SSD也使用類似於Faster-RCNN的各種寬高比的anchor boxes ,並學習偏移而不是學習box。為了處理這個尺度,SSD在多個卷積層之後預測邊界框。 由於每個卷積層以不同的比例操作,因此能夠檢測各種比例的目標。
重溫目的:
SSD 在速度和準確度之間取得了良好的平衡 ,封面的圖大家可以對比下。這裡同樣在檢測不同尺度的目標大小性能給出一個比較直觀簡單的圖:
這裡可以看出來,比較主流的幾個網路框架在檢測小目標的精度普遍較低,這這較低的根本原因接下來,我會通過SSD來講述下。同時也將SSD與其它目標檢測網路聯繫起來,追本溯源。比較直觀簡單的描述大家可以參照
朱文文:《論文三部曲》Yolo- SSD-Yolo v2![圖標](http://i1.wp.com/pic2.zhimg.com/v2-489f1588af383ad5ff7acf931946dc21_180x120.jpg)
介紹步驟:
- 檢測的基本概念
- 滑動窗口檢測
- 減少滑動窗口方法的冗餘計算
- 修改後網路的訓練方法
- 處理對象的尺度
1. 目標檢測基本概念
目標檢測被建模為分類問題。分類是要預測圖像中存在的物體的標籤,而檢測比這更進一步,其還需要發現那些對象的位置。在分類問題中,演算法假定物體在圖像中佔據較大的部分。
上面兩張圖我分別打上了下標,為什麼這麼說呢?如圖2,不同尺度/大小的多個物體出現在不同的位置時,檢測成為了更為需要的手段。 因此,檢測的目的是找到圖像中的所有目標對象,預測它們的標籤/類並為這些對象指定一個邊界框。
所以類別與目標的位置一起預測稱為目標檢測,如圖3
在圖像分類中,我們預測每個類別的概率,而在目標檢測中,我們也預測包含該類別的目標的邊界框。所以,網路的輸出應該是:
1.類概率(如分類)
2.邊界框坐標。我們用cx(中心的x坐標),cy(中心的y坐標),h(物體的高度),w(物體的寬度)
類概率還應該包含一個表示背景的附加標籤,因為圖像中的許多位置不對應任何對象。
為了方便起見,我們假設我們有一個包含貓和狗的數據集。數據集中的圖像可以包含任意數量的貓和狗。 所以,我們有3種可能的分類結果,即貓[1 0 0],狗[0 1 0],背景[0 0 1]。
目標檢測作為圖像分類問題
訓練檢測網路的簡單策略是訓練分類網路。 這個分類網路將有三個輸出,每個輸出表示貓,狗和背景的概率。對於訓練分類器,我們需要物體位置適中的圖片和相應的類別標籤。
我們舉一個例子(figure·3),看看如何準備分類網路的訓練數據。
為了做到這一點,我們將首先從圖像中裁剪出多個圖像塊。 下圖顯示了從圖像裁剪的示例塊。
對於準確包含目標的塊2,我們用目標類別進行標記。 所以我們把類別「貓」分配給塊2作為它的標籤。 假定輸出的概率向量依次對應貓,狗和背景,那麼塊2的標籤就變成[1 0 0]。 然後,對於不包含任何目標對象的塊(1和3),我們分配標籤「背景」。因此,這些塊的類別標籤是[0 0 1]。
現在,我們需要為我們的數據集添加標籤,這些數據集可以用來訓練一個分類的卷積網路。
2.滑動窗口檢測器:
分類網路訓練完成後,可以用滑動窗口的方式對新圖像進行檢測。首先,我們把一個特定大小的窗口(藍色框)在圖像的不同的位置上滑動(如下圖所示)。
然後,我們裁剪包含在框中的塊,並將它們調整為卷積神經網路的輸入大小。 接著,我們將這些塊送入網路以獲取目標對象的標籤。 我們用較小的窗口大小重複這個過程,以便能夠捕捉較小尺寸的對象。 所以這個想法是,如果圖像中存在一個對象,我們將有一個適當包含對象的窗口,並可以生成對應於該對象的標籤。 這裡是一個動態圖,顯示了在圖像上運行的滑動窗口:
但是,應該裁剪多少塊以覆蓋所有的物體?我們不僅需要在多個地方進行塊裁剪,而且還要在多個尺度上裁剪,因為對象可以是任意大小的。這將相當於要產生數以千計的塊,並將所有塊輸入到網路中。這種做法將導致在單個圖像上進行預測需要大量的時間。
那麼讓我們來看看減少這個時間的方法。
3.減少冗餘計算以縮短時間
現在讓我們考慮在附近位置的不同顏色的框,如圖5所示的多個裁剪框。
我們可以看到這兩個塊之間有很多重疊(由陰影區域描繪)。這意味著,當他們分開(經過裁剪和尺寸調整)輸入到網路時,網路將對這個重複的部分進行一組相同的計算。這可以很容易地使用在SPP-Net中引入、並由Fast R-CNN普及的思想。我們舉一個例子來詳細的了解這個網路。
下面的圖6顯示了最初通過3個卷積層的尺寸為12X12的圖像,每個卷積層具有3×3的濾波器尺寸(具有不同的步長和最大池化操作)。注意,在經過3個卷積層之後,我們得到一個大小為3×3×64的特徵圖,這個特徵圖被稱為倒數第二個特徵圖,即應用在分類層之前的特徵圖。我們之所以這樣命名,是因為我們會在後續內容中反覆提及。在這個3X3特徵圖的基礎上,我們應用了一個卷積核尺寸為3X3的卷積層。在這裡使用三組這樣的3X3濾波器來獲得在網路末端輸出的3個1X1的特徵映射,其對應於三種類別的概率。
現在,我們將使用更大的圖像來顯示輸入圖像和特徵圖之間的直接映射。 讓我們增加圖像到14X14(圖7)。 我們可以看到,左上象限(中心在6,6)的12X12塊在倒數第二個特徵圖產生3×3的塊(藍色),最後在最終的特徵圖(藍色)中得到1×1的分數。 位於右上象限(以紅色顯示,中心為8,6)的12X12大小的圖像,其倒數第二個特徵圖相應地在最後一層產生1X1的得分(用紅色標記)
正如你所看到的,不同的12X12塊在倒數第二個特徵圖中會有不同的3X3表示,最後在輸出層產生相應的分數。
卷積層在計算上是非常昂貴的,並且計算每個塊將花費很長時間。但是,使用這個方案,我們可以避免重複計算不同塊之間的公共部分。這裡我們對整個圖像的特徵圖只進行一次計算。然後,由於我們知道倒數第二個特徵圖上的不同部分映射到圖像的不同區域,我們可以直接在其上進行分類(分類層)。這就像在卷積特徵圖上執行滑動窗口,而不是在輸入圖像上執行滑動窗口。所以這節省了大量的計算。
總而言之,我們一次性將整個圖像輸入到網路中,並在倒數第二個特徵圖上獲取特徵。然後我們在這個特徵圖的頂部運行一個3X3的滑動窗口進行檢測,以獲得不同的塊的類別分數。
雖然有一個小問題。並非來自圖像的所有塊都能在輸出中表示。在我們的例子中,12X12的塊集中在(6,6),(8,6)等(在圖中標出)。 (7,6)作為中心跳過,因為在網路中間存在池化。一會兒,我們將看看如何處理這些類型的對象/塊。
默認框/錨框
在分類輸出中直接表示的框被稱為默認框或錨框。在上面的例子中,中心(6,6)和(8,6)處的框是默認框,其默認大小是12X12。請注意,默認框的位置和大小取決於網路結構。
4.修改後網路的訓練方法
讓我們看看如何通過另一個例子來訓練這個網路。在這裡,我們以一個更大的輸入圖像為例,一個包含貓的24X24圖像。如下
它首先通過類似於上面的例子的卷積層,併產生尺寸為6×6的輸出特徵圖。
為了準備訓練集,首先,我們需要為分類輸出中的所有預測分配類別標籤。讓我們通過(i,j)對7,7格的輸出圖的位置進行索引。我們已經知道每個輸出對應的默認框。作為參考,圖中左上角和右下角的顏色標記了輸出及其對應的結果。現在由於輸出(6,6)對應的塊上有一個貓,所以類標籤變成[1 0 0]。由於位置(0,0),(0,1),(1,0)等區塊中沒有任何對象,所以它們的類標籤是[0 0 1]。
其他輸出的塊只部分包含了貓。讓我們看看他們的任務是如何完成的。
對於部分覆蓋的圖像塊的類別標籤指定
為了理解這一點,我們在(5,5)處輸出一個塊。圖中顯示了該塊相對於類別貓的程度(洋紅色)。我們可以看到對象稍微偏離了方框。方框並不完全包括貓,但有一個較大的重疊。
所以對於它的類別標籤設定,我們有兩個選擇:或者把這個圖像塊標記為屬於背景的塊,或者把它標記為貓。將其標記為背景(bg)將意味著只有一個包含該對象的框是可以標記為正例的。而所有其他的框都會被標記為背景。這有兩個問題。首先,訓練將是高度不均衡的(物體和bg類之間的大的不平衡)。其次,如果對象不適合任何框,那麼將意味著將不存在用於對象標記的框。
所以我們採取第二種解決方案,把這個圖像塊標記為貓。但是在這個解決方案中,我們需要從對象中心處理這個框中心的偏移量。比方說,在我們的例子中,cx和cy分別是沿著x和y方向從對象中心開始的框的中心偏移量(圖中也顯示出了)。我們需要設計一種方法,使得對於這個圖像塊,網路也可以預測這些偏移量,從而可以找到一個對象的真實坐標。
因此,對於每個位置,我們在網路中再次添加兩個輸出(除類概率外),代表中心的偏移量。我們把這個網路的預測稱為「ox」和「oy」。為了使這些輸出預測cx和cy,我們可以使用回歸損失。平方誤差損失可以用於這種類型的回歸。檢測的論文中通常使用平滑的L1損失形式。我們將跳過這個小討論。
5.處理尺度變化
現在我們已經處理了不同位置的對象,讓我們看看如何處理對象的尺度變化。
我們將討論兩種不同的技術來處理兩種不同類型的對象。一種類型是指尺寸接近12×12像素(框的默認尺寸)的物體。另一種類型是指尺寸與12X12大不相同的物體。
對象的大小接近12X12
對於大小與12X12類似的對象,我們可以用類似於偏移量預測的方式來處理它們。假設對象的真實高度和寬度分別是h和w。所以我們再給輸出添加兩個維度來表示高度和寬度(oh,ow)。然後我們再次使用回歸來使這些輸出預測真實的高度和寬度。
物體遠小於12X12
處理與12X12大小非常不同的對象是有點棘手的。為了論證方便,讓我們假設我們只想處理遠小於默認大小的對象。
對此的一個解決方案是在網路的每個特徵圖(在每個卷積層之後的輸出)之上進行預測,如圖9所示。預測層在圖中顯示為從基礎網路的分支。這是Single Shot Multibox Detector中引入的關鍵思想。讓我們詳細了解這一點。
使用所有特徵進行預測
早些時候,我們只使用倒數第二個特徵圖,並應用3X3的卷積核來得到輸出(概率,中心,框的高度和寬度)。這裡我們在網路的所有特徵圖上應用3X3卷積來預測它們的全部。來自較低層的預測有助於處理較小尺寸的物體。這是怎麼回事?
請記住,特徵圖中的一個位置僅表示圖像的一個片段/塊。這就是所謂的感受野大小。我們已經在我們的示例網路中看到了這一點,倒數第二個特徵圖上的預測受到原圖中12X12塊的影響。
卷積網路本質上是分層的。而且每一個後續的層代表一個複雜性越來越高的實體,在這樣做的時候,他們對輸入圖像的感受野越來越大。因此,在我們的網路倒數第二層之上的預測具有最大的感受野尺寸(12X12),因此它可以處理較大尺寸的物體。淺層的感受野尺寸較小,可以代表較小尺寸的物體。
在我們的示例網路中,第一個特徵圖頂部的預測具有5X5的感受野大小(圖9中的標記的特徵圖1)。它可以很容易地使用簡單的計算。在圖中已經用圖解說明了。類似地,在特徵圖之上的預測考慮了9X9的塊。所以我們可以看到,隨著深度的增加,感受野的尺寸也在增加。
這意味著我們可以通過使用感受野大小相似的層中的特徵來處理大小不同的對象。
就像以前一樣,我們將網路中不同特徵圖的默認框與不同的大小和位置關聯起來。
現在,在訓練階段,我們將一個對象與默認大小最接近對象大小的特徵圖相關聯。例如,如果對象的大小是6X6像素,我們將使用feat-map2來預測這樣的對象。因此,我們首先根據對象的位置在feat-map2的輸出中找到相關的默認框。然後我們把它的類別信息賦予這個框。這種技術可以確保任何特徵圖不必處理目標尺寸超出其承受範疇的對象。這樣就給了網路更大的辨別能力。
因此,我們現在可以處理尺寸與12X12大小不同的物體。
結論
這篇博客從理論角度總結了SSD的概況。SSD還有更多的細節,例如為每個分類層添加更多的輸出以處理形狀不對稱的對象(偏斜縱橫比)。此外,SSD論文從VGG網路中開創出一個新的網路,其可以減少層的感受野大小(atrous演算法)。我認為從SSD論文中可以很容易地理解這些細節。
推薦閱讀:
TAG:目標檢測 | 計算機視覺 | 深度學習DeepLearning |