日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人工智能 > 目标检测 >内容正文

目标检测

目标检测(后处理):从 NMS 到 Soft-NMS 到 Softer NMS

發(fā)布時間:2023/12/14 目标检测 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 目标检测(后处理):从 NMS 到 Soft-NMS 到 Softer NMS 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目標(biāo)檢測(后處理):從 NMS 到 Soft-NMS 到 Softer NMS

      • 1、NMS
      • 2、Soft-NMS
      • 3、Softer-NMS
      • 4、總結(jié)

1、NMS

非最大抑制(NMS)主要用于基于深度學(xué)習(xí)的目標(biāo)檢測模型輸出的后處理,從而去除冗余的檢測框,獲得正確的檢測結(jié)果。示意圖如下:

算法流程:

  • 將網(wǎng)絡(luò)輸出框集合 BBB 按照置信度分?jǐn)?shù) SSS 從高到低的順序排序,定義 DDD 為最終檢測框集合,NtN_tNt?NMSNMSNMS 閾值。
  • 當(dāng) BBB 不為空集時:
    • mmm 為置信度分?jǐn)?shù)最高的框,將 mmm 放入 DDD,并將它從 BBB 中刪除
    • 對于 BBB 中余下的每個框 bib_ibi?
      如果 iou(m,bi)≥Ntiou(m, b_i)\ge N_tiou(m,bi?)Nt?,則將 bib_ibi?BBB 中刪除
  • 返回檢測結(jié)果 DDD
  • 通過分析可以發(fā)現(xiàn) NMSNMSNMS 存在以下幾個缺陷:

  • 稠密場景下漏檢多:如下圖 111 所示,當(dāng)兩個目標(biāo)距離較近存在部分重疊時,置信度較小的目標(biāo)漏檢的可能性較大。
    圖 1: 紅色框的置信度比綠色框的置信度高,兩個框重疊較多,NMS 會將綠色框過濾
  • NMSNMSNMS 默認(rèn)置信度分?jǐn)?shù)較高的框,定位更精確,由于分類和回歸任務(wù)沒有直接相關(guān)性,因此這個條件并不總是成立。比如圖 222 中,置信度分?jǐn)?shù)高的邊界框并不總是比置信度低的框更可靠。
    圖 2: (a)(a)(a) 中兩個邊界框位置都不夠精確;(b)(b)(b) 中置信度較高的邊界框的左邊界精確度較低
  • GroundTruthGround~TruthGround?Truth 的標(biāo)注可能并不可靠。
    代碼:
  • import numpy as npdef nms(dets, Nt):x1 = dets[:,0]y1 = dets[:,1]x2 = dets[:,2]y2 = dets[:,3]scores = dets[:,4]order = scores.argsort()[::-1]#計算面積areas = (x2 - x1 + 1)*(y2 - y1 + 1)#保留最后需要保留的邊框的索引keep = []while order.size > 0:# order[0]是目前置信度最大的,肯定保留i = order[0]keep.append(i)#計算窗口i與其他窗口的交疊的面積xx1 = np.maximum(x1[i], x1[order[1:]])yy1 = np.maximum(y1[i], y1[order[1:]])xx2 = np.minimum(x2[i], x2[order[1:]])yy2 = np.minimum(y2[i], y2[order[1:]])#計算相交框的面積,不相交時用0代替w = np.maximum(0.0, xx2 - xx1 + 1)h = np.maximum(0.0, yy2 - yy1 + 1)inter = w * h#計算IOU:相交的面積/相并的面積ovr = inter / (areas[i] + areas[order[1:]] - inter)inds = np.where(ovr < thresh)[0]order = order[inds + 1]return keep# test if __name__ == "__main__":dets = np.array([[30, 20, 230, 200, 1],[50, 50, 260, 220, 0.9],[210, 30, 420, 5, 0.8],[430, 280, 460, 360, 0.7]])thresh = 0.35keep_dets = nms(dets, thresh)print(keep_dets)print(dets[keep_dets])

    時間復(fù)雜度:O(n2)O(n^2)O(n2),其中 nnn 為待篩選檢測框數(shù)量


    2、Soft-NMS

    針對 NMSNMSNMS 存在的第一個問題,通過分析發(fā)現(xiàn)主要是因為在 NMSNMSNMS 算法中每次直接將與 mmmiouiouiou 大于等于 NtN_tNt? 的檢測框直接刪除導(dǎo)致的。 因此基于 NMSNMSNMS 算法,Soft?NMSSoft-NMSSoft?NMS 進(jìn)行了如下改進(jìn):

    將于 mmm 重疊的檢測框置信度降低,而不是直接刪除。

    這樣可能存在另一個問題,同一目標(biāo)的其他檢測框也可能被保留下來。因此需要設(shè)計合適的策略,既保留相近的其他目標(biāo),又刪除重復(fù)檢測的目標(biāo)。直覺上可以發(fā)現(xiàn)通常重復(fù)的檢測框具有更高的重疊,因此可以根據(jù) iouiouiou 大小來設(shè)計置信度分?jǐn)?shù)下降的程度。置信度修正策略如下:
    si={si,iou?(M,bi)&lt;Ntsi(1?iou?(M,bi)),iou?(M,bi)≥Nts_{i}=\left\{\begin{array}{ll}{s_{i},} &amp; {\operatorname{iou}\left(\mathcal{M}, b_{i}\right)&lt;N_{t}} \\ {s_{i}\left(1-\operatorname{iou}\left(\mathcal{M}, b_{i}\right)\right),} &amp; {\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 的線性函數(shù),同樣可以使用高斯懲罰函數(shù)
    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
    算法流程如下圖所示:

    圖 3: 紅色框中的代碼是 NMS 的方法,綠色框中的代碼為 Soft-NMS 的實現(xiàn)—NMS等價于Soft-NMS的特殊情況(使用0/1懲罰項代替線性或高斯懲罰函數(shù))

    代碼:

    # -*- 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 坐標(biāo)矩陣 format [x1, y1, x2, y2, score]:param Nt: iou 交疊閾值:param sigma: 使用 gaussian 函數(shù)的方差:param thresh: 最后的分?jǐn)?shù)閾值: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

    算法時間復(fù)雜度:O(n2)O(n^2)O(n2),其中 nnn 為待篩選檢測框數(shù)量

    注意:

    通過對比可以看出,原始 NMSNMSNMSSoft?NMSSoft-NMSSoft?NMS 算法中的模式 333 等價,也就是說,刪除 iouiouiou 過高的重疊框等價于將該重疊框置信度分?jǐn)?shù)置 000 。


    3、Softer-NMS

    Soft?NMSSoft-NMSSoft?NMS 只解決了三個問題中的第一個問題。對于第二個問題,分類置信度分?jǐn)?shù)和框的 iouiouiou 不是強(qiáng)相關(guān),因此需要一種新的方法來衡量框的位置置信度。

    作者假設(shè)邊界框的 444 個坐標(biāo)值之間相互獨(dú)立,并使用單變量高斯分布來預(yù)測位置置信度。
    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Θ 為可學(xué)習(xí)參數(shù)的集合,xex_exe? 為被估計的邊界框位置。標(biāo)準(zhǔn)差 σ\sigmaσ 衡量預(yù)測的不確定性,當(dāng) σ→0\sigma \rightarrow0σ0 時,表示網(wǎng)絡(luò)對預(yù)測的位置的置信度很高。

    GTGTGT 邊界框置信度也可以使用高斯分布來表示,當(dāng) σ→0\sigma \rightarrow0σ0 時,變成 DiracdeltaDirac~deltaDirac?delta 函數(shù):
    PD(x)=δ(x?xg)P_{D}(x)=\delta\left(x-x_{g}\right) PD?(x)=δ(x?xg?)
    其中,xgx_gxg?GTGTGT 邊界框位置。


    KL 損失函數(shù)

    目標(biāo)定位的目標(biāo)是估計參數(shù) Θ^\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 散度作為回歸損失函數(shù),對于單個樣本:
    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} &amp;=D_{K L}\left(P_{D}(x) \| P_{\Theta}(x)\right) \\ &amp;=\int P_{D}(x) \log P_{D}(x) \mathrmozvdkddzhkzd x-\int P_{D}(x) \log P_{\Theta}(x) \mathrmozvdkddzhkzd x \\ &amp;=\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))?
    分析可知,當(dāng) xex_exe? 預(yù)測不準(zhǔn)確時,網(wǎng)絡(luò)預(yù)測更大的 σ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)) 與估計參數(shù) Θ\ThetaΘ 無關(guān),因此
    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)

    圖 4: 灰色曲線為估計的分布,橙色曲線為 GTGTGTDiracdeltaDirac~deltaDirac?delta 分布。當(dāng)位置 xex_exe? 估計不準(zhǔn)確時,網(wǎng)絡(luò)預(yù)測更大的 σ2\sigma^2σ2 使 LregL_{reg}Lreg? 更小,藍(lán)色曲線。

    由于 σ\sigmaσ 位于分母,為了防止梯度爆炸,網(wǎng)絡(luò)預(yù)測 α=log(σ2)\alpha=log(\sigma^2)α=log(σ2) 代替直接預(yù)測 σ\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∣&gt;1|x_g-x_e|&gt;1xg??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?α


    方差投票

    獲取預(yù)測框位置方差后,根據(jù)相鄰邊界框位置方差來對候選框投票。softer?NMSsofter-NMSsofter?NMS 算法如下。

    圖 5: Softer-NMS 算法。藍(lán)色和綠色分別為 Soft?NMSSoft-NMSSoft?NMSSofter?NMSSofter-NMSSofter?NMS
    位置更新規(guī)則如下:
    pi=e?(1?IoU(bi,b))2/σtx=∑ipixi/σx,i2∑ipi/σx,i2subject?to?IoU?(bi,b)&gt;0\begin{aligned} p_{i} &amp;=e^{-\left(1-I o U\left(b_{i}, b\right)\right)^{2} / \sigma_{t}} \\ x &amp;=\frac{\sum_{i} p_{i} x_{i} / \sigma_{x, i}^{2}}{\sum_{i} p_{i} / \sigma_{x, i}^{2}} \\ &amp; \text { subject to } \operatorname{IoU}\left(b_{i}, b\right)&gt;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?

    通過分析發(fā)現(xiàn),有兩類鄰近框權(quán)重較低:

  • 位置方差較大的檢測框
  • 和選中框的 iouiouiou 小的框
  • 由于分類分?jǐn)?shù)較低的框可能有較高的位置置信度,因此分類置信度不參與位置投票。


    4、總結(jié)

    本文主要介紹了 NMSNMSNMS、Soft?NMSSoft-NMSSoft?NMSSofter?NMSSofter-NMSSofter?NMS 算法,及其主要改進(jìn)的方向。

  • NMSNMSNMS 主要用于去除重復(fù)的檢測框。
  • Soft?NMSSoft-NMSSoft?NMSNMSNMSNMS 的基礎(chǔ)上,不再直接去除重疊較高的檢測框,而是將重疊的檢測框的分類置信度分?jǐn)?shù)降低。最終去除重復(fù)的檢測框,而保留存在一定程度重疊的不同目標(biāo)的檢測框,該方法比較適用于稠密目標(biāo)的檢測。
  • 在前兩者的基礎(chǔ)上,Softer?NMSSofter-NMSSofter?NMS 算法對檢測框的位置概率分布進(jìn)行建模。對于重疊的檢測框,根據(jù)重疊程度和位置不確定性進(jìn)行投票,重疊程度高,位置分布方差小的檢測框權(quán)重大,從而獲得更精確的檢測框。
  • 總結(jié)

    以上是生活随笔為你收集整理的目标检测(后处理):从 NMS 到 Soft-NMS 到 Softer NMS的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。