SSD(Single Shot Detection)是一個流行且強大的目標檢測網絡,網絡結構包含了基礎網絡(Base Network),輔助卷積層(Auxiliary Convolutions)和預測卷積層(Predicton Convolutions)。
本文包含了以下幾個部分:
(1)理解SSD網絡算法所需要理解的幾個重要概念
(2)SSD網絡框架圖
(3)SSD網絡中幾個重要概念的詳細解釋
(4)SSD網絡如何定位目標
(5)SSD網絡的算法流程圖
(5)小結
1.理解SSD網絡所需要理解的幾個重要概念
Single Shot Detection :早期的目標檢測系統包含了兩個不同階段:目標定位和目標檢測,這類系統計算量非常耗時,不適用實際應用。Single Shot Detection模型在網絡的前向運算中封裝了定位和檢測,從而顯著提高了運算速度。
多尺度特徵映射圖(Multiscale Feature Maps):小編認爲這是SSD算法的核心之一,原始圖像經過卷積層轉換後的數據稱爲特徵映射圖(Feature Map),特徵映射圖包含了原始圖像的信息。SSD網絡包含了多個卷積層,用多個卷積層後的特徵映射圖來定位和檢測原始圖像的物體。
先驗框(Priors):在特徵映射圖的每個位置預先定義不同大小的矩形框,這些矩形框包含了不同的寬高比,它們用來匹配真實物體的矩形框。
預測矩形框:每個特徵映射圖的位置包含了不同大小的先驗框,然後用預測卷積層對特徵映射進行轉換,輸出每個位置的預測矩形框,預測矩形框包含了框的位置和物體的檢測分數。比較預測矩形框和真實物體的矩形框,輸出最佳的預測矩形框。
損失函數:我們知道了預測的矩形框和真實物體的矩形框,如何計算兩者的損失函數?損失函數包含了位置損失函數和分類損失函數,由於大部分矩形框只包含了背景,背景的位置不需要定位,因此計算兩者的位置損失函數用L1函數即可。我們把背景稱爲負類,包含了物體的矩形框稱爲正類,不難理解圖像中大部分的矩形框只包含了負類,若用全部的負類和正類來計算損失函數,那麼訓練出來的模型偏向於給出負類的結果。解決辦法是在計算分類損失函數時,我們只選擇最難檢測的幾個負類和全部正類來計算。
非極大值抑制(Non-maximum Suppression):若兩個矩形框都包含了相同的物體,且兩個矩形框的重疊度較高,則選擇分數較高的矩形框,刪除分數較低的矩形框。
2.SSD網絡框架定義及其應用
SSD網絡包含了基礎網絡,輔助卷積層和預測卷積層:
- 基礎網絡:提取低尺度的特徵映射圖(可用常見的MobileNet、ShuffleNet替代)
- 輔助卷積層:提取高尺度的特徵映射圖(可隨意設計)
- 預測卷積層:輸出特徵映射圖的位置信息和分類信息
下面介紹SSD網絡的這三個部分
基礎網絡
基礎網絡的結構採用了VCG-16網絡架構,VCG-16網絡如下圖:
VCG-16網絡包含了卷積層和全連接層(FC Layers),全連接層的任務用來分類,由於基礎網絡只需要提取特徵映射圖,因此需要對全連接層用卷積層代替,這一部分的參數和VCG-16網絡的卷積層參數用遷移學習的方法獲取。
基於VCG網絡架構的基礎網絡如下圖:
輔助卷積層
輔助卷積層連接基礎網絡最後的特徵映射圖,通過卷積神經網絡輸出4個高尺度的特徵映射圖:
預測卷積層
預測卷積層預測特徵映射圖每個點的矩形框信息和所屬類信息,如下圖:
3.SSD網絡中幾個重要概念的詳細解釋
如何表示矩形框
我們用矩形框定位物體的位置信息和所屬類,如下圖:
常用四個維度表示矩形框信息,前兩個維度表示矩形框的中心點的位置,後兩個維度表示矩形的寬度和高度。爲了統一,我們使用歸一化的方法表示矩形框:
上圖貓的矩形框爲:(0.78,0.80,0.24,0.30)
如何衡量兩個矩形框的重疊度
SSD算法中有兩處需要計算矩形框的重疊度,第一處是計算先驗矩形框和真實矩形框的重疊度,目的是根據重疊度確定先驗框所屬的類,包括背景類;第二處是計算預測矩形框和真實矩形框的重疊度,目的是根據重疊度篩選最優的矩形框。
我們用Jaccard Index或交併比(IoU)衡量矩形框的重疊度。交併比等於兩個矩形框交集的面積與矩形框並集的面積之比,如下圖:
損失函數算法
預測層預測了映射圖每個點的矩形框信息和分類信息,該點的損失值等於矩形框位置的損失與分類的損失之和。
首先我們計算映射圖每個點的先驗框與真實框的交併比,若交併比大於設置的閾值,則該先驗框與真實框所標記的類相同,稱爲正類;若小於設置的閾值,則認爲該先驗框標記的類是背景,稱爲負類。
然後預測層輸出了映射圖每個點的預測框,預測框的標記與先驗框的標記相同。
預測框與真實框的損失函數等於預測框位置的損失與分類的損失之和。
1. 預測框位置的損失:
由於不需要用矩形框定位背景類,所以只計算預測正類矩形框與真實矩形框的位置損失:
我們用 nn.L1Loss函數計算矩形框位置的損失。
n1.L1Loss函數:
torch.nn.L1Loss(size_average=None, reduce=None, reduction='mean')
公式:
其中N表示樣本個數。
如果reduction不爲'none'(默認設爲'mean'),則
假設共有N個正類的預測矩形框,每個矩形框的位置爲:
其中 i = 1,2,...,N
每個預測矩形框對應的正類真實矩形框的位置爲:
如下圖的預測矩形框和對應的正類真實矩形框:
損失函數爲:
2.預測類的損失:
由第一節的損失函數介紹可知,大部分的預測矩形框包含了負類(背景類),容易知道一張圖中負類的個數遠遠多於正類,若我們計算所有類的損失值,那麼訓練出來的模型會偏向於預測負類的結果。
因此我們選擇一定數量的負類個數和全部的正類個數來訓練模型,負類個數N_hn,正類個數N_p,負類個數與正類個數滿足下式:
我們知道了負類個數,如何從數量龐大的負類中選擇所需要的負類個數?本文采用了最難檢測到負類的預測框作爲訓練的負類,稱爲Hard Negative Mining。現在我們知道了如何選擇負類,那麼如何預測分類損失函數?關於多分類任務,我們常用交叉熵來評價分類損失函數。
4.SSD網絡結構如何定位目標
前面介紹通過先驗框和真實框的交併比來分類,若交併比大於閾值則爲正類(包含某個特定物體的類),若交併比小於閾值則爲負類(背景類)。
預測框與先驗框的個數相等,若有多個相同正類的預測框的交併比很大(如下圖),如何選擇最優的預測框?
上圖的五個預測框預測了三隻狗和兩隻貓,三隻狗的交併比如下表:
設置閾值爲0.5,因爲預測dog B的分數最大(0.96),且dog B和dog C的交併比大於閾值,因此一致dog C的預測框。由於dog A與其他預測框的交併比小於閾值,因此保留dog A的預測框。即狗的輸出結果爲兩個。
貓的預測矩形框如下表:
同理,由於cat A的預測分數最高,且cat B與cat A交併比大於閾值,因此抑制cat B預測框。
上述方法稱爲非極大值抑制(Non-Maximum Suppression)。
根據非極大值抑制方法,貓狗的預測框如下圖:
5.SSD網絡的算法流程
介紹了SSD網絡結構以及理解該網絡所需要的基礎概念,基於這些知識,下面介紹SSD網絡的算法流程。
訓練階段:
預測階段:
相信看到最後的這兩張圖對整個SSD的原理會有恍然大悟的感覺,總體來說,SSD最核心的就是引入了多尺度的思想,而其"基礎卷積層"我們可以使用常見的網絡結構去替換,例如:使用MobileNet、ShuffleNet等網絡結構對SSD網絡進行加速處理等。
PyTorch實現:
https://github.com/sgrvinod/a-PyTorch-Tutorial-to-Object-Detection
感謝WX公衆號:計算機視覺life,機器學習算法那些事