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代码:

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])

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 代码:

# -*- 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),其中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)坐标的加权平均值。现在只考虑现有的预测。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_coords

6、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相关推荐

  1. 卷积在计算机中实现+pool作用+数据预处理目的+特征归一化+理解BN+感受野理解与计算+梯度回传+NMS/soft NMS

    一.卷积在计算机中实现 1.卷积 将其存入内存当中再操作(按照"行先序"): 这样就造成混乱. 故需要im2col操作,将特征图转换成庞大的矩阵来进行卷积计算,利用矩阵加速来实现, ...

  2. 《一文搞懂NMS发展历程》Soft-NMS、Weighted NMS、IoU-Net、Softer-NMS、Adaptive NMS、DIoU-NMS

    <一文搞懂NMS发展历程>Soft-NMS.Weighted NMS.IoU-Net.Softer-NMS.Adaptive NMS.DIoU-NMS 文章目录 <一文搞懂NMS发展 ...

  3. 【论文解读】Confluence:物体检测中不依赖IoU的NMS替代算法论文解析

    导读 基于IoU的NMS实际上是一种贪心算法,这种方法得到的结果往往不是最优的,Confluence给出了另一种选择. 论文地址:https://arxiv.org/abs/2012.00257 摘要 ...

  4. 《南溪的目标检测学习笔记》——后处理方法的学习笔记

    1 前言 后处理方法是很重要的,我在学习训练COCO数据集时深有体会,这里用笔记记录一下后处理的相关知识- 2 南溪使用的的后处理方法 南溪使用后处理操作流程: 阈值过滤(低阈值去框,提速nms)→\ ...

  5. CT 三维重建的后处理方法

    原文地址:http://mp.weixin.qq.com/s/7E4n5iBQEQLagkrJ8TD5Rw CT 三维重建的后处理方法 相信各位同学在临床工作中,已经接触到很多CT三维重建的图像了,那 ...

  6. CT三维重建的六种基本后处理方法

    来源:<从医开始,协和八的奇妙临床笔记> 相信各位同学在临床工作中,已经接触到很多CT三维重建的图像了,那么CT三维重建到底是个啥东东? 这个问题要是从CT技术的角度去阐述,俩小时不一定讲 ...

  7. 网站被黑后处理方法及删除批量恶意代码的方法步骤

    网站被黑后处理方法及删除批量恶意代码的方法步骤 如果发现网站出现异常情况,如页面被修改.管理账号不能登录,则说明网站已经被入侵.这时就需要尽快进行处理,以防止黑客种植的网页病毒扩散. 暂时关闭网站 网 ...

  8. 创客集结号:3D打印模型有哪些后处理方法?

    作为第三次工业革命的重要标志,3D打印技术正在从根本上革新传统制造业的生产方式,并对当前我国产业发展和结构转型造成深刻影响.但是,目前很多人对这一技术的认知,与客观事实有所差距,尤其是在3D打印制品颜 ...

  9. Linux 服务器被黑后处理方法

    Linux 服务器被黑后处理方法 1.检查系统用户 # less /etc/passwd # grep :0: /etc/passwd(检查是否产生了新用户,和UID.GID是0的用户) # ls - ...

最新文章

  1. RF-LIO:面向高动态场景的紧耦合LiDAR惯导融合里程计(IROS 2021)
  2. [刷题]算法竞赛入门经典 3-10/UVa1587 3-11/UVa1588
  3. CentOS 6.3编译安装Nginx1.2.2+MySQL5.5.25a+PHP5.4.5
  4. jQuery Layer 弹层组件
  5. 老信贷总结:贷款催收技巧和注意事项
  6. Poj 3246 Balanced Lineup(线段树基础)
  7. Haar特征原理与icvCreateIntHaarFeatures方法的具体实现附详细注释—— 人脸识别的尝试系列(二)
  8. java thread.notify_Java Thread notify()方法
  9. 解决BLOB/TEXT column can‘t have a default value query问题
  10. 【问题记录】mysql设置任意ip访问
  11. php判断平板,一种 PHP 判断设备是否是手机/平板的方法
  12. N56vz难以关闭触摸板的问题(转载)
  13. 机器学习-推荐系统中基于深度学习的混合协同过滤模型
  14. Silvaco TCAD仿真4——设计一个元件nmos(Atlas)
  15. vue实现预览pdf组件(vue-pdf插件使用)
  16. u-boot编译构成之 MLO(1)
  17. powerha_在IBM PowerHA集群环境中实现存储数据的服务器端缓存
  18. Notepad++增加读取二进制文件的功能——HexEditor的所有
  19. 在PS中多种类抠图的教程(第一课)后附PS软件可下载
  20. 计算机教案在幻灯片中插入影片,小学六年级上册《在作品中插入“电影”片段》信息技术教案...

热门文章

  1. 【历史上的今天】10 月 26 日:NetBSD 系统发布;Windows 8 诞生;微软推出 Surface 系列
  2. HDU 5514Frogs
  3. 解决对路径bin\roslyn..的访问被拒绝
  4. Microsoft Dynamics 365 (on-premises) Update 2.12
  5. 苹果遭遇史上最严厉的泄密:自家的iOS源代码居然泄漏了
  6. Day02 - CSS
  7. Element文件上传-解决跨域
  8. 【解决方法】友盟分享 已安装QQ,但总提示“没有安装手机QQ客户端”
  9. 恐惧贪婪指数(Fear Greed Index)
  10. python算法习题(十):木材加工