目標檢測系列(3)—又一個 one stage 的目標檢測模型—SSD(下)
前言
在深度學習學習過程,學習理論和讀懂原始碼都是同等重要的,之前看了許多 paper,也積累了許多理論知識,不過當真的要落實到程式碼上,還是無從下手,還是停留在用的層面上。最近自由時間比較多,所以也想靜下心來,通過實現一些經典框架來培養自己將 paper 轉為 code 的能力。
位置損失函式
這部分內容是之前上一篇文章關於位置損失的補充
這裡採用了 $ L_1^{smooth} $ 損失函式
$$ t_x^j = (g_x^j - p_x^i)/p_w^i\ t_y^j = (g_y^j - p_y^i)/p_h^i\ t_w^j = \log(g_w^j/p_w^i)\ t_h^j = \log(g_h^j/p_h^i) $$
迴歸引數 $t_{x^j}$ 表示第 $j$ 個 GT 框中心點 x 偏移量 GT $g_x^j$ 減去第 $i$ 個預設框 $p_{x^i}$ 的差除以第 $i$ 預設框的寬度,那麼 $t_{w^j}$
預設框(Default box)的縮放尺度和寬高比
在 SSD 提供不同大小特徵圖,這樣設計是為了能夠檢測出不同大小的目標。在不同尺度的特徵圖下,如何定義預設框(default box)的尺度和寬高比呢? 這是這部分內容要回答的問題,在 SSD 中,是有
值得注意在 SSD 這裡每一個網格會給出一些預設框(Default box),這裡名字和錨框區分一下
在靠前(左側)的特徵圖,也就是解析度比較高的特徵圖主要用來檢測比較小的目標,而靠後(右側)特徵圖主要用來檢測比較大的目標。
這裡提供一個計算公式 $$ (w_k^a,h_k^a) = (s_k\sqrt{a_r},s_k/\sqrt{a_r}) $$
計算 $S_k$ 的公式
$$ S_k = S_{min} + \frac{S_{max} - S_{min}}{m - 1}(k-1) $$
這裡 $S_{min}$ 和 $S_{max}$ 分別的縮放比例分別是 0.2 和 0.95 , - $k$ 表示第 k 特徵層,那麼 k 取值範圍也就是 1 到 m,當 k 取 1 時,$S_k$ = $S_{min}$,當 $k$ 取 m 時候 $S_k$ 就等於 $S_{max}$ 這一點不難看出 - 假設 $S_{min} = 0.2$,$S_{max} = 0.95$ 和 $m=6$ 條件下,那麼公式就等於 $$ S_k = 0.2 + \frac{0.95 - 0.2}{6-1}(k-1) = 0.2 + 0.15(1-k) $$
$a_r$
關於 $a_r$ 的取值如下 $$ a_r \in {1,2,3,\frac{1}{2},\frac{1}{3}} $$
舉一個例子
還是以上面 $S_{min} = 0.2$、$S_{max} = 0.95$、$m=6$ 和 $a_r$ 取值作為已知條件來計算當 $k=1, a_r = \frac{1}{2}$ 時候比例。
$$ S_4 = 0.2 + 0.15(4-1) = 0.65\ w_4^a = 0.65 \sqrt{1/2} = 0.46\ h_4^a = 0.65 / \sqrt{1/2} = 0.92 $$
這裡還得特殊說明一下,在當 $a_r = 1$ 時候,還會額外新增一個預設的預設框(default box),這個錨框計算比例用 $S^{\prime}k$ 來表示,和 $S_k$ 計算的公式約有不同 $$ S_k^{\prime} = \sqrt{S_kS{k+1}} $$
$$ S_{5} = 0.2 + 0.15(1-5) = 0.8 \ S_4 = \sqrt{S_4S_5} = \sqrt{0.65\times 0.8} =0.72 $$
那麼也就是說每一個錨點都提供 5 + 1 也就是 6 預設的預設框。其實程式碼實現與 paper 上關於尺度和寬高比略有不同。
這裡還要說明一下,在圖上橘黃色表示輸出特徵層上,僅有 4 個 default box 分別是 $(1,2,\frac{1}{2})$ 而其他位置輸出特徵層上 default box 為 6 個 $1, 2, \frac{1}{2}, 3 \frac{1}{3}$
對於預設框中心點的取值
那麼對於中心點又該如何取值呢? 我們知道不同特徵圖大小不同,$f_k$ 這裡下標表示第 k 層輸出特徵圖,$i,j \in [0,|f_k|]$,那麼預設框(Default box)預設中心點座標 $c_x,c_y$ 就可以用下面公式來計算 $$ (c_x,c_y) = \left( \frac{i+0.5}{|f_k|},\frac{j+0.5}{|f_k|} \right) $$
下面通過一張表來展示特徵圖中預設框
| 特徵層 | 特徵層的大小 |預設框尺寸 |預設框寬高比 |預設框數量 | | --- | --- |--- | --- | --- | | 1 | $38 \times 38$ | 21 | 1,2,1/2 | $38 \times 38 \times 4$ | | 2 | $19 \times 19$ | 45 | 1,2,3,1/2,1/3 | $19 \times 19 \times 6$ | | 3 | $10 \times 10$ | 99 | 1,2,3,1/2,1/3 | $10 \times 10 \times 6$ | | 4 | $5 \times 5$ | 153 | 1,2,3,1/2,1/3 | $5 \times 5 \times 6$ | | 5 | $3 \times 3$ | 207 | 1,2,1/2 | $3 \times 3 \times 4$ | | 6 | $1 \times 1$ | 261 | 1,2,1/2 | $1 \times 1 \times 4$ |
我們可以結合上面這張圖來解釋 - 較遠處目標,有 1 個特徵圖負責預測,也就是會給出 4 個預設框(default boxes)分別是 1,2,1/2 還有在不比例下計算的比例為 1 的邊界框 - 較近處的目標,可能由 4 特徵圖負責預測,那麼就是給出 6 預設框
推理
我們知道在 SSD 一共有 6 輸出特徵層,那麼如何在在 6 個輸出特徵層上進行預測呢?其實使用一個 $3 \times 3$ 的卷積進行預測每一個位置的輸出。
在推理過程中,例如對於$m\times n\times p$ 這裡 m 和 n 是特徵層的大小,而 p 為通道數,在預測過程中,會用 $3 \times 3 \times p$ 卷積核來預測分類和邊界框相對於預設框的偏移量。使用這樣卷積核數量是根據預測輸出資料結構所確定的,每一個位置會為 k 個預設框每一個預設框輸出一個類別概率分佈和 一箇中心點和寬高偏移量的值。那麼也就是 $k(c + 4)$。
注意這裡 c 是包括背景,例如對於 pascal VOC 20 個類別來說,C 就應該是 20 + 1 = 21,對於每一個預設框只有 4 的位置迴歸,這個與類別無關
正負樣本不均衡
現在來看一看在 SSD 中,是如何解決正負樣本不均衡的問題,那麼在 SSD 關於正負樣本定義又是如何定義的呢? - 正樣本: 對於正樣本選擇,只要滿足以下兩個條件之一即可,預設框(default box)與真實框(ground truth)的 IoU 最大的預設框,還有就是對於預設框只要滿足與任意真實框的 IoU 大於 0.5 - 負樣本: 其實不滿足正樣本的預設框都應該計算為負樣本,之前我們已經計算過了一共生成了 8700 多個預設框,所以還需要在這麼多負樣本中篩選,通過 high confidence loss 進行排序,這裡 confidence loss 越大也就是網路越容易將其預測為正樣本的概率越大(也就是預設框在背景處卻給出很高存在目標的分數),然後按照排序從負樣本中選取數量,選取的負樣本數量和正樣本數量保持 3:1 的比例。
這裡負樣本通常是 IoU 小於 0.3 的預設框會記做負樣本。
Atrous/Dilated Convolution
膨脹卷積也稱空洞卷積,關於這可能以後會用一次分享來解釋,這裡現在只是清楚用來進行上取樣,這裡採用膨脹卷積主要加快速度,並且增加了視野域,這裡關於膨脹卷積不做為重點,如果想了更多關於膨脹卷積(Dilated Convolution)的資訊可以去看 SAPP 這篇論文。
參考文獻
- SSD: Single Shot MultiBox Detector
我正在參與掘金技術社群創作者簽約計劃招募活動,點選連結報名投稿。
- 無人駕駛—Scenario 場景
- 深入學習入門系列(1)—線性迴歸(上)
- 深入淺出 Pytorch 系列 — 優化器的選擇(2) Adagrad 、MSProp 和 adam
- 目標檢測系列(6)—YOLOv4 讓每個人都能體驗深度學習給我們帶來的快樂(中)
- 自己寫—YOLOv3(1)—網路架構
- 目標檢測系列(5)—讓每個人都能體驗深度學習給我們帶來的快樂—YOLOv4(上)
- 日更 SLAM 一邊理論一邊實踐第三天—提取特徵(3)
- 目標檢測系列(4)— 在目標檢測中不能不聊的 YOLOv3
- 目標檢測系列(3)—又一個 one stage 的目標檢測模型—SSD(下)
- 雖然有些過時,但如果自己動手實現一遍 YOLOv1 勢必會有所收穫(1) 網路架構
- 雖然有些過時,但如果自己動手實現一遍 YOLOv1 勢必會有所收穫(2) 損失函式
- 做一件有趣的事,嘗試學著自己動手寫一個深度學習框架(1)—深入反向傳播
- 難捨的機器學習(1)—最小二乘法和極大似然來解線性迴歸
- 目標檢測系列(2)—又一個 one stage 的目標檢測模型—SSD(上)
- 目標檢測系列—深度解讀 YOLOv1 (1)
- 從頭用 numpy 來寫一個識別 MNIST 手寫資料的神經網路
- 推薦系統看到此可以稍作休息(1)—基於協同過濾構建推薦引擎
- 動手寫一個深度學習框架(1) 用 pytorch 搭建神經網路
- 深度學習從理論到實踐—logistic 迴歸(1)
- 從放棄到重啟 C —new 和 delete 關鍵字