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