后处理方法NMS、Soft-NMS、Softer-NMS、WBC、DIoUNMS 、NMS替代算法Confluence
1、 NMS
非最大抑制(NMS)主要用于基于深度學習的目標檢測模型輸出的后處理,從而去除冗余的檢測框,獲得正確的檢測結果。
算法流程:
將網絡輸出框集合B按照置信度分數S從高到低的順序排序,定義D為最終檢測框集合,Nt 為 NMS 閾值。
當B不為空集時:
①m為置信度分數最高的框,將m放入D,并將它從B中刪除
②對于B中余下的每個框bi:
如果 iou(m,bi)≥Ntiou(m,bi)≥N_tiou(m,bi)≥Nt?,則將bi從B中刪除返回檢測結果D
通過分析可以發現NMS存在以下幾個缺陷:
①稠密場景下漏檢多:如下圖1所示,當兩個目標距離較近存在部分重疊時,置信度較小的目標漏檢的可能性較大。
②NMS 默認置信度分數較高的框,定位更精確,由于分類和回歸任務沒有直接相關性,因此這個條件并不總是成立。比如圖2中,置信度分數高的邊界框并不總是比置信度低的框更可靠
圖2的(a)中兩個邊界框位置都不夠精確;(b)中置信度較高的邊界框的左邊界精確度較低
③Ground Truth 的標注可能并不可靠
python代碼:
2、 Soft-NMS
針對NMS存在的第一個問題,通過分析發現主要是因為在NMS算法中每次直接將與m的iou大于等于NtN_tNt?的檢測框直接刪除導致的。因此基于NMS算法,Soft?NMS進行了如下改進:
將于m重疊的檢測框置信度降低,而不是直接刪除。
這樣可能存在另一個問題,同一目標的其他檢測框也可能被保留下來。因此需要設計合適的策略,既保留相近的其他目標,又刪除重復檢測的目標。直覺上可以發現通常重復的檢測框具有更高的重疊,因此可以根據iou大小來設計置信度分數下降的程度。置信度修正策略如下:
該策略為iou的線性函數,同樣可以使用高斯懲罰函數,將當前檢測框得分乘以一個權重函數,該函數會衰減與最高得分檢測框M有重疊的相鄰檢測框分數,越是與M框高度重疊的檢測框,其得分衰減越嚴重,為此我們選擇高斯函數為權重函數,從而修改其刪除檢測框的規則。
算法流程如下圖所示:
紅色框中的代碼是 NMS 的方法,綠色框中的代碼為 Soft-NMS 的實現—NMS等價于Soft-NMS的特殊情況(使用0/1懲罰項代替線性或高斯懲罰函數)
python 代碼:
算法時間復雜度:O(n2),其中n為待篩選檢測框數量。
注意:
通過對比可以看出,原始NMS與Soft?NMS算法中的模式3等價,也就是說,刪除iou過高的重疊框等價于將該重疊框置信度分數置0。
3、 Softer-NMS
Soft?NMS只解決了三個問題中的第一個問題。對于第二個問題,分類置信度分數和框的iou不是強相關,因此需要一種新的方法來衡量框的位置置信度。
其中θθθ為可學習參數的集合,xex_exe?為被估計的邊界框位置。標準差σσσ衡量預測的不確定性,當σ→0σ→0σ→0 時,表示網絡對預測的位置的置信度很高。
GT符合delta分布,即邊界框置信度也可以使用高斯分布來表示,符合當σ→0σ→0σ→0 時,變成 Dirac delta函數:
PD(x)=δ(x?xg)P_D (x)=δ(x-x_g)PD?(x)=δ(x?xg?)
其中,xgx_gxg?為GT邊界框位置。
KL 損失函數:
用于具有定位置信度(localization confidence)的訓練檢測網絡
目標定位的目標是估計參數θ ^,使N個樣本的Pθ(x)P_θ(x)Pθ?(x)和PD(x)P_D(x)PD?(x)之間的KL散度最小。
使用KL散度作為回歸損失函數,對于單個樣本:
分析可知,當xex_exe?預測不準確時,網絡預測更大的網絡預測更大的σ2σ^2σ2使LregL_{reg}Lreg?更小。log(2π/2)log(2π/2)log(2π/2)和 H(PD(x))H(P_D(x))H(PD?(x))與估計參數θ無關,因此
灰色曲線為估計的分布,橙色曲線為GT的Dirac delta分布。當位置xex_exe?估計不準確時,網絡預測更大σ2σ^2σ2的使LregL_{reg}Lreg?更小,藍色曲線。
由于σσσ位于分母,為了防止梯度爆炸,網絡預測 α=log(σ2)α=log(σ^2)α=log(σ2)代替直接預測σσσ。
對于∣xg?xe∣>1∣x_g?x_e∣>1∣xg??xe?∣>1使用類似于 smooth L1損失
方差投票
獲取預測框位置方差后,根據相鄰邊界框位置方差來對候選框投票。softer?NMS算法如下
藍色和綠色分別為 Soft?NMS和 Softer?NMS
位置更新規則如下:
Subject to IoU(bi,b)>0IoU(b_i,b)>0IoU(bi?,b)>0
通過分析發現,有兩類鄰近框權重較低:
① 位置方差較大的檢測框
② 和選中框的iou小的框
由于分類分數較低的框可能有較高的位置置信度,因此分類置信度不參與位置投票。
NMS 主要用于去除重復的檢測框。
Soft?NMS在NMS的基礎上,不再直接去除重疊較高的檢測框,而是將重疊的檢測框的分類置信度分數降低。最終去除重復的檢測框,而保留存在一定程度重疊的不同目標的檢測框,該方法比較適用于稠密目標的檢測。
在前兩者的基礎上,Softer?NMS算法對檢測框的位置概率分布進行建模。對于重疊的檢測框,根據重疊程度和位置不確定性進行投票,重疊程度高,位置分布方差小的檢測框權重大,從而獲得更精確的檢測框。
4、 各種nms特點一句話總結:
nms的應用范圍:只應用在前向推理的過程中,在訓練中不進行此步。
pytorch源碼:
https://blog.csdn.net/qq_33270279/article/details/103721790
文本檢測類NMS見:
https://blog.csdn.net/xu_fu_yong/article/details/93180685
5、WBC(Weighted Box Clustering)
WBC,加權框聚類,是在Retina U-Net這篇論文中提出的一種對檢測后冗余bbox進行后處理算法,也是用來刪除冗余的bbox的。由于醫學圖像的高分辨率及3D成像(MRI),需要對patch crops進行訓練,從而需要在可用GPU內存限制與batch size和patch size之間權衡。
為了合并對目標檢測的預測結果,作者提出了weighted box clustering(WBC),加權框聚類:這個算法與非極大值抑制算法(NMS)類似,根據IoU閾值進行聚類的預測,而非選擇得分最高的候選框。
WBC的計算
這個算法與非極大值抑制算法(NMS)類似,根據IoU閾值進行聚類的預測。
其計算公式如下:
其中,oso_sos?表示每個預測框的加權置信分數,oco_coc?表示每個坐標的加權平均值,i是聚類的下標,s是置信度分數,c是坐標。
www是加權因子,包含:
重疊因子fff:預測框與得分最高的框(softmax confidence)之間的重疊權重。
區域aaa:表明較大的框有較高的權重。
patch中心因子ppp:以patch中心的正態分布密度分配分數。
而對于nmissing,如下圖
Prediction1、2、3是對同一張圖的三張預測圖,1中有兩個框,相對來說,2、3中就missing了兩個框,所以nmissing=2n_{missing}=2nmissing?=2。
WBC的代碼實現(來自Retina U-Net)
import numpy as npdef weighted_box_clustering(dets, box_patch_id, thresh, n_ens):#2Ddim = 2 if dets.shape[1] == 7 else 3y1 = dets[:, 0]x1 = dets[:, 1]y2 = dets[:, 2]x2 = dets[:, 3]scores = dets[:, -3]box_pc_facts = dets[:, -2]box_n_ovs = dets[:, -1]#計算每個檢測框的面積areas = (y2 - y1 + 1) * (x2 - x1 + 1)#3Dif dim == 3:z1 = dets[:, 4]z2 = dets[:, 5]areas *= (z2 - z1 + 1)#按照每個框的得分(score)降序排序order = scores.argsort()[::-1]keep = [] #保留最后留下的bbox集合keep_scores = [] #保留最后留下的bbox的置信度集合keep_coords = [] #保留最后留下的bbox的坐標信息集合while order.size > 0:i = order[0] #置信度最高的bbox的index#得到重疊區域#選擇大于x1,y1和小于x2,y2的區域xx1 = np.maximum(x1[i], x1[order])yy1 = np.maximum(y1[i], y1[order])xx2 = np.minimum(x2[i], x2[order])yy2 = np.minimum(y2[i], y2[order])#計算重疊面積,不重疊時面積為0w = np.maximum(0.0, xx2 - xx1 + 1)h = np.maximum(0.0, yy2 - yy1 + 1)inter = w * h#3Dif dim == 3:zz1 = np.maximum(z1[i], z1[order])zz2 = np.minimum(z2[i], z2[order])d = np.maximum(0.0, zz2 - zz1 + 1)inter *= d#計算IoU=重疊面積/(面積1+面積2-重疊面積)ovr = inter / (areas[i] + areas[order] - inter)#獲取與當前框匹配的所有預測以構建一個聚類(cluster)matches = np.argwhere(ovr > thresh)match_n_ovs = box_n_ovs[order[matches]]match_pc_facts = box_pc_facts[order[matches]]match_patch_id = box_patch_id[order[matches]]match_ov_facts = ovr[matches]match_areas = areas[order[matches]]match_scores = scores[order[matches]]#通過patch因子和大小對cluster中的所有分數進行加權match_score_weights = match_ov_facts * match_areas * match_pc_factsmatch_scores *= match_score_weights#對于權重平均值,分數必須除以當前cluster位置的預期總數。預計每個patch預測1次。因此,整體模型的數量乘以該位置處的patches的平均重疊(cluster的框可能部分位于不同重疊的區域中)。n_expected_preds = n_ens * np.mean(match_n_ovs)#獲得缺失預測的數量作為補丁的數量,其不對當前聚類(cluster)做出任何預測。n_missing_preds = np.max((0, n_expected_preds - np.unique(match_patch_id).shape[0]))#對misssing的預測給出平均權重(預期預測是cluster中所有預測的平均值)。denom = np.sum(match_score_weights) + n_missing_preds * np.mean(match_score_weights)#計算聚類(cluster)的加權平均分數avg_score = np.sum(match_scores) / denom#計算聚類(cluster)坐標的加權平均值?,F在只考慮現有的預測。avg_coords = [np.sum(y1[order[matches]] * match_scores) / np.sum(match_scores),np.sum(x1[order[matches]] * match_scores) / np.sum(match_scores),np.sum(y2[order[matches]] * match_scores) / np.sum(match_scores),np.sum(x2[order[matches]] * match_scores) / np.sum(match_scores)]if dim == 3:avg_coords.append(np.sum(z1[order[matches]] * match_scores) / np.sum(match_scores))avg_coords.append(np.sum(z2[order[matches]] * match_scores) / np.sum(match_scores))#由于大量的缺失預測,一些聚類的分數可能非常低。用較小的閾值過濾掉,以加快評估速度。if avg_score > 0.01:keep_scores.append(avg_score)keep_coords.append(avg_coords)#保留IoU小于所設定閾值的bboxinds = np.where(ovr <= thresh)[0]order = order[inds]return keep_scores, keep_coords6、DIoUNMS:
該NMS在DIoUloss一文中提出,在nms過程中采用DIoU的計算方式替換了IoU,由于DIoU的計算考慮到了兩框中心點位置的信息,故使用DIoU進行評判的nms效果更符合實際,效果更優。
7、Confluence
這種方法不是只依賴單個框的得分,也不依賴IoU去除冗余的框,它使用曼哈頓距離,在一個cluster中選取和其他框都是距離最近的那個框,然后去除那些附近的高重合的框。
Confluence是一個2階段的算法,它保留了最優邊界框,并消除了假陽性。第1階段使用置信加權曼哈頓距離來度量框之間的相關性,然后通過置信度加權,得到最優的那個框。第2階段涉通過和這個框的交匯程度來去掉其他的假陽框。
曼哈頓距離就是L1范數,就是所有點的水平和垂直距離的和,兩點之間的曼哈頓距離表示如下:
兩個框之間的接近程度可以表示為左上角點和右下角點的曼哈頓距離的和:
P越小表示交匯程度越高,P越大表示這兩個框越不可能表示同一個物體。對于一個cluster內的框,我們把具有最小簇內的P值的框作為最佳的檢測框。從圖1中可以看到,Confluence具有更好的魯棒性。
在實際使用中,由于框的尺寸不一,所以在用閾值來去除FP的時候,會對這個超參數閾值很敏感,所以需要對框進行歸一化,歸一化方法如下:
歸一化之后,使得簇內的框和簇外的框可以分的很開
所有的坐標歸一化到0~1之后,兩個有相交的框之間的接近度量會小于2,因此,只要兩個框之間的P值小于2,就屬于同一個cluster,一旦cluster確定了之后,就可以找到最優的簇內框。然后,設置一個閾值,所有和這個最優框的接近度小于這個閾值的框都會去掉,然后對所有的框重復這個操作。
NMS只考慮物體的置信度得分,而Confluence會同時考慮物體的置信度得分c和p值,然后得到一個加權的接近度:
算法流程如下:
1、對所有的類別進行遍歷。
2、得到對應類別的所有的檢測框。
3、計算對應類別的所有檢測框的兩兩接近度p,計算的時候使用坐標的歸一化。
4、遍歷對應類別中的每一個檢測框,對每個檢測框,把p值小于2的歸到一個簇里面,并計算對應的置信度加權接近度。
5、找到一個簇里面具有最小加權p值(最優)的那個框,找到之后,保存這個框,并且將其從總的框列表里刪除。
6、對于其他的所有的框,其接近度小于預設閾值的全部去除。
7、循環處理所有的框。
每個步驟的計算復雜度都為O(N),總的Confluence的復雜度為O(N2)O(N^2)O(N2)
代碼:https://github.com/Huangdebo/Confluence
參考博客:
https://www.freesion.com/article/9119880695/
https://blog.csdn.net/weixin_41665360/article/details/99818073
https://blog.csdn.net/qq_33270279/article/details/103721790
https://blog.csdn.net/qq_41084756/article/details/100600003
https://blog.csdn.net/qq_41084756/article/details/96735852
https://www.cnblogs.com/shuimuqingyang/p/14132070.html等
總結
以上是生活随笔為你收集整理的后处理方法NMS、Soft-NMS、Softer-NMS、WBC、DIoUNMS 、NMS替代算法Confluence的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 近期FTDI的FT232RL杀疯了,给大
- 下一篇: 目标检测中的NMS,soft NMS,s