目标检测(后处理):从 NMS 到 Soft-NMS 到 Softer NMS
目標檢測(后處理):從 NMS 到 Soft-NMS 到 Softer NMS
- 1、NMS
- 2、Soft-NMS
- 3、Softer-NMS
- 4、總結
1、NMS
非最大抑制(NMS)主要用于基于深度學習的目標檢測模型輸出的后處理,從而去除冗余的檢測框,獲得正確的檢測結果。示意圖如下:
算法流程:
- mmm 為置信度分數最高的框,將 mmm 放入 DDD,并將它從 BBB 中刪除
- 對于 BBB 中余下的每個框 bib_ibi?:
如果 iou(m,bi)≥Ntiou(m, b_i)\ge N_tiou(m,bi?)≥Nt?,則將 bib_ibi? 從 BBB 中刪除
通過分析可以發現 NMSNMSNMS 存在以下幾個缺陷:
圖 1: 紅色框的置信度比綠色框的置信度高,兩個框重疊較多,NMS 會將綠色框過濾
圖 2: (a)(a)(a) 中兩個邊界框位置都不夠精確;(b)(b)(b) 中置信度較高的邊界框的左邊界精確度較低
代碼:
時間復雜度:O(n2)O(n^2)O(n2),其中 nnn 為待篩選檢測框數量
2、Soft-NMS
針對 NMSNMSNMS 存在的第一個問題,通過分析發現主要是因為在 NMSNMSNMS 算法中每次直接將與 mmm 的 iouiouiou 大于等于 NtN_tNt? 的檢測框直接刪除導致的。 因此基于 NMSNMSNMS 算法,Soft?NMSSoft-NMSSoft?NMS 進行了如下改進:
將于 mmm 重疊的檢測框置信度降低,而不是直接刪除。
這樣可能存在另一個問題,同一目標的其他檢測框也可能被保留下來。因此需要設計合適的策略,既保留相近的其他目標,又刪除重復檢測的目標。直覺上可以發現通常重復的檢測框具有更高的重疊,因此可以根據 iouiouiou 大小來設計置信度分數下降的程度。置信度修正策略如下:
si={si,iou?(M,bi)<Ntsi(1?iou?(M,bi)),iou?(M,bi)≥Nts_{i}=\left\{\begin{array}{ll}{s_{i},} & {\operatorname{iou}\left(\mathcal{M}, b_{i}\right)<N_{t}} \\ {s_{i}\left(1-\operatorname{iou}\left(\mathcal{M}, b_{i}\right)\right),} & {\operatorname{iou}\left(\mathcal{M}, b_{i}\right) \geq N_{t}}\end{array}\right. si?={si?,si?(1?iou(M,bi?)),?iou(M,bi?)<Nt?iou(M,bi?)≥Nt??
該策略為 iouiouiou 的線性函數,同樣可以使用高斯懲罰函數
si=si?e?iou?(M,bi)2σ,?bi?Ds_{i}=s_{i}*e^{-\frac{\mathrm{i} \text { ou }\left(\mathcal{M}, b_{i}\right)^{2}}{\sigma}}, \forall b_{i} \notin \mathcal{D} si?=si??e?σi?ou?(M,bi?)2?,?bi?∈/?D
算法流程如下圖所示:
代碼:
# -*- coding:utf-8 -*- import numpy as np def py_cpu_softnms(dets, Nt=0.3, sigma=0.5, thresh=0.5, method=2):"""py_cpu_softnms:param dets: boexs 坐標矩陣 format [x1, y1, x2, y2, score]:param Nt: iou 交疊閾值:param sigma: 使用 gaussian 函數的方差:param thresh: 最后的分數閾值:param method: 使用的方法,1:線性懲罰;2:高斯懲罰;3:原始 NMS:return: 留下的 boxes 的 index"""N = dets.shape[0]# the order of boxes coordinate is [x1,y1,x2,y2]x1 = dets[:, 0]y1 = dets[:, 1]x2 = dets[:, 2]y2 = dets[:, 3]areas = (x2 - x1 + 1) * (y2 - y1 + 1)for i in range(N):# intermediate parameters for later parameters exchangetB = dets[i, :4]ts = dets[i, 4]ta = areas[i]pos = i + 1if i != N-1:maxscore = np.max(dets[:, 4][pos:])maxpos = np.argmax(dets[:, 4][pos:])else:maxscore = dets[:, 4][-1]maxpos = -1if ts < maxscore:dets[i, :] = dets[maxpos + i + 1, :]dets[maxpos + i + 1, :4] = tBdets[:, 4][i] = dets[:, 4][maxpos + i + 1]dets[:, 4][maxpos + i + 1] = tsareas[i] = areas[maxpos + i + 1]areas[maxpos + i + 1] = ta# IoU calculatexx1 = np.maximum(dets[i, 0], dets[pos:, 0])yy1 = np.maximum(dets[i, 1], dets[pos:, 1])xx2 = np.minimum(dets[i, 2], dets[pos:, 2])yy2 = np.minimum(dets[i, 3], dets[pos:, 3])w = np.maximum(0.0, xx2 - xx1 + 1)h = np.maximum(0.0, yy2 - yy1 + 1)inter = w * hovr = inter / (areas[i] + areas[pos:] - inter)# Three methods: 1.linear 2.gaussian 3.original NMSif method == 1: # linearweight = np.ones(ovr.shape)weight[ovr > Nt] = weight[ovr > Nt] - ovr[ovr > Nt]elif method == 2: # gaussianweight = np.exp(-(ovr * ovr) / sigma)else: # original NMSweight = np.ones(ovr.shape)weight[ovr > Nt] = 0dets[:, 4][pos:] = weight * dets[:, 4][pos:]# select the boxes and keep the corresponding indexesinds = np.argwhere(dets[:, 4] > thresh)keep = inds.astype(int).T[0]return keep算法時間復雜度:O(n2)O(n^2)O(n2),其中 nnn 為待篩選檢測框數量
注意:
通過對比可以看出,原始 NMSNMSNMS 與 Soft?NMSSoft-NMSSoft?NMS 算法中的模式 333 等價,也就是說,刪除 iouiouiou 過高的重疊框等價于將該重疊框置信度分數置 000 。
3、Softer-NMS
Soft?NMSSoft-NMSSoft?NMS 只解決了三個問題中的第一個問題。對于第二個問題,分類置信度分數和框的 iouiouiou 不是強相關,因此需要一種新的方法來衡量框的位置置信度。
作者假設邊界框的 444 個坐標值之間相互獨立,并使用單變量高斯分布來預測位置置信度。
PΘ(x)=12πσ2e?(x?xe)22σ2P_{\Theta}(x)=\frac{1}{\sqrt{2 \pi \sigma^{2}}} e^{-\frac{\left(x-x_{e}\right)^{2}}{2 \sigma^{2}}} PΘ?(x)=2πσ2?1?e?2σ2(x?xe?)2?
其中 Θ\ThetaΘ 為可學習參數的集合,xex_exe? 為被估計的邊界框位置。標準差 σ\sigmaσ 衡量預測的不確定性,當 σ→0\sigma \rightarrow0σ→0 時,表示網絡對預測的位置的置信度很高。
GTGTGT 邊界框置信度也可以使用高斯分布來表示,當 σ→0\sigma \rightarrow0σ→0 時,變成 DiracdeltaDirac~deltaDirac?delta 函數:
PD(x)=δ(x?xg)P_{D}(x)=\delta\left(x-x_{g}\right) PD?(x)=δ(x?xg?)
其中,xgx_gxg? 為 GTGTGT 邊界框位置。
KL 損失函數
目標定位的目標是估計參數 Θ^\hat{\Theta}Θ^,使 NNN 個樣本的 PΘ(x)P_{\Theta}(x)PΘ?(x) 和 PD(x)P_{D}(x)PD?(x) 之間的 KLKLKL 散度最小。
Θ^=arg?min?Θ1N∑DKL(PD(x)∥PΘ(x))\hat{\Theta}=\underset{\Theta}{\arg \min } \frac{1}{N} \sum D_{K L}\left(P_{D}(x) \| P_{\Theta}(x)\right) Θ^=Θargmin?N1?∑DKL?(PD?(x)∥PΘ?(x))
使用 KLKLKL 散度作為回歸損失函數,對于單個樣本:
Lreg=DKL(PD(x)∥PΘ(x))=∫PD(x)log?PD(x)dx?∫PD(x)log?PΘ(x)dx=(xg?xe)22σ2+log?(σ2)2+log?(2π)2?H(PD(x))\begin{aligned} L_{r e g} &=D_{K L}\left(P_{D}(x) \| P_{\Theta}(x)\right) \\ &=\int P_{D}(x) \log P_{D}(x) \mathrmze8trgl8bvbq x-\int P_{D}(x) \log P_{\Theta}(x) \mathrmze8trgl8bvbq x \\ &=\frac{\left(x_{g}-x_{e}\right)^{2}}{2 \sigma^{2}}+\frac{\log \left(\sigma^{2}\right)}{2}+\frac{\log (2 \pi)}{2}-H\left(P_{D}(x)\right) \end{aligned} Lreg??=DKL?(PD?(x)∥PΘ?(x))=∫PD?(x)logPD?(x)dx?∫PD?(x)logPΘ?(x)dx=2σ2(xg??xe?)2?+2log(σ2)?+2log(2π)??H(PD?(x))?
分析可知,當 xex_exe? 預測不準確時,網絡預測更大的 σ2\sigma^2σ2 使 LregL_{reg}Lreg? 更小。log(2π)2\frac{log(2\pi)}{2}2log(2π)? 和 H(PD(x))H(P_D(x))H(PD?(x)) 與估計參數 Θ\ThetaΘ 無關,因此
Lreg∝(xg?xe)22σ2+12log?(σ2)L_{r e g} \propto \frac{\left(x_{g}-x_{e}\right)^{2}}{2 \sigma^{2}}+\frac{1}{2} \log \left(\sigma^{2}\right) Lreg?∝2σ2(xg??xe?)2?+21?log(σ2)
由于 σ\sigmaσ 位于分母,為了防止梯度爆炸,網絡預測 α=log(σ2)\alpha=log(\sigma^2)α=log(σ2) 代替直接預測 σ\sigmaσ。
Lreg∝e?α2(xg?xe)2+12αL_{r e g} \propto \frac{e^{-\alpha}}{2}\left(x_{g}-x_{e}\right)^{2}+\frac{1}{2} \alpha Lreg?∝2e?α?(xg??xe?)2+21?α
對于 ∣xg?xe∣>1|x_g-x_e|>1∣xg??xe?∣>1 使用類似于 smoothL1smooth~L_1smooth?L1? 損失。
Lreg=e?α(∣xg?xe∣?12)+12αL_{r e g}=e^{-\alpha}\left(\left|x_{g}-x_{e}\right|-\frac{1}{2}\right)+\frac{1}{2} \alpha Lreg?=e?α(∣xg??xe?∣?21?)+21?α
方差投票
獲取預測框位置方差后,根據相鄰邊界框位置方差來對候選框投票。softer?NMSsofter-NMSsofter?NMS 算法如下。
位置更新規則如下:
pi=e?(1?IoU(bi,b))2/σtx=∑ipixi/σx,i2∑ipi/σx,i2subject?to?IoU?(bi,b)>0\begin{aligned} p_{i} &=e^{-\left(1-I o U\left(b_{i}, b\right)\right)^{2} / \sigma_{t}} \\ x &=\frac{\sum_{i} p_{i} x_{i} / \sigma_{x, i}^{2}}{\sum_{i} p_{i} / \sigma_{x, i}^{2}} \\ & \text { subject to } \operatorname{IoU}\left(b_{i}, b\right)>0 \end{aligned} pi?x?=e?(1?IoU(bi?,b))2/σt?=∑i?pi?/σx,i2?∑i?pi?xi?/σx,i2???subject?to?IoU(bi?,b)>0?
通過分析發現,有兩類鄰近框權重較低:
由于分類分數較低的框可能有較高的位置置信度,因此分類置信度不參與位置投票。
4、總結
本文主要介紹了 NMSNMSNMS、Soft?NMSSoft-NMSSoft?NMS 和 Softer?NMSSofter-NMSSofter?NMS 算法,及其主要改進的方向。
總結
以上是生活随笔為你收集整理的目标检测(后处理):从 NMS 到 Soft-NMS 到 Softer NMS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 活动投骰子
- 下一篇: Unity开发之-Unity入门简介(近